elementUI表格编辑状态下,如何获取修改过的行

本文介绍了如何利用 Vue 的 row-click 事件和动态 $watch 监听,捕捉表格在编辑状态下被修改的行数据,并提供筛选编辑过行数据的方法。通过实例展示了获取修改行ID和详细数据的过程,适用于数据管理与实时监控场景。

表格再编辑状态,需要获取到哪一行数据被修改了,面对这样一个场景,我们可以结合element的row-click事件以及动态的监听$watch来实现。
tableList,代表表格的数据, rowIds代表需要记录的id数组的集合, isUpdateTableList为true代表表格进入编辑状态了
import { cloneDeep } from ‘lodash-es’; //cloneDeep是进行深拷贝的插件

 /** 编辑状态下,监听行数据是否变化 */
    rowClick(row, column, event) {
      // 编辑状态下对修改过得行数据的id进行保存
      if (this.isUpdateTableList) {
        const rowPre = cloneDeep(row);
        this.$watch(
          () => {
            return row;
          },
          {
            handler(newVal, oldVal) {
              let that = this;
              // console.log(newVal, oldVal, cloneDeep(newVal) == cloneDeep(oldVal))
              if (newVal !== rowPre) { // 如果行数据发生变化,则记录其id
                that.rowIds.push(row.id);
                that.rowIds = [...new Set(that.rowIds)];
                console.log(that.rowIds);
              }
            },
            deep: true,
          },
        );
      }
    },
   

上面的方法只是获取到了具体修改过行的id,如果需要得到修改过的行的具体数据,可以过滤

 /** 筛选编辑过的行数据公共方法 */
    filterUpdateRow() {
      return this.tableList.filter((item, index) => {
        //函数本身返回布尔值,只有当返回值为true时,当前项存入新数组。
        return  this.rowIds.indexOf(item.id)>-1
      })
    },
