elementul el-table表格如何在取消勾选时获取当前行数据

本文介绍了解决在Vue的el-table组件中,如何在用户取消勾选时获取当前行数据的问题。通过`handleSelect`方法利用includes()判断并获取未勾选项的数据。

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

有些时候需要用到在取消勾选时获取当前行的数据,但是正常的用法你取消后返回给你的是一个空数组。

解决办法

这里我就直接把elementul上的多选表格代码直接复制过来演示了。如果想要看看效果,可以直接复制这一段代码找个空白的页面放进去看看log的信息就知道了。

老规矩,解释一下,防止新人看不懂:

这里主要是靠在el-table上用@select="handleSelect"方法实现的
下面handleSelect方法中,list参数代表所有勾选数据,item参数代表当前点击的数据。
arguments是一个类数组对象,如果不理解,具体说明自己百度看看这是个啥,这可是很好用的。
includes() 方法用于判断字符串是否包含指定的子字符串。
如果找到匹配的字符串则返回 true,否则返回 false

逻辑

上面解释完了,应该也理解逻辑了吧
很简单,就是通过includes()判断所以勾选的数据内是否包含当前点击的项,如果没有就返回false。那你已经取消勾选了自然就不包含,就是false。那就if判断一下,如果是false也就是你取消勾选了就把当前的数据存到某个变量之类的,你就拿到了数据了。这个可以用item拿也可以直接arguments[1]也能拿到

<template>
  <div>
      <el-table
    ref="multipleTable"
    :data="tableData"
    tooltip-effect="dark"
    style="width: 100%"
    @select="handleSelect">
    <el-table-column
      type="selection"
      width="55">
    </el-table-column>
    <el-table-column
      label="日期"
      width="120">
      <template slot-scope="scope">{{ scope.row.date }}</template>
    </el-table-column>
    <el-table-column
      prop="name"
      label="姓名"
      width="120">
    </el-table-column>
    <el-table-column
      prop="address"
      label="地址"
      show-overflow-tooltip>
    </el-table-column>
  </el-table>
  </div>
</template>

<script>
export default {
    data() {
      return {
        tableData: [{
          date: '2016-05-03',
          name: '王小虎1',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-02',
          name: '王小虎2',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-04',
          name: '王小虎3',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-01',
          name: '王小虎4',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-08',
          name: '王小虎5',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-06',
          name: '王小虎6',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-07',
          name: '王小虎7',
          address: '上海市普陀区金沙江路 1518 弄'
        }],
        multipleSelection: []
      }
    },

    methods: {
   		//这个不用管
      toggleSelection(rows) {
        if (rows) {
          rows.forEach(row => {
            this.$refs.multipleTable.toggleRowSelection(row);
          });
        } else {
          this.$refs.multipleTable.clearSelection();
        }
      },
      
      //重点是这个方法。list是所有勾选数据,item是当前点击的数据。
      handleSelect(list, item){
          if(list.includes(item)){
              //勾选时做的事
              console.log('成功');
          }else{
              //取消勾选时做的事,arguments[1]是当前取消勾选的项
              console.log(arguments[1]);
          }
            console.log('handleSelect', arguments,list.includes(item))
        },
    }
}
</script>

<style>

