el-table复选改为单选问题 ( @selection-change获取的数据不止当前数据 )

关于el-table复选改单选的方法网上挺多的, 就不再赘述了, 贴一个相关方法的链接: 

https://blog.csdn.net/mqq_12/article/details/105817330

 

根据这个链接中的方法写完之后发现 @selection-change 事件中获取的数据不只是当前选中的, 还有上次选中数据

分别在 @select 和 @selection-change 里面把数据打印出来看一下

// @select 事件方法
singleSelect (selection, row) {
        console.log('触发清空事件');
        this.$refs.authTable.clearSelection()
        console.log('清空事件完成');
        if (selection.length === 0) return
        console.log('触发选中事件');
        this.$refs.authTable.toggleRowSelection(row, true)
        console.log('选中事件完成');
    }

// @selection-change 事件方法
selGroup (val) {
      console.log('选中的数据--------', val);

}

打印如下:

el-table复选改为单选问题 ( @selection-change获取的数据不止当前数据 )

 

 

 

分析一下, 多选框再次点击的时候是会触发一次 @selection-change 事件的( 此时数据为2条 ), 但是不知道是事件优先级还是阻塞的问题, 这一次事件被放在 @select 后面去执行了, 也就是先执行完了 @select 事件 中的清空( 

this.$refs.authTable.clearSelection())方法,然后又执行了 this.$refs.authTable.toggleRowSelection(row, true) 方法把当前点击的数据选中

这个时候重点来了----之前阻塞的 @selection-change 事件执行了, 所以上面打印出来的数据就可以看出来, 最后获取到的数据是两条.

 

解决办法: 

// 改为异步执行
async singleSelect (selection, row) {
        console.log('触发清空事件');
        await this.$refs.authTable.clearSelection()
        console.log('清空事件完成');
        if (selection.length === 0) return
        console.log('触发选中事件');
        this.$refs.authTable.toggleRowSelection(row, true)
        console.log('选中事件完成');
    }

 

改为异步执行后打印数据为: 

el-table复选改为单选问题 ( @selection-change获取的数据不止当前数据 )

 

 上面所说的被阻塞的事件在清空数据之后紧跟着执行了,  this.$refs.authTable.toggleRowSelection(row, true) 成了最后执行的方法, 这样获取到的数据就是正常的了.

至于为什么改为异步之后阻塞的方法会提前执行我也搞不清楚.

按我的理解, 点击其他复选框的时候应该先执行 @selection-change 事件, 然后 @select 里面清空数据, 再将最后一次点击的数据选中, 也就是这个样子

el-table复选改为单选问题 ( @selection-change获取的数据不止当前数据 )

 

 

以上仅为个人分析, 文笔不好, 技术也菜, 如果有什么说的不对的地方还望大家多多指正~

上一篇:使用vue仿淘宝放大镜


下一篇:Vue的ref和$refs