watch深度监听and前端分页

305 阅读1分钟

今天出现了一个问题,搜索后分页组件没有成功分页。用了elementUI的drawer抽屉组件。点击出现抽屉,在抽屉中渲染一个列表,列表初始只显示10条数据,其他数据需要自己搜索。有一个输入框,输入关键字后回车实现搜索数据。搜索出来的结果分页显示,每页10条,此时使用了前端分页组件,将搜索结果传给该组件进行前端分页。

出现的问题是,第一次进入抽屉列表,输入内容后搜索,后台返回的数据是17条,但是抽屉列表只渲染了10条数据,只有第一页,第二页的数据没有出现,并且分页器也只有第一页的页码。关闭抽屉列表再次打开,重新搜索,发现分页功能又正常了。

经过排查,发现是初次进入抽屉列表进行搜索时,前端分页组件获取不到总的数据条数。因为使用了watch监听获取总的数据条数,但是不是深度监听,所以首次挂载不会触发,newData.length没有被赋值,所以在第二次搜索的时候才成功实现分页。

解决方法一:在父组件中将总的数据条数传给前端分页组件,前端分页组件接收并使用。

解决方法二:将前端分页组件中的watch监听改为深度监听即可。如下所示:

watch: {
    data: {
      immediate:true,
      handler(newData){
        this.totalSize = newData.length,
        this.onCurrentChangeHandler(1);
      }
    },
  },

分页组件内容如下:

<template>
  <el-pagination
    :current-page.sync="currentPage"
    :page-size="pageSize"
    :total="totalSize"
    layout="prev, pager, next"
    background
    @size-change="onSizeChangeHandler"
    @current-change="onCurrentChangeHandler"
  />
</template>

<script>
import _ from 'lodash'
export default {
  name: 'TablePagination',
  props: {
  // 从后台获取到的数据ruleList
    data: {
      default: function() {
        return []
      },
      type: Array
    }
  },
  data() {
    return {
      currentPage: 1,
      pageSize: 10,
      pageSizeArr: [5, 10, 20, 50, 100],
      totalSize: 0
    }
  },

  watch: {
    data(newData){
        this.totalSize = newData.length,
        this.onCurrentChangeHandler(1);
      }
  },

  methods: {
    // currentPage 改变时会触发
    onCurrentChangeHandler(pageIndex) {
      this.$emit('onTableChange', this.sliceRightData(pageIndex))
    },

    // 分页逻辑
    sliceRightData(pageIndex) {
      const data = this.data
      if (_.isEmpty(data)) {
        return []
      } else {
        return data.slice((pageIndex - 1) * this.pageSize, pageIndex * this.pageSize)
      }
    },

    // pageSize 改变时会触发:
    onSizeChangeHandler(val) {
      this.pageSize = val
      this.currentPage = 1
      this.onCurrentChangeHandler(1)
    }
  }
}
</script>