</style>
<think>我们正在使用Element UI的el-table组件,并希望实现以下功能: 1. 获取当前勾选数据信息 2. 判断当前操作是勾选还是取消勾选 根据引用[1]和引用[3],我们可以使用el-table的@select事件来实现。 具体步骤: 1. 在el-table上绑定@select事件,该事件会在用户手动勾选某一行数据触发。 事件处理函数handleSelect接收两个参数: - selection: 当前所有已选中的行数据数组(包括刚刚操作的行) - row: 当前操作的行数据 2. 在handleSelect方法中,我们可以通过判断selection数组中是否包含当前行row来确定是勾选还是取消勾选。 如果包含,则是勾选操作;如果不包含,则是取消勾选操作。 3. 另外,我们还可以通过一个数组(例如multipleSelection)来存储所有选中的数据,以便在跨页保持选中的状态。 4. 同,为了实现跨页记忆,我们还需要使用row-key属性和@selection-change事件(引用[2]和引用[3]),但这里我们主要关注当前操作是勾选还是取消勾选。 代码示例: 模板部分: ```html <el-table ref="multipleTable" :data="tableData" @select="handleSelect" @selection-change="handleSelectionChange" row-key="id" <!-- 为每一行指定唯一标识,用于跨页记忆 --> > <!-- 表格列定义,包括多选框列 --> <el-table-column type="selection" width="55"></el-table-column> <!-- 其他列 --> </el-table> ``` 脚本部分: ```javascript export default { data() { return { tableData: [], // 表格数据 multipleSelection: [] // 存储所有选中的数据 }; }, methods: { // 处理单选事件(判断是勾选还是取消勾选) handleSelect(selection, row) { // selection: 当前所有已选中的行数据(包括当前操作的行) // row: 当前操作的行数据 // 判断当前行row是否在selection数组中 if (selection.includes(row)) { // 勾选操作 console.log('勾选', row); // 将当前行添加到multipleSelection(注意去重) if (!this.multipleSelection.some(item => item.id === row.id)) { this.multipleSelection.push(row); } } else { // 取消勾选操作 console.log('取消勾选', row); // 从multipleSelection中移除 this.multipleSelection = this.multipleSelection.filter(item => item.id !== row.id); } }, // 处理选择改变事件(当选择项发生变化会触发该事件,比如全选、翻页等) handleSelectionChange(selection) { // 这个事件可以用于更新multipleSelection,但注意这里我们已经在handleSelect中处理了单个操作 // 但是全选操作,handleSelect不会被触发,所以需要在这里处理全选的情况 // 不过,全选操作我们通常用@select-all事件来处理,这里为了简化,我们也可以只使用handleSelectionChange来更新multipleSelection // 但注意:如果使用handleSelectionChange来更新,那么单个操作也会触发这个事件,所以我们可以不用在handleSelect中更新multipleSelection,而统一在这里更新 // 因此,我们可以选择两种方式之一: // 方式1:在handleSelect中更新multipleSelection(如上代码),同handleSelectionChange只用于其他情况(比如全选)的补充 // 方式2:不在handleSelect中更新,而只在handleSelectionChange中更新multipleSelection // 这里我们采用方式1,所以handleSelectionChange可以暂不写,或者只用于其他逻辑 // 但注意,全选操作不会触发handleSelect,所以我们需要单独处理全选事件,即@select-all }, // 处理全选事件 handleSelectAll(selection) { // selection: 当前页所有选中的行数据(全选是当前页所有数据取消全选为空数组) if (selection.length > 0) { // 全选当前页 selection.forEach(row => { if (!this.multipleSelection.some(item => item.id === row.id)) { this.multipleSelection.push(row); } }); } else { // 取消全选当前页 // 注意:我们需要从multipleSelection中移除当前页的所有数据 // 获取当前页的所有id const currentPageIds = this.tableData.map(item => item.id); this.multipleSelection = this.multipleSelection.filter(item => !currentPageIds.includes(item.id)); } } } }; ``` 注意:上面的代码中,我们同处理了单选和全选。但是,由于全选操作不会触发handleSelect事件,所以我们必须单独处理全选事件(@select-all)。 另外,为了在翻页恢复选中状态,我们还需要在每次翻页后(比如在表格数据更新后,或者在分页的current-change事件中)调用一个方法来恢复当前页的选中状态,如引用[3]中的restoreSelection方法。 恢复选中状态的方法: ```javascript methods: { // ... 其他方法 // 恢复当前页的选中状态 restoreSelection() { // 确保表格已经渲染完成 this.$nextTick(() => { if (this.tableData && this.$refs.multipleTable) { this.tableData.forEach(row => { // 如果当前行在multipleSelection中,则设置为选中 if (this.multipleSelection.some(item => item.id === row.id)) { this.$refs.multipleTable.toggleRowSelection(row, true); } else { this.$refs.multipleTable.toggleRowSelection(row, false); } }); } }); } } ``` 然后,在每次表格数据变化(比如分页切换)后,调用restoreSelection方法。 总结: 1. 通过@select事件判断当前操作是勾选还是取消勾选,并更新multipleSelection。 2. 通过@select-all事件处理全选和取消全选当前页,并更新multipleSelection。 3. 使用row-key和restoreSelection方法实现跨页记忆。 这样,我们就可以在multipleSelection中保存所有选中的数据,并且能够判断每次操作是勾选还是取消勾选。 相关问题: 1. 如何实现el-table的跨页勾选记忆功能? 2. 在el-table中,如何区分全选和单选操作? 3. el-table的@select事件和@selection-change事件有什么区别?</think>在 Element UI 的 `el-table` 中获取当前勾选数据并判断操作类型(勾选/取消勾选),可通过以下步骤实现: ### 解决方案 1. **绑定选择事件** 使用 `@select` 事件监听行勾选状态变化: ```html <el-table :data="tableData" @select="handleSelect" <!-- 监听行勾选事件 --> ref="tableRef" > <el-table-column type="selection" width="55" /> <!-- 其他列 --> </el-table> ``` 2. **事件处理逻辑** 在 `handleSelect` 方法中通过 `selection.includes(row)` 判断操作类型: ```javascript methods: { handleSelect(selection, row) { // selection: 当前所有已选行数据 // row: 当前操作的行数据 if (selection.includes(row)) { // 勾选操作 console.log("勾选行:", row); this.$message.success(`已勾选: ${row.name}`); } else { // 取消勾选操作 console.log("取消勾选行:", row); this.$message.warning(`已取消: ${row.name}`); } } } ``` ### 关键点说明 1. **`@select` 事件参数**: - `selection`:当前页所有**已勾选**的行数据数组(实更新) - `row`:用户**当前操作**的行数据 2. **判断逻辑**: - `selection.includes(row)` 为 `true` → **勾选操作** - `selection.includes(row)` 为 `false` → **取消勾选操作** 3. **跨页记忆支持**(可选): 若需跨页保存状态,需添加 `row-key` 和 `@selection-change`: ```html <el-table row-key="id" <!-- 指定唯一标识字段 --> @selection-change="handleSelectionChange" > ``` ```javascript data() { return { allSelections: [] // 存储所有页的选中数据 } }, methods: { handleSelectionChange(selection) { this.allSelections = selection; // 更新全量选中数据 } } ``` ### 完整示例 ```html <template> <el-table :data="tableData" @select="handleSelect" row-key="id" @selection-change="handleSelectionChange" ref="tableRef" > <el-table-column type="selection" width="55" /> <el-table-column prop="name" label="姓名" /> <el-table-column prop="age" label="年龄" /> </el-table> </template> <script> export default { data() { return { tableData: [ { id: 1, name: '张三', age: 25 }, { id: 2, name: '李四', age: 30 } ], allSelections: [] // 存储所有选中项 }; }, methods: { handleSelect(selection, row) { if (selection.includes(row)) { console.log('✅ 勾选:', row.name); // 业务逻辑:添加到选中列表 } else { console.log('❌ 取消:', row.name); // 业务逻辑:从选中列表移除 } }, handleSelectionChange(selection) { this.allSelections = selection; // 更新全局选中状态 } } }; </script> ``` ### 注意事项 1. **`arguments` 对象**: 原生 `arguments` 包含所有参数(`[selection, row]`),但直接使用显式参数更清晰 2. **全选/取消全选**: 如需监听全选操作,需额外添加 `@select-all` 事件[^2][^3] 3. **数据唯一性**: 跨页记忆必须通过 `row-key` 指定唯一标识字段(如 `id`) --- ### 相关问题 1. 如何实现 `el-table` 跨页勾选数据记忆功能? 2. 在 `el-table` 中如何区分全选和单行勾选操作? 3. `@selection-change` 和 `@select` 事件有何区别? 4. 如何限制 `el-table` 的最大勾选数量? [^1]: 通过 `@select` 事件和 `selection.includes(row)` 判断操作类型 [^2]: 使用 `row-key` 和 `@selection-change` 实现跨页记忆 [^3]: 全选操作需通过 `@select-all` 事件单独处理
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

接口写好了吗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值