前端处理分页,prop数据绑定

项目中由前端处理得到修改预览数据并在列表中展示,为了更好地体验添加分页,框架基于ant-design.
部分代码如下:

<a-spin>
	<a-table :columns="columns" :dataSource="modifyData1" rowKey="id" :pagination="false" bordered></a-table>
	<my-pagination v-if="total !== 0" :total="total" v-model="pageNum" :pageSize.sync="pageSize" @change="handlePageChange" @showSizeChange="showSizeChange"></my-pagination>
</a-spin>

正确代码:

<script>
import myPagination from '@/components/data/pagination'
export default {
  name: 'example',
  props: {
    visible: {
      type: Boolean,
      default: false,
    },
    modifyData: {
      type: Array,
    },
  },
  components: {
    myPagination,
  },
  data () {
    return {
      module: module, // 模块名
      columns: [
		...
		...
      ],
      modifyData1: [],
      total: 0,
      pageNum: 1,
      pageSize: 10,
      paginationData: [], // 前端分页的全量数据
    }
  },
  watch: {
    modifyData (val) {
      this.modifyData1 = val // 新增 modifyData 的 watch,监听变更并同步到 modifyData1 上
    },
    visible (val) {
      if (val) {
        this.init()
      }
    },
  },
  methods: {
    init () {
      this.paginationData = this.modifyData1
      this.total = this.paginationData.length
      this.getData()
    },
    handlePageChange (pageNum, pageSize) {
      this.pageNum = pageNum
      this.pageSize = pageSize
      this.getData()
    },
    showSizeChange (pageNum, pageSize) {
      this.pageNum = pageNum
      this.pageSize = pageSize
      this.getData()
    },
    getData () {
      this.modifyData1 = this.paginationData.filter((item, index) => { // 前端数据分页
        return index >= (this.pageNum - 1) * this.pageSize && index < this.pageNum * this.pageSize
      })
    },
    ...
    ...
  },
}
</script>

其中,modifyData 为父组件中处理后传到子组件的值,子组件拿到全量数据后进行分页处理,一开始的写法是直接处理modifyData,即:

<a-table :columns="columns" :dataSource="modifyData" rowKey="id" :pagination="false" bordered></a-table>
...

<script>
	...
  watch: {
    visible (val) {
      if (val) {
        this.init()
      }
    },
  },
  methods: {
    init () {
      this.paginationData = this.modifyData
      this.total = this.paginationData.length
      this.getData()
    },
    
    ...
    
    getData () {
      this.modifyData = this.paginationData.filter((item, index) => { // 数据分页
        return index >= (this.pageNum - 1) * this.pageSize && index < this.pageNum * this.pageSize
      })
    },
    
    ...
    
 </script>  

浏览器报错:
[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop’s value. Prop being mutated: “modifyData”
在这里插入图片描述

问题出现在子组件中 getData () 方法中,这里对 prop 中定义的 modifyData 变量进行了赋值操作,其值本应来自父组件传递,不倡导在子组件中对其做更改,也就是单向数据流。

单向数据流
所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。
额外的,每次父级组件发生更新时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。

解决方法:创建针对props属性的watch来同步组件外对props的修改

  watch: {
    modifyData (val) {
      this.modifyData1 = val // 新增 modifyData 的 watch,监听变更并同步到 modifyData1 上
    },
  },
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森海北屿 ღ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值