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

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

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

解决办法

这里我就直接把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> 我们参考用户提供的引用内容,特别是引用[1]和引用[3],它们提到了通过`@select`事件和`@select-all`事件来获取勾选状态。 在引用[1]中,使用`@select="handleSelect"`,其中`handleSelect`方法的参数`list`表示所有勾选数据,`item`表示当前点击的行数据。 另外,引用[3]提到了全选状态的处理,通过`this.$refs['pushMultipleTable'].store.states.isAllSelected`可以获取全选状态。 但是用户的问题是如何获取当前行数据是否勾选”的状态。我们可以通过以下方式: 1. 使用`@select`事件和`@selection-change`事件来跟踪选中的行。 2. 在数据中维护一个选中行的数组(比如`selectedRows`),然后判断当前行是否在这个数组中。 然而,用户可能希望直接获取当前行勾选状态,而不想自己维护。实际上,el-table提供了一种方式:我们可以使用`row`的某个属性来判断,但官方并没有直接提供当前行勾选状态属性。 我们可以通过以下步骤实现: -el-table上设置`ref`,例如`ref="multipleTable"` - 然后通过`this.$refs.multipleTable.toggleRowSelection(row)`可以切换行的选中状态,但是获取状态需要用到`this.$refs.multipleTable.isRowSelected(row)` 但是注意:在Element UI的官方文档中,并没有直接提供`isRowSelected`方法。不过,我们可以通过`this.$refs.multipleTable.store.states.selection`来获取当前选中的所有行,然后判断某行是否在其中。 因此,我们可以这样写一个方法: ```javascript isRowSelected(row) { const selection = this.$refs.multipleTable.store.states.selection; return selection.some(item => item === row); } ``` 但是,注意引用[3]中使用了`this.$refs['pushMultipleTable'].store.states.isAllSelected`来获取全选状态,所以我们也可以使用`store.states.selection`来获取已选中的行数组。 另外,在引用[1]中,`handleSelect`方法中我们可以得到当前点击的行(即`item`)和所有选中的行(`list`),所以如果只需要在事件中判断当前行是否被选中,可以直接在`handleSelect`方法中通过`list`是否包含当前行来判断。 所以,针对用户的问题,有两种方法: 方法一:通过事件参数(适用于在事件处理函数中) 在`@select`事件中,第二个参数就是当前行勾选状态(选中为true,取消选中为false)?但实际上,查看Element UI文档,`@select`事件有两个参数:第一个是选中的所有行,第二个是当前行。但是并没有直接提供当前行勾选状态。不过,我们可以通过第一个参数(当前所有选中的行)是否包含当前行来判断。 示例代码: ```html <el-table ref="multipleTable" :data="tableData" @select="handleSelect" @select-all="handleSelectAll" > ... </el-table> ``` ```javascript methods: { handleSelect(selection, row) { // selection: 当前选中的所有行 // row: 当前操作的行 // 判断当前行是否被选中:selection中是否包含row const isSelected = selection.includes(row); console.log(`当前行${row.id}是否被选中: ${isSelected}`); } } ``` 方法二:通过ref和store(适用于任意获取某一行的选中状态) 我们可以写一个方法,传入行数据,返回是否选中。 ```javascript methods: { isRowSelected(row) { // 获取表格的ref,例如multipleTable const table = this.$refs.multipleTable; if (table) { // 获取当前选中的所有行 const selection = table.store.states.selection; return selection.includes(row); } return false; } } ``` 注意:`includes`方法用于数组,判断数组是否包含某个元素。这里要求行数据是同一个引用(即必须是同一个对象),如果表格数据是重新获取的,那么可能之前选中的行对象和当前表格中的行对象不是同一个,此我们可以通过唯一标识(如id)来判断。 改进版本(使用唯一标识): ```javascript isRowSelected(row) { const table = this.$refs.multipleTable; if (table) { const selection = table.store.states.selection; // 假设每行数据有一个唯一标识id return selection.some(item => item.id === row.id); } return false; } ``` 综上所述,用户可以根据具体场景选择合适的方法。 另外,引用[2]中提到了`onRowClick`方法,但这并不是用于勾选事件的,而是行点击事件,所以不适用于勾选状态的获取。 引用[4]是关于操作栏下拉菜单获取当前行数据,也不直接相关。 因此,我们给出两种方法: 1. 在`@select`事件中,通过判断selection中是否包含当前行来得到当前行勾选状态。 2. 通过ref获取表格实例,然后从store中获取selection,再判断指定行是否在其中(推荐使用唯一标识比较)。 注意:在方法二中,我们需要确保在表格渲染完成后才能通过ref获取表格实例。 下面我们给出一个完整的示例: ```html <template> <el-table ref="multipleTable" :data="tableData" style="width: 100%" @select="handleSelect" @select-all="handleSelectAll" > <el-table-column type="selection" width="55"></el-table-column> <el-table-column prop="date" label="日期" width="180"></el-table-column> <el-table-column prop="name" label="姓名" width="180"></el-table-column> <el-table-column prop="address" label="地址"></el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [/* 你的数据 */] }; }, methods: { handleSelect(selection, row) { // 方法1:在select事件中判断 const isSelected = selection.includes(row); console.log('在事件中:', isSelected); }, handleSelectAll(selection) { console.log('全选', selection); }, // 方法2:通过ref和store判断 isRowSelected(row) { const table = this.$refs.multipleTable; if (table) { const selection = table.store.states.selection; return selection.some(item => item.id === row.id); } return false; } } }; </script> ``` 这样,用户就可以获取当前行数据是否勾选的状态了。 注意:如果表格数据量很大,使用`some`方法遍历可能会影响性能,但由于一般选中的行不会很多,所以可以接受。 另外,如果用户需要实监控某行的选中状态,可以结合计算属性或watch,但需要根据具体需求设计。 最后,如果用户使用Vue3和Element Plus,API可能略有不同,但思路类似。 总结:用户问题“el-table获取当前行数据是否勾选的方法”的答案是: 1. 在`@select`事件中通过selection和当前行判断。 2. 通过ref获取表格实例,然后从store中获取selection数组,再判断当前行是否在数组中(建议用唯一标识比较)。 我们给出了示例代码,用户可以根据需要选择。 </think>在 Element UI 的 el-table获取当前行数据是否勾选,可以通过以下方法实现: ### 推荐方法:使用 `@select` 事件和 `row-key` ```html <el-table ref="myTable" :data="tableData" row-key="id" <!-- 必须设置唯一标识 --> @select="handleSelect" > <el-table-column type="selection" width="55"></el-table-column> <!-- 其他列 --> </el-table> ``` ```javascript methods: { // 获取单行勾选状态 handleSelect(selection, row) { const isSelected = selection.some(item => item.id === row.id) console.log(`行 ${row.id} 勾选状态:`, isSelected) // 实获取状态(替代方案) const currentState = this.$refs.myTable.store.states.selection.includes(row) console.log("实状态:", currentState) } } ``` ### 关键说明: 1. **核心原理**: - `@select` 事件返回两个参数: - `selection`:当前所有已选中的行数据数组 - `row`:当前操作的行数据 - 通过 `selection.includes(row)` 或 `selection.some()` 判断当前行是否选中[^1] 2. **必要设置**: ```html row-key="唯一标识" <!-- 如id --> ``` 避免对象引用比对问题,确保正确识别行数据[^2] 3. **获取状态**: ```javascript // 通过table ref获取选中状态 const tableRef = this.$refs.myTable const isSelected = tableRef.store.states.selection.some( item => item.id === targetRow.id ) ``` 4. **全选状态处理**: ```javascript @select-all="handleSelectAll" handleSelectAll(selection) { this.isAllSelected = selection.length === this.tableData.length } ``` ### 完整示例: ```javascript export default { methods: { // 获取单行勾选状态 checkRowSelection(row) { const selection = this.$refs.myTable.store.states.selection return selection.some(item => item.id === row.id) }, // 操作示例 logSelectionStatus() { this.tableData.forEach(row => { console.log(`行${row.id}`, this.checkRowSelection(row) ? "已选中" : "未选中") }) } } } ``` > **注意事项**: > 1. 必须设置 `row-key` 保证行数据唯一性 > 2. 对象比对建议使用唯一标识(如ID)而非直接比较对象 > 3. 全选状态可通过 `@select-all` 事件处理[^3] > 4. 操作栏获取当前行数据参考 `el-dropdown` 的 `command` 参数[^4] [^1]: 通过 `@select` 事件的 `selection` 参数判断当前行勾选状态 [^2]: 使用 `row-key` 保证行数据唯一性 [^3]: 全选状态可通过 `selection.length` 与总数据量比较 [^4]: 操作栏可通过自定义命令传递行数据
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

接口写好了吗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值