最完整版的element分页实现管理

==记录一下踩坑日常:
这次使用的是前端Vue的element分页组件:
1:分页
2:跳转指定页码
3:更改每页数据条数
4:点进详情页返回原页码(改变每页条数也返回原界面)

      <el-pagination class="mpage" :model="current" ref="current"
                     background
                     @size-change="handleSizeChange"
                     @current-change="page"
                     :current-page="current.currentPage"
                     :page-sizes="[10, 20, 50]"
                     :page-size="current.pageSize"
                     layout="total, sizes, prev, pager, next, jumper"
                     :total="current.total">
      </el-pagination>

在界面上添加分页样式组件,这个在element官网上有的。
这里自己设置了三个每页条数规格的下拉框
在这里插入图片描述然后设置数据分页默认值:

  data() {
    return {
      current: {
        //默认
        currentPage: 1,//页码
        val: 10,//多少条/每页
        total: 0,//总共多少条
        pageSize: 10//每页多少条数据
      },
      BBS: {}
    }
  },

添加page方法,再在自动加载里面添加this.page(1)方法。

    page(value) {
      const _this = this
      this.current.currentPage = value

      _this.$axios.post("/bbs/bbs", this.current, {
        headers: {
          "Authorization": localStorage.getItem("token")
        }
      }).then(res => {
        // _this.$axios.get("/bbs/bbs?currentPage=" + currentPage).then(res => {
        // console.log(res)
        //将页码储存在session中,方便点击详情页后返回在原来页码
        _this.$store.commit("SET_PAGENUMBER", this.current)

        _this.BBS = res.data.data.records
        _this.current.currentPage = res.data.data.current
        _this.current.total = res.data.data.total
        // _this.current.pageSize = res.data.data.size
      })
    }

这里传的value是获取的当前页码,然后调用后端接口:

    //分页处理
//    @RequiresAuthentication
    @PostMapping("/bbs")
    public Result list(@Validated @RequestBody Object object) {
        Map<String, Integer> re = (Map<String, Integer>) object;
        Integer currentPage = Integer.valueOf(re.get("currentPage"));
        Integer val = Integer.valueOf(re.get("val"));

        Page page = new Page(currentPage, val);
        IPage pageData = bbsService.page(page, new QueryWrapper<Bbs>().orderByDesc("id"));

        return Result.succ(pageData);
    }

将获取到的数据倒序排列然后返回给页面,这样一个基本的分页就实现了。

    // 更改每页显示条数
    handleSizeChange(val) {
      const _this = this
      this.current.val = val;//获取page-sizes里的每页显示几条数据的值,赋给我们自定义的每页显示数量的变量pageNum
      this.current.pageSize = val //更新每页条数数据
      // console.log(`每页 ${val} 条`);
      console.log("this.current==" + JSON.stringify(this.current))
      _this.$axios.post("/bbs/bbs", this.current, {
        headers: {
          "Authorization": localStorage.getItem("token")
        }
      }).then(res => {
        // _this.$axios.get("/bbs/bbs?currentPage=" + currentPage).then(res => {
        // console.log(res)

        _this.$store.commit("SET_PAGENUMBER", this.current)

        _this.BBS = res.data.data.records
        _this.current.currentPage = res.data.data.current
        _this.current.total = res.data.data.total
        // _this.current.pageSize = res.data.data.size
      })
    },

