Iview 表格 改变选中行数据 表格数据改变 选中数据不改变 解决办法 双向绑定

本文详细介绍了如何在IView UI框架中利用表格组件实现复杂的数据展示和交互功能,包括自定义列渲染、数据筛选及动态更新等高级特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

<template>
  <div>
    <Table
      border
      stripe
      height="350"
      ref="selection"
      :columns="columns"
      :data="data"
      @on-selection-change="updateData">
      <template slot-scope="{ row, index }" slot="employee">
        <div v-for="(item,i) in row.employeeList" :key="i">
          <checkbox v-model="item.checked" @on-change="checkboxChange(item,row,index)">
            <!--<checkbox v-model="item.checked" @on-change="checkboxChange(item.checked,i,index)">-->
            {{item.name}}
          </checkbox>
        </div>
      </template>
    </Table>
    <Button @click="getcheckedData()">点击获取选中数据</Button>
    <p>{{JSON.stringify(this.selectData)}}</p>

  </div>
</template>

<script>
  export default {
    components: {},
    data() {
      return {
        data: [
          {
            serialNo: '01', name: 'migzi', quantity: 1,
            employeeList: [{id: 1, name: '米娜1', checked: true}, {id: 2, name: '米娜22', checked: true}]
          },
          {
            serialNo: '02', name: 'migzi02', quantity: 2,
            employeeList: [{id: 1, name: '米娜1', checked: true}, {id: 2, name: '米娜22', checked: true}]
          },
        ],
        columns: [{
          type: 'selection',
          width: 60,
          align: 'center'
        }, {
          title: '货品编号',
          key: 'serialNo'
        }, {
          title: '货品名称',
          key: 'name'
        }, {
          title: '数量',
          key: 'quantity',
          // slot: 'employee',
          render: (h, params) => {
            return h('div', [
              h('InputNumber', {
                props: {
                  min: 0,
                  value: params.row.quantity
                },
                on: {
                  // 编辑数量的时候,触发的事件
                  'on-change': e => {
                    params.row.quantity = e
                    this.data[params.index] = params.row;
                    this.selectData.forEach((v,index) => { // 先循环选中的值,找到id,与所有data里的id进行比对
                      if(v.serialNo == params.row.serialNo){
                        this.selectData.splice(index,1,params.row);
                      }
                    });
//                    this.updateData(this.data) // 改变的时候触发一下改变数据时事件,这样只要编辑了就会获取里面的值
                  }
                }
              })
            ])
          }
        },
          {
            title: 'employee',
            slot:
              'employee',
          }],
        selectData:[],
      }
    },
    methods: {
      checkboxChange(item,row,index) {
        console.log('item值')
        console.log(item)
        console.log('row值')
        console.log(row)
        this.data[index] = row
        console.log( this.data[index]);
        console.log('date值')
        console.log(this.data);
        console.log('选中date')
        console.log(this.selectData)
        // 选中的数据和 修改的row数据 对比 赋值同步;

        this.selectData.forEach((v,index) => { // 先循环选中的值,找到id,与所有data里的id进行比对
          if(v.serialNo == row.serialNo){
            this.selectData.splice(index,1,row);
          }
        });
        console.log('匹配复制后的 selectData');
        console.log(this.selectData)

      },

      // 更新选中的数据
      updateData(val) {
        console.log(val);
        this.selectData = val;
        console.log('选中date')
        console.log(this.selectData)

      },
      getcheckedData(){
        console.log('点击按钮最后的选中date');
        console.log(this.selectData);
      }
    },
    created: function () {
    }
  }
</script>

<style scoped>

</style>

 

代码演示链接【如果没有效果,可直接用上面代码复制粘贴运行看效果】:

https://run.iviewui.com/8NNVisgQ

