前端Vue分页及后端PageHelper分页综合运用

article/2025/10/22 12:54:57

  分页显示数据对项目开发中尤为重要,同时能提升用户体验,下面的前端css、js是我引用这篇文章的《使用Vue开发一个分页插件》,我在这个的基础上结合了后端稍微完善了一下,修改了disable的样式,在里面加了pointer-events: none;来防止在首尾页处点击事件仍然生效。

1、前端

  前端使用了vue全局组件的方式做了一个分页的导航栏,总体有四个部分(css样式、js文件写的Vue全局组件、html及html中的vue代码)

  样式:page-nav.css

div.page-nav{font-size: 12px;font-family:'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;color: #666;user-select: none;
}
div.page-nav ul{padding: 0;margin:0;
}
div.page-nav ul li{display: inline-block;min-width:30px;min-height:30px;border-radius:3px;line-height: 30px;text-align: center;margin: 0 6px;cursor: pointer;
}
div.page-nav ul li.active{background: #1796e0;color:#fff;
}
div.page-nav ul li.disable{color: #ccc;pointer-events: none;
}

  page-nav.js

Vue.component('page-nav',{props:{total:{type:[Number,String],default:0},pagesize:{type:[Number,String],default:1},page:{type:[Number,String],default:1}},template:'<div class="page-nav">'+'<ul>'+'<li :class="page==1?\'disable\':\'\'" @click="prev">上一页</li>'+'<li :class="page==1?\'disable\':\'\'" @click="toFirst">首页</li>'+'<li v-for="item in list"  :class="[item==page?\'active\':\'\']" @click="handleClick">'+'{{item}}'+'</li>'+'<li :class="page==totalCount?\'disable\':\'\'" @click="toEnd">尾页</li>'+'<li :class="page==totalCount?\'disable\':\'\'" @click="next">下一页</li>'+'<li>总共{{totalCount}}页</li>'+'</ul>'+'</div>',data(){return {totalCount:0      //总页数}},computed:{list(){let list=[];//计算总页数this.totalCount=this.total/this.pagesize;//超限控制if(this.page<=0){this.page=1;}if(this.page>=this.totalCount){this.page=this.totalCount;}//计算显示页码if(this.totalCount>5){if(this.page>2&&this.page<this.totalCount-2){list=[this.page-2,this.page-1,this.page,this.page+1,this.page+2];}else if(this.page<=2&&this.page>0){for(let i=1;i<=5;i++){list.push(i);}}else if(this.page>=this.totalCount-2&&this.page<=this.totalCount){for(let i=4;i>=0;i--){list.push(this.totalCount-i);}}}else{for(let i = 1;i<=this.totalCount;i++){list.push(i);}}return list;}},methods:{//页码点击事件handleClick(e){let page=parseInt(e.target.innerText);let {count,total }=this;this.$emit('pagechange',{page,count,total});},//前一页prev(e){if(!e.target.classList.contains['disable']){this.page>1&&this.page--;let {page,count,total }=this;this.$emit('pagechange',{page,count,total});}},//下一页next(e){if(!e.target.classList.contains['disable']){this.page<this.totalCount&&this.page++;let {page,pagesize,total }=this;this.$emit('pagechange',{page,pagesize,total});}},//首页toFirst(){let {page,pagesize,total }=this;this.$emit('pagechange',{page:1, pagesize, total});},//尾页toEnd(){let {page,pagesize,total }=this;this.$emit('pagechange',{page:this.totalCount, pagesize, total});}}
});

  html:

<div v-if="users != null"><page-nav :page="startPage" :pagesize="pageSize" :total="total" @pageChange="pageChange"></page-nav>
</div>

  html中部分vue代码:

    new Vue({el: '#app',data() {return {url: 'http://localhost:8080/',users: null,user: {id: null,name: '',age: null,sex: ''},startPage: 1,pageSize: 5,total: 30,isSearch: false}},methods: {queryUser: function () {var _this = this;axios.get(_this.url + 'queryUser', {params: {// 这里我把无条件查找和条件查找放一起了,所以这里传一个对象到后端,这句无关紧要user: JSON.stringify(_this.user),// 传起始页跟页面大小到后端startPage: _this.startPage,pageSize: _this.pageSize}}).then(function (response) {// 获取回传的user列表_this.users = response.data.users.list;// 我在后台传了一个msg_this.msg = response.data.msg;// 总记录数(用了pageHelper后在返回的response中包含了记录数信息:total)_this.total = response.data.users.total;console.log(response);}).catch(function (err) {console.log(err);})},pageChange(e) { // 点击上一页下一页时改变分页导航的样式,同时查询下一条记录this.page = e.page;this.startPage = this.page;this.queryUser();}},created() {this.queryUser();}});

  效果:
在这里插入图片描述

  注:在不知道参数怎么获取时可以打开控制台,在控制台的打印信息即可看到,如下

在这里插入图片描述


2、后端

  上面前端的代码就写完了,接下来是后端的代码,这里我是用了SpringBoot来写的。

  首先是Controller(控制层),参数是前端传过来的对象Json字符串、起始页及页面大小,返回值是Map(我在实现层ServiceImpl中用了Map来存储要返回前端的数据信息)

import com.exam.yezhihu.service.impl.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.Map;/*** @Author: yzh* @Description:* @Date: 2020/9/6 13:17* @Version: 1.0*/
@RestController
public class UserController {@AutowiredUserServiceImpl userService;@RequestMapping("queryUser")public Map queryUser(@RequestParam("user") String userJson, @RequestParam("startPage") Integer startPage, @RequestParam("pageSize") Integer pageSize) {return userService.queryUser(userJson, startPage, pageSize);}
}

  下面是ServiceImpl(业务实现层)

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.exam.yezhihu.bean.UserBean;
import com.exam.yezhihu.mapper.UserMapper;
import com.exam.yezhihu.service.UserService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @Author: yzh* @Description:* @Date: 2020/9/6 12:49* @Version: 1.0*/
@Service
public class UserServiceImpl implements UserService {@AutowiredUserMapper userMapper;@Overridepublic Map queryUser(String userJson, Integer startPage, Integer pageSize) {Map info = new HashMap(2);// 将Json字符串通过fastjson转为JSONObject对象JSONObject jsonObject = JSONObject.parseObject(userJson);// 将JSONObject对象转为StockMesBean实体对象UserBean user = JSON.toJavaObject(jsonObject, UserBean.class);// 设置起始页跟页面大小PageHelper.startPage(startPage, pageSize);// 查询的方法一定要紧跟PageHelper.startPage,否则可能会出现一些错误List<UserBean> users = userMapper.queryUser(user);// 将查到的信息转成PageInfo类型PageInfo<UserBean> userList = new PageInfo<>(users);if (users.size() == 0) {info.put("msg", false);info.put("users", null);} else {info.put("msg", true);// 返回的是PageInfo类型的user信息列表,这里就包含了刚刚在浏览器控制台看到的lastPage等信息info.put("users", userList);}return info;}
}

  至于Mapper层就是数据访问了,这里就是定义一个接口,在Mapper.xml中查询数据库的数据而已,就不多写了,以上就是前后端实现分页的方法,其实方法不止这一种,在控制台打印的数据我们可以看到,后端传到前端的参数还有是否为第一页(最后一页)、是否存在上一页(下一页),我们还可以通过这些参数来判断并对分页的导航栏进行动态控制。


http://chatgpt.dhexx.cn/article/0oxDw9nN.shtml

相关文章

antd design vue分页组件

我们在使用分页组件的时候可以有两种方法&#xff1a; 第一种是直接用表格()的自定义:pagination属性最方便&#xff1b;如下图所示&#xff1a; 第二种是分页组件 这里我总结的是第二种方法的使用&#xff0c;由于是 Ant Design Vue 的组件&#xff0c;所以必须安装Ant Desig…

Vue分页页码栏设计

Vue分页页码栏设计 效果展示HTML数据需要函数需要运用 效果展示 HTML <div class"page_bar no-select"><ul class"clearfix"><li class"iconfont":class"{vh : currentPage 1}"click"subCurrentPage">&…

超级详细:一个漂亮的Vue分页器组件的实现

整篇分两个部分&#xff1a; 思路部分&#xff1a;讲解怎么实现分页器组件【大把时间看-建议】 后面部分&#xff1a;按照步骤&#xff0c;直接引入组件【没有时间看-建议】 思路&#xff1a;基于连续页码进行判断 需要添加分页器的组件&#xff08;Search组件&#xff09;中…

vue实现分页vue分页查询怎么实现

效果图&#xff1a; 代码&#xff1a; 复制过去即可运行 <!DOCTYPE html> <html lang"en" xmlns:th"http://www.w3.org/1999/xhtml"> <head><meta charset"UTF-8"><title>Title</title><!-- <scrip…

vue分页单位设置为中文格式

根据我搭建前端项目时遇到的问题做一个记录&#xff0c;我下载了一个vue-element-admin前端项目demo&#xff0c;但是默认情况下此demo分页展示时为如下图所示&#xff1a; 遇到此种情况想要调整为中文显示时&#xff0c;如下中文显示案例&#xff1a; 此时需要修改demo项目中…

vue分页器的封装

1.需要注册为全局组件 //main.js // 封装分页器为全局组件 Vue.component(Pagination.name,Pagination); 2.父组件的使用分页器&#xff0c;需要传递相应的参数和自定义事件 <Pagination :pageNo"searchParam.pageNo" :pageSize"searchParam.pageSize"…

django与vue分页

后端django进行自定义分页 1.编写自定义配置文件 from rest_framework.pagination import LimitOffsetPaginationclass LimitPagination(LimitOffsetPagination):max_limit 2 # 最大limit限制&#xff0c;默认Nonedefault_limit 2 # 默认限制&#xff0c;和page_size作用…

Django+vue 分页展示

这里提供两种分页方法 一种是手写分页,不常用,但是明白一下分页的逻辑实现 第二种是用heyui提供的组件.很多功能都给封装好了,用起来也比较美观. 手写分页 后端接口 class GoodList(APIView):def get(self, request):# 当前页page int(request.GET.get(page, 1))# 一页有多…

Vue分页及页码跳转

效果如下&#xff1a; HTML&#xff1a; <ul class"page f16 tc mt30"> <li> <span v-if"page > 1"><b click"page--,pageClick()">上一页</b></span> <span v-if"page 1">上一页<…

VUE分页出现省略号

VUE分页出现省略号 废话不多说直接上代码 calcPageNum() {let pageTotal Math.ceil(this.total / this.limit); //获取最大页码数let cur this.currentPage;//获取当前页码数if (pageTotal < 7) {//判断什么时候正常显示return Math.ceil(this.total / this.limit);} els…

vue 分页表格数据导出

vue分页表格数据导出功能&#xff0c;超简单&#xff01;不用安装不用引入 写个方法即可实现 //导出exportExcel() {let url "/VueDemo/api/record/export.htm"; //这里写后台给的接口&#xff0c;注意反向代理也要写上&#xff01;VueDemo是我这边的反向代理url …

vue分页功能Bug

今天分页功能报错了&#xff0c;报错是这样报错的 看代码 <pagination v-show"adminTotal>0":total"adminTotal":page.sync"adminParams.pageNum":limit.sync"adminParams.pageSize"pagination"getAdminListPage" /&…

vue 分页

分页效果实现 思路&#xff1a; 1.每页显示的数量 2.当前页数 3,总页数 , 总页数放在computed中计算 放在页面 splice截取数组元素 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport&qu…

vue分页列表

html部分 css部分 js部分

Vue 怎样实现分页功能

文章目录 数据获取分页器实现页面渲染总结 Vue是一款流行的前端框架&#xff0c;它提供了丰富的API和组件&#xff0c;可以帮助开发者快速地构建现代化的Web应用程序。在Web应用程序中&#xff0c;分页功能是一个非常常见的需求&#xff0c;它可以帮助用户快速地浏览和查找大量…

使用vue实现分页

效果如上图&#xff0c;第一页显示5行数据 HTML代码如下 <footer class"col-sm-12 footerbox navbar-fixed-bottom"><div class"row"><div class"col-sm-12"><a class"btn btn-default" href"#" role…

【VUE项目实战】24、分页效果实现

接上篇《23、改造状态列的显示效果》 上一篇我们实现了状态列的显示效果以及插槽形式定义操作列的渲染&#xff0c;本篇我们来实现用户列表的分页效果。我们要在用户数据列表的左下方加入一个分页组件&#xff1a; Element-UI为我们提供了“Pagination分页”组件&#xff0c;我…

计算机oj平台搭建应该学什么,青岛大学开源OJ平台搭建

源码地址为:https://github.com/QingdaoU/OnlineJudge 可参考的文档为:https://github.com/QingdaoU/OnlineJudgeDeploy/tree/2.0 一、安装所依赖的环境 sudo apt-get update && sudo apt-get install -y vim python-pip curl git sudo apt-get install docker-compose…

JavaWeb 项目 --- 在线 OJ 平台 (三)

文章目录 1. 设计网页页面1.1 列表页1.2 详情页 2. 设计网页的前后端交互接口约定交互1: 获取题目的列表约定交互2: 获取指定题目的详情信息约定交互3: 向服务器提交编写的代码 3. 服务器的API3.1 导入 JackSon 库3.2 创建 ProblemServlet 类3.3 测试 ProblemServlet 类3.4 创建…

华为oj题目c语言,【华为OJ平台习题】

【华为OJ平台练习题】 /* 描述: 输入整型数组和排序标识&#xff0c;对其元素按照升序或降序进行排序 接口说明 原型&#xff1a; void sortIntegerArray(Integer[] pIntegerArray, int iSortFlag); 输入参数&#xff1a; Integer[] pIntegerArray&#xff1a;整型数组 int iSo…