美文网首页
vue elementUI el-pagination控件添加首

vue elementUI el-pagination控件添加首

作者: 小于哥1008 | 来源:发表于2019-07-16 14:42 被阅读0次

elementUI 中el-pagination控件不能直接添加首页和尾页,但是el-pagination支持自定义内容,需要在 layout 中列出 slot,也就是通过插槽来扩展分页显示的内容,具体代码写法如下:

<el-pagination
      layout="slot, prev, pager, next, slot"
      :page-size="rows"
      :total="total"
      @current-change="handleCurrentChange"
      :current-page.sync="currentPage">
      <el-button :disabled="firstDisabled" @click="toFirstPage">首页</el-button>
      <el-button :disabled="isLastDisabled" @click="toLastPage">尾页</el-button>
    </el-pagination>

使用插槽来扩展添加首页和尾页的时候,会有如下问题:

  • 问题1:slot只支持一个,也就是说只能写一个,如果写多个slot的时候,都会以第一个控件来添加,也就是说上面的代码只能显示出两个首页,而无法显示出尾页,原因可以通过查看源代码来分析
slot: <my-slot></my-slot>

MySlot: {
  render(h) {
      return (
          this.$parent.$slots.default ? this.$parent.$slots.default[0] : ''
      );
  }
}

解决办法就是使用两个分页控件el-pagination来拼接处一个完成的分页功能,每个分页控件上写一个slot,代码如下:

    <div>
      <el-pagination
        layout="slot, prev, pager, next"
        :page-size="rows"
        :total="total"
        @current-change="handleCurrentChange"
        :current-page.sync="currentPage">
        <el-button :disabled="firstDisabled" @click="toFirstPage" size="mini">首页</el-button>
      </el-pagination>

      <el-pagination
        layout="slot, jumper"
        :page-size="rows"
        :total="total"
        @current-change="handleCurrentChange"
        :current-page.sync="currentPage">
        <el-button :disabled="isLastDisabled" @click="toLastPage" size="mini">尾页</el-button>
      </el-pagination>
    </div>
  • 问题2:el-botton按钮通过slot显示在分页控件中之后发现:disabled='firstDisabled',当firstDisabled发生变化时,el-button的disabled属性无法更改,这块问题的具体原因还没有找到,如果有知道的大神,请帮忙解释一下。

最后的解决方案就是使用两个el-button按钮,首页和尾页。代码如下:

  • 创建一个通用Page组件,将分页部分单独提出来放到组件中。
<template>
  <div>
    <el-button :disabled="firstDisabled" @click="toFirstPage" size="mini">首页</el-button>
    <el-pagination
      layout="prev, pager, next"
      :page-size="rows"
      :total="total"
      @current-change="handleCurrentChange"
      :current-page.sync="currentPage"
      style="display: inline-block;padding-right: 0px;">
    </el-pagination>
    <el-button :disabled="isLastDisabled" @click="toLastPage" size="mini">尾页</el-button>
    <el-pagination
      layout="jumper"
      :page-size="rows"
      :total="total"
      @current-change="handleCurrentChange"
      :current-page.sync="currentPage"
      style="display: inline-block;padding-left: 0px;">
    </el-pagination>
  </div>
</template>
    export default {
      data () {
        return {
          totalPage: Math.ceil(this.total / this.rows),
          firstDisabled: true
        }
      },
      props: {
        currentPage: {
          type: Number,
          default: 1
        },
        rows: {
          type: Number,
          default: 10
        },
        total: {
          type: Number,
          default: 0
        }
      },
      methods: {
        handleCurrentChange (page) {
          this.firstDisabled = page == 1 ? true : false;
          this.$emit("handleCurrentChangeSub", page);
        },
        toFirstPage () {
          this.handleCurrentChange(1);
        },
        toLastPage () {
          this.currentPage = this.totalPage;
          this.handleCurrentChange(this.totalPage);
        }
      },
      watch: {
        total(val) {
          this.total = val;
          this.totalPage = Math.ceil(val / this.rows);
        }
      },
      computed : {
        isLastDisabled () {
          if(this.totalPage <= 0){
            return true;
          }
          return this.currentPage == this.totalPage ? true : false;
        }
      }
    }
import Page from '../../components/Page'

components: {
    Page
}

<Page :currentPage="queryData.page" :rows="queryData.rows" :total="total" @handleCurrentChangeSub="handleCurrentChange"/>

相关文章

网友评论

      本文标题:vue elementUI el-pagination控件添加首

      本文链接:https://www.haomeiwen.com/subject/wkzzkctx.html