前端处理分页,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 上
    },
  },
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用`element-ui`中提供的`el-pagination`组件实现分页,具体实现步骤如下: 1. 在Vue实例中定义一个变量来保存当前页码和每页显示的数据量。 ```javascript data() { return { currentPage: 1, pageSize: 10, total: 0, tableData: [] } } ``` 2. 在Vue实例中定义一个方法来处理数据分页逻辑。该方法根据当前页码和每页显示的数据量,在所有数据数组中截取出对应页码的数据。 ```javascript methods: { handleCurrentChange(val) { this.currentPage = val; const start = (this.currentPage - 1) * this.pageSize; const end = start + this.pageSize; this.tableData = this.allData.slice(start, end); } } ``` 3. 在Vue实例中定义一个钩子函数created(),在该函数中调用后端接口获取所有数据,并将数据保存到Vue实例中的一个数组中。 ```javascript created() { // 调用后端接口获取所有数据 axios.get('api/getAllData').then(response => { this.allData = response.data; this.total = this.allData.length; // 调用handleCurrentChange方法,显示第1页数据 this.handleCurrentChange(1); }).catch(error => { console.log(error); }); } ``` 4. 在Vue模板中使用`el-pagination`组件,并将该组件的`total`属性设置为保存所有数据的数组的长度,将该组件的`page-size`属性设置为每页显示的数据量,将该组件的`current-page`属性绑定到Vue实例中定义的变量上,将该组件的`@current-change`事件绑定到Vue实例中定义的方法上。 ```html <el-pagination :total="total" :page-size="pageSize" v-model="currentPage" @current-change="handleCurrentChange"> </el-pagination> ``` 5. 在Vue模板中使用`v-for`指令循环遍历处理后的分页数据,并将每页显示的数据渲染到页面上。 ```html <el-table :data="tableData" style="width: 100%"> <el-table-column prop="name" label="姓名" width="180"> </el-table-column> <el-table-column prop="age" label="年龄" width="180"> </el-table-column> </el-table> ``` 以上是基本实现思路,具体实现细节可以根据具体需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

森海北屿 ღ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值