<think>我们正在处理一个关于iView表格的问题。用户想要在表格的最后添加一行数据,并且影响现有数据。 根据iView的文档,表格数据是通过`data`属性绑定的。因此,动态添加一行数据应该通过修改这个数据数组来实现。 步骤: 1.数据中,我们有一个数组(比如`tableData`)绑定到表格的`data`属性。 2. 当需要添加一行时,我们可以创建一个新的对象(代表新行的数据),然后将其添加到`tableData`数组的末尾。 3. 由于Vue的响应式系统,当我们更新`tableData`时,表格会自动重新渲染,从而显示新的一行。 注意:要直接通过索引去修改数组,而是使用数组的变异方法(如push)或者使用Vue.set来确保响应式更新。 示例代码: 假设我们的表格数据初始为: tableData: [ { name: 'John', age: 25 }, { name: 'Jane', age: 22 } ] 要添加一行新数据,比如{ name: 'Tom', age: 30 },我们可以这样做: this.tableData.push({ name: 'Tom', age: 30 }); 这样,表格就会在最后一行显示新数据。 但是,用户提到“影响之前的数据”,所以我们只需要确保在添加新行时,改变现有数组中的对象即可。 另外,如果表格中有一些动态的列(比如通过循环生成),请确保新添加的对象具有所有需要的属性,以避免渲染错误。 因此,我们可以这样实现: addRow() { // 创建一个新的行对象,这里我们使用空数据,实际中可以根据需要填充 let newRow = { name: '', age: null }; // 这里可以根据实际情况初始化 this.tableData.push(newRow); } 在模板中,我们可以绑定一个按钮来触发addRow方法。 但是,如果表格是可编辑的,并且新行需要立即进入编辑状态,可能需要额外的处理(比如使用iView的editable表格),但用户的问题只是添加行,所以先考虑编辑。 另外,如果表格使用了分页,那么添加新行后,新行可能会出现在最后一页。如果当前在最后一页,用户可能看到,所以需要根据情况调整。 过,用户没有提到分页,所以我们先考虑。 所以,核心就是:通过push方法向数据数组末尾添加一个新对象。 参考之前的回答,我们曾经提到过使用PUT请求更新数据,但这里的前端操作需要直接调用更新接口,因为用户的问题是如何在前端表格中添加行。但添加行后,用户可能还需要将整个表格数据提交到后端保存,这可以通过另外的保存按钮实现。 因此,回答如下:</think>在 iView 表格中动态添加最后一行数据影响现有数据,可以通过以下步骤实现: ### 解决方案 1. **获取当前表格数据** 从表格绑定的数据源中获取当前所有行数据 2. **创建新行对象** 构建一个符合表格列结构的新数据对象(空值或默认值) 3. **使用数组操作添加新行** 通过数组的 `push()` 方法将新行添加到数据末尾 4. **更新响应式数据** 由于 Vue 的响应式特性,表格会自动重新渲染 ```vue <template> <div> <Table :columns="columns" :data="tableData"></Table> <Button @click="addRow">添加最后一行</Button> </div> </template> <script> export default { data() { return { columns: [ { title: '姓名', key: 'name' }, { title: '年龄', key: 'age' }, { title: '地址', key: 'address' } ], tableData: [ { name: '张三', age: 25, address: '北京市' }, { name: '李四', age: 30, address: '上海市' } ] } }, methods: { addRow() { // 创建新行数据(保持与列结构一致) const newRow = { name: '新用户', age: 0, address: '待填写' } // 添加到数组末尾(影响现有数据this.tableData.push(newRow); // 在控制台查看更新后的数据 console.log('当前数据:', this.tableData); } } } </script> ``` ### 关键说明 1. **响应式更新原理** Vue 会自动检测数组变化并更新视图,无需手动刷新表格[^1] 2. **修改原数据的技巧** `push()` 方法会在**原数组末尾添加**新元素,改变现有元素的引用地址 3. **注意事项**: - 新行对象的字段需与 `columns` 定义的 `key` 完全匹配 - 若表格使用分页,新行会自动出现在最后一页 - 批量添加时可使用 `concat()`: `this.tableData = this.tableData.concat([newRow1, newRow2])` ### 效果演示 点击按钮后: 1. 表格立即显示新增的最后一行 2. 原有数据保持完全变 3. 新行初始状态为默认值(可编辑)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值