然后在methods中添加handleSizeChange方法,val是获取当前页面选择的每页条数,如果不自己定义,他的默认值是
在这里插入图片描述
这里我们自定义三个就可以了,this.current.pageSize = val这条记得要添加上去!!因为我们点进数据详情页面后返回回来如果没有这条的话,他只记住了页码,并不能完全达到我们的期望效果,如果我们选择十条每页,就发现不了这个问题,如果选择二十条每页,在页码2,那么返回回来就是十条每页的页码2,与我们期望不符。
_this.$store.commit(“SET_PAGENUMBER”, this.current)
这里我们是把分页数据储存在session中,返回页面时再去取出来,以达到返回依旧在原界面的效果。
这是在store的index中自定义的:

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
    state: {
        token: '',
        userInfo: JSON.parse(sessionStorage.getItem("userInfo")),
        pageNumber: JSON.parse(sessionStorage.getItem("pageNumber"))
    },
    mutations: {
        // set
        SET_TOKEN: (state, token) => {
            // console.log("token=="+token)
            state.token = token
            // console.log("state=="+JSON.stringify(state))
            localStorage.setItem("token", token)
            // console.log("localStorage"+JSON.stringify(localStorage))
        },
        SET_USERINFO: (state, userInfo) => {
            state.userInfo = userInfo
            sessionStorage.setItem("userInfo", JSON.stringify(userInfo))
        },
        REMOVE_INFO: (state) => {
            state.token = ''
            state.userInfo = {}
            localStorage.setItem("token", '')
            sessionStorage.setItem("userInfo", JSON.stringify(''))
        },
        SET_PAGENUMBER: (state, pageNumber) => {
            state.pageNumber = pageNumber
            sessionStorage.setItem("pageNumber", JSON.stringify(pageNumber))
        }
    },
    getters: {
        // get
        getUser: state => {
            return state.userInfo
        },
        getUsers: state => {
            return state.token
        },
        getPage: state => {
            return state.pageNumber
        }

    },
    actions: {},
    modules: {}
})

在这里插入图片描述
再在created中添加自动加载方法定义:

  created() {
    const pageNumber = localStorage.getItem("pageNumber")
    // 判断是否第一次进去页面
    if (pageNumber){
      const pageNum = JSON.parse(sessionStorage.pageNumber).currentPage
      const pageVal = JSON.parse(sessionStorage.pageNumber).val
      this.current.val = pageVal
      this.current.pageSize = JSON.parse(sessionStorage.pageNumber).pageSize
      this.page(pageNum)
      this.handleSizeChange(pageVal)
    }else {
      this.page(1)
    }
  }

这样就完成了无论我们选择每页多少条数据进入详情页返回依旧是原来的模样了。应该是比较完整的一块分页管理了。

因为element-ui中分页组件分为两种:默认分页和带有背景色的分页,因此需要选择一种并提供更具体的描述。下面我们以默认分页组件为例,给出完整的vue2版本分页组件的代码以及注释。 ``` <template> <el-pagination :total="total" // 总页数 :page-size="pageSize" // 每页显示的条数 :current-page="currentPage" // 当前页码 :layout="layout" // 分页组件的布局,分别为 total, sizes, prev, pager, next, jumper,使用逗号分隔 :pager-count="pagerCount" // 页码按钮的数量 :prev-text="`上一页`" // 上一页显示的文字 :next-text="`下一页`" // 下一页显示的文字 @size-change="handleSizeChange" // 当每页条数改变时触发 @current-change="handleCurrentChange" // 当前页码改变时触发 class="pagination" :disabled="disabled" /> </template> <script> export default { name: 'MyPagination', // 组件名称 props: { total: { // 总页数 type: Number, default: 0 }, pageSize: { // 每页显示的条数 type: Number, default: 10 }, currentPage: { // 当前页 type: Number, default: 1 }, disabled: { // 是否禁用 type: Boolean, default: false }, pagerCount: { // 页码按钮的数量 type: Number, default: 7 }, layout: { // 分页组件的布局 type: String, default: 'total,sizes,prev,pager,next,jumper' } }, methods: { handleSizeChange(pageSize) { // 每页条数改变时触发 this.$emit('size-change', pageSize) }, handleCurrentChange(currentPage) { // 当前页数改变时触发 this.$emit('current-change', currentPage) } } } </script> <style scoped> .pagination { display: flex; justify-content: center; } </style> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值