elementui[el-table]toggleRowSelection默认多选事件无法选中问题

 更新时间:2023年11月17日 16:46:45   作者:墨水白云  
这篇文章主要介绍了elementui[el-table]toggleRowSelection默认多选事件无法选中问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

问题

今天发现了一个elment el-table toggleRowSelection事件无法默认选中的情况,

我的需求可能需要对内容进行一部分修改,比如:我默认选中的内容必须得通过接口或者其他方式来获取,然后再默认选中

解决方式

// 这里通过循环选中列表multipleSelection,然后从所有列表tableData中找到需要选中的项来帮助选中,直接使用选中列表来设置可能会出错
toggleSelection(rows) {
  // multipleSelection是一个选中数据列表
  // tableData 是所有的数据列表
  this.multipleSelection.forEach(row => {
    // 不能自己自定义对象来设置选中(原因如下分析),那我可以从列表中找到需要选中的那个对象,然后把它拿过来作为选中的项就可以了
  	this.$refs.multipleTable.toggleRowSelection(this.tableData.find(item=>{
      return row.name == item.name;  // 注意这里寻找的字段要唯一,示例仅参考
    }),true);
  });
}

另外一种无法选中的方式

原因可能在于vue组件和表格的渲染顺序问题。如:代码执行的时候页面渲染还未完成。(表格放在dialog之类的弹出框里面) 

解决方式:

在循环的外层加个$nextTick即可

this.$nextTick(()=>{
	this.multipleSelection.forEach(row => {
	    console.log(row); // 这里仅仅加了个打印操作
	    this.$refs.multipleTable.toggleRowSelection(this.tableData.find(item=>{
      		return row.name == item.name;  // 注意这里寻找的字段要唯一,示例仅参考
   		}),true);
	});
})

分析

自己研究了一下elementUI el-table 的多选内容:

官方代码如图:

<template>
  <el-table
    ref="multipleTable"
    :data="tableData"
    tooltip-effect="dark"
    style="width: 100%"
    @selection-change="handleSelectionChange">
    <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 style="margin-top: 20px">
    <el-button @click="toggleSelection([tableData[1], tableData[2]])">切换第二、第三行的选中状态</el-button>
    <el-button @click="toggleSelection()">取消选择</el-button>
  </div>
</template>

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

    methods: {
      toggleSelection(rows) {
        if (rows) {
          rows.forEach(row => {
            this.$refs.multipleTable.toggleRowSelection(row);
          });
        } else {
          this.$refs.multipleTable.clearSelection();
        }
      },
      handleSelectionChange(val) {
        this.multipleSelection = val;
      }
    }
  }
</script>

上面的代码就是官方代码、使用效果如下:

从图中看,确实可以进行行数的默认选中

(以上都是官方内容);

然而我的需求可能需要对内容进行一部分修改,比如:我默认选中的内容必须得通过接口或者其他方式来获取,然后再默认选中

示例如下:

// 这个假如是通过接口或者其他形势获得的某个选中行内容
// 注意这里多了几个字段
multipleSelection: [
  {
    date: "2016-05-07",
    name: "王小虎",
    address: "上海市普陀区金沙江路 1518 弄",
    description: '这里是描述',
    type: '类型',
    id: 'aaaaa111111'
  }
]
// 因此我的选中代码必须得改成如下:
toggleSelection() {
  // 循环multipleSelection,然后将内容提取出我要的字段
  // 使其于table表行字段对应
  this.multipleSelection.forEach(row => {
    let arr = {
      date: row.date,
      name: row.name,
      address: row.address
    };
    // 设置默认选中列
    this.$refs.multipleTable.toggleRowSelection(arr,true);
  });
}

理论上上面的内容应该能让表格中的某一列进行选中,

然而现实是不行的

从上面可以看出来,首部有选择效果,但是却内容选中内容。

现在对官方示例分析:

toggleSelection(rows) {
  if (rows) {
     rows.forEach(row => {
       console.log(row); // 这里仅仅加了个打印操作
       this.$refs.multipleTable.toggleRowSelection(row);
     });
   } else {
     this.$refs.multipleTable.clearSelection();
   }
}

效果如下:此时可以选中

然后对代码进行细微修改

toggleSelection(rows) {
  if (rows) {
     rows.forEach(row => {
       // 区别仅仅是将内容放在arr对象里面了,用于提取需要的字段
       let arr = {
       		date: row.date,
      		name: row.name,
      		address: row.address
       }
       console.log(arr); // 打印操作
       this.$refs.multipleTable.toggleRowSelection(arr);
     });
   } else {
     this.$refs.multipleTable.clearSelection();
   }
}

效果如下:首部选中,其他行却没选中

这是为什么呢?明明传入的同样是一个对象啊,而且字段名称与数量都是一样的,然而结果却不同?

对比两个打印的内容发现问题:两个打印的字段是有一点点细微的区别的。然而我个人实力有限,无法找到区别的原理是什么!哎!

有可能是官方的一个Bug,也可能是官方设计如此,可以去官方git上逛逛:

https://github.com/ElemeFE/element/issues

但是问题却也是可以解决的(在最上面)。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue router 动态路由清除方式

    vue router 动态路由清除方式

    这篇文章主要介绍了vue router 动态路由清除方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • vue3全局导入bootstrap5方式

    vue3全局导入bootstrap5方式

    这篇文章主要介绍了vue3全局导入bootstrap5方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • Vue-cli proxyTable 解决开发环境的跨域问题详解

    Vue-cli proxyTable 解决开发环境的跨域问题详解

    本篇文章主要介绍了Vue-cli proxyTable 解决开发环境的跨域问题详解,非常具有实用价值,需要的朋友可以参考下
    2017-05-05
  • vue如何动态生成andv图标

    vue如何动态生成andv图标

    这篇文章主要介绍了vue如何动态生成andv图标问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • 解决vue路由后界面没有变化,但是链接有的问题

    解决vue路由后界面没有变化,但是链接有的问题

    今天小编就为大家分享一篇解决vue路由后界面没有变化,但是链接有的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • 详细聊聊vue中组件的props属性

    详细聊聊vue中组件的props属性

    父子组件之间的通信就是props down,events up,父组件通过属性props向下传递数据给子组件,子组件通过事件events 给父组件发送消息,这篇文章主要给大家介绍了关于vue中组件的props属性的相关资料,需要的朋友可以参考下
    2021-11-11
  • vue3双向绑定实现原理解读

    vue3双向绑定实现原理解读

    这篇文章主要介绍了vue3双向绑定实现原理解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • 一文详解如何用Three.js和Vue 3实现3D商品展示

    一文详解如何用Three.js和Vue 3实现3D商品展示

    Three.js是一个基于JavaScript的开源库,用于在网页上创建和显示3D图形,这篇文章主要介绍了如何用Three.js和Vue 3实现3D商品展示的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-07-07
  • vue+tsc+noEmit导致打包报TS类型错误问题及解决方法

    vue+tsc+noEmit导致打包报TS类型错误问题及解决方法

    当我们新建vue3项目,package.json文件会自动给我添加一些配置选项,这写选项基本没有问题,但是在实际操作过程中,当项目越来越复杂就会出现问题,本文给大家分享vue+tsc+noEmit导致打包报TS类型错误问题及解决方法,感兴趣的朋友一起看看吧
    2023-10-10
  • Vue中的计算属性computed传参方式

    Vue中的计算属性computed传参方式

    这篇文章主要介绍了Vue中的计算属性computed传参方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11

最新评论