要在Vue和Element UI中实现表格编辑,可以使用Element UI提供的el-table组件以及Vue的数据绑定和计算属性。 首先,在Vue中定义表格的数据,例如: ``` data() { return { tableData: [ { name: 'John', age: 25, gender: 'Male' }, { name: 'Mary', age: 30, gender: 'Female' }, { name: 'Bob', age: 40, gender: 'Male' }, { name: 'Alice', age: 35, gender: 'Female' } ] } } ``` 然后,在模板中使用el-table组件来显示数据: ``` <template> <el-table :data="tableData" style="width: 100%"> <el-table-column prop="name" label="Name"></el-table-column> <el-table-column prop="age" label="Age"></el-table-column> <el-table-column prop="gender" label="Gender"></el-table-column> </el-table> </template> ``` 这将显示一个表格,其中包含三列:Name、Age和Gender,并使用tableData中的数据进填充。 要让表格可以编辑,可以添加一个编辑按钮,并在单击时将表格设置为可编辑状态: ``` <template> <el-table :data="tableData" style="width: 100%"> <el-table-column prop="name" label="Name"></el-table-column> <el-table-column prop="age" label="Age"></el-table-column> <el-table-column prop="gender" label="Gender"></el-table-column> <el-table-column> <template slot-scope="scope"> <el-button type="text" @click="handleEdit(scope.row)">Edit</el-button> </template> </el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { name: 'John', age: 25, gender: 'Male', isEditing: false }, { name: 'Mary', age: 30, gender: 'Female', isEditing: false }, { name: 'Bob', age: 40, gender: 'Male', isEditing: false }, { name: 'Alice', age: 35, gender: 'Female', isEditing: false } ] } }, methods: { handleEdit(row) { row.isEditing = true } } } </script> ``` 在这个例子中,我们添加了一个isEditing属性来跟踪是否处于编辑状态,并将其初始值设置为false。当用户单击编辑按钮时,我们将isEditing设置为true。 接下来,我们需要创建一个编辑表单,以便用户可以在其中编辑数据。我们可以使用el-form组件来实现这一点: ``` <template> <el-table :data="tableData" style="width: 100%"> <el-table-column prop="name" label="Name"></el-table-column> <el-table-column prop="age" label="Age"></el-table-column> <el-table-column prop="gender" label="Gender"></el-table-column> <el-table-column> <template slot-scope="scope"> <el-button type="text" @click="handleEdit(scope.row)">Edit</el-button> </template> </el-table-column> </el-table> <el-dialog :visible.sync="dialogVisible"> <el-form :model="currentRow" label-width="100px"> <el-form-item label="Name"> <el-input v-model="currentRow.name"></el-input> </el-form-item> <el-form-item label="Age"> <el-input v-model="currentRow.age"></el-input> </el-form-item> <el-form-item label="Gender"> <el-radio-group v-model="currentRow.gender"> <el-radio label="Male">Male</el-radio> <el-radio label="Female">Female</el-radio> </el-radio-group> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click="dialogVisible = false">Cancel</el-button> <el-button type="primary" @click="handleSave">Save</el-button> </div> </el-dialog> </template> <script> export default { data() { return { tableData: [ { name: 'John', age: 25, gender: 'Male', isEditing: false }, { name: 'Mary', age: 30, gender: 'Female', isEditing: false }, { name: 'Bob', age: 40, gender: 'Male', isEditing: false }, { name: 'Alice', age: 35, gender: 'Female', isEditing: false } ], dialogVisible: false, currentRow: {} } }, methods: { handleEdit(row) { this.currentRow = Object.assign({}, row) this.dialogVisible = true }, handleSave() { // Save changes to database or update tableData directly this.dialogVisible = false } } } </script> ``` 在这个例子中,我们添加了一个el-dialog组件,其中包含一个el-form,用于编辑数据。我们还添加了一个dialogVisible属性来控制对话框的可见性,并用currentRow属性存储当前正在编辑数据。 当用户单击编辑按钮时,我们将当前数据复制到currentRow中,并将dialogVisible设置为true,以显示编辑对话框。当用户单击保存按钮时,我们可以将更改保存到数据库或直接更新tableData。 最后,在el-table组件中,我们需要根据每的isEditing属性来决定是否显示编辑表单或显示原始数据。我们可以使用Vue的计算属性来实现这一点: ``` <template> <el-table :data="tableData" style="width: 100%"> <el-table-column prop="name" label="Name"></el-table-column> <el-table-column prop="age" label="Age"></el-table-column> <el-table-column prop="gender" label="Gender"></el-table-column> <el-table-column> <template slot-scope="scope"> <el-button type="text" @click="handleEdit(scope.row)">Edit</el-button> <el-button type="text" @click="handleDelete(scope.row)">Delete</el-button> </template> </el-table-column> </el-table> <el-dialog :visible.sync="dialogVisible"> <el-form :model="currentRow" label-width="100px"> <el-form-item label="Name"> <el-input v-model="currentRow.name"></el-input> </el-form-item> <el-form-item label="Age"> <el-input v-model="currentRow.age"></el-input> </el-form-item> <el-form-item label="Gender"> <el-radio-group v-model="currentRow.gender"> <el-radio label="Male">Male</el-radio> <el-radio label="Female">Female</el-radio> </el-radio-group> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click="dialogVisible = false">Cancel</el-button> <el-button type="primary" @click="handleSave">Save</el-button> </div> </el-dialog> </template> <script> export default { data() { return { tableData: [ { name: 'John', age: 25, gender: 'Male', isEditing: false }, { name: 'Mary', age: 30, gender: 'Female', isEditing: false }, { name: 'Bob', age: 40, gender: 'Male', isEditing: false }, { name: 'Alice', age: 35, gender: 'Female', isEditing: false } ], dialogVisible: false, currentRow: {} } }, methods: { handleEdit(row) { this.currentRow = Object.assign({}, row) this.dialogVisible = true }, handleSave() { // Save changes to database or update tableData directly this.dialogVisible = false }, handleDelete(row) { // Delete row from database or tableData directly } }, computed: { computedTableData() { return this.tableData.map(row => { if (row.isEditing) { return this.currentRow } else { return row } }) } } } </script> ``` 在这个例子中,我们使用computed属性computedTableData来根据每的isEditing属性返回tableData的副本,其中正在编辑被替换为currentRow。然后,我们在el-table组件中使用computedTableData而不是tableData来显示数据。 这样,我们就可以在Vue和Element UI中实现表格编辑了。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值