返回

Element-UI分页控件current-page属性常见错误的踩坑指南

前端

使用Element-UI的pagination组件时,对current-page属性的使用难免会遇到各种各样的疑惑,本文将为大家讲述在使用current-page属性时最容易踩的一个坑。

踩坑指南

对于这个坑,我详细的叙述一下如何踩进去的:首先,我使用了一个带有分页功能的表格,并且使用了Element-ui的pagination组件来控制分页。

<el-pagination
  layout="prev, pager, next"
  :current-page="currentPage"
  :page-size="pageSize"
  :total="total"
  @current-change="handleCurrentChange"
/>
export default {
  data() {
    return {
      currentPage: 1,
      pageSize: 10,
      total: 100,
    };
  },
  methods: {
    handleCurrentChange(val) {
      this.currentPage = val;
    },
  },
};

如果只是到这的话,一切都是正常的。坑就出现在这里,为了方便管理数据,我将currentPage、pageSize、total这三个变量都存入了一个名为paginationData的data中,如下所示:

export default {
  data() {
    return {
      paginationData: {
        currentPage: 1,
        pageSize: 10,
        total: 100,
      },
    };
  },
  methods: {
    handleCurrentChange(val) {
      this.paginationData.currentPage = val;
    },
  },
};

然后,组件就出问题了。当点击分页按钮时,currentPage的值会发生改变,但是pagination组件的current-page属性并没有随之改变。这让我百思不得其解,为什么会出现这种情况呢?

经过一番排查,我终于找到了问题所在。原来,当我将currentPage、pageSize、total这三个变量存入paginationData时,Vue并不会对paginationData进行深度监听。这意味着,当paginationData中的值发生改变时,Vue并不会自动更新pagination组件的current-page属性。

为了解决这个问题,我需要对paginationData进行深度监听。有两种方法可以实现这一点。

  1. 在data()中使用Vue.observable()方法将paginationData标记为可观察对象。
export default {
  data() {
    return {
      paginationData: Vue.observable({
        currentPage: 1,
        pageSize: 10,
        total: 100,
      }),
    };
  },
  methods: {
    handleCurrentChange(val) {
      this.paginationData.currentPage = val;
    },
  },
};
  1. 在methods()中使用this.$set()方法更新paginationData中的值。
export default {
  data() {
    return {
      paginationData: {
        currentPage: 1,
        pageSize: 10,
        total: 100,
      },
    };
  },
  methods: {
    handleCurrentChange(val) {
      this.$set(this.paginationData, 'currentPage', val);
    },
  },
};

这两种方法都可以解决这个问题。

总结

Element-UI的pagination组件的current-page属性是一个非常有用的属性,可以帮助我们轻松控制分页。但是在使用这个属性时,需要注意一个坑:当我们将currentPage、pageSize、total这三个变量存入一个data时,Vue并不会对这个data进行深度监听。这意味着,当这三个变量发生改变时,Vue并不会自动更新pagination组件的current-page属性。为了解决这个问题,我们需要对这个data进行深度监听。