elementui[el-table]toggleRowSelection默認多選事件無法選中問題
問題
今天發(fā)現(xiàn)了一個elment el-table toggleRowSelection事件無法默認選中的情況,
我的需求可能需要對內(nèi)容進行一部分修改,比如:我默認選中的內(nèi)容必須得通過接口或者其他方式來獲取,然后再默認選中
解決方式
// 這里通過循環(huán)選中列表multipleSelection,然后從所有列表tableData中找到需要選中的項來幫助選中,直接使用選中列表來設(shè)置可能會出錯 toggleSelection(rows) { // multipleSelection是一個選中數(shù)據(jù)列表 // tableData 是所有的數(shù)據(jù)列表 this.multipleSelection.forEach(row => { // 不能自己自定義對象來設(shè)置選中(原因如下分析),那我可以從列表中找到需要選中的那個對象,然后把它拿過來作為選中的項就可以了 this.$refs.multipleTable.toggleRowSelection(this.tableData.find(item=>{ return row.name == item.name; // 注意這里尋找的字段要唯一,示例僅參考 }),true); }); }
另外一種無法選中的方式
原因可能在于vue組件和表格的渲染順序問題。如:代碼執(zhí)行的時候頁面渲染還未完成。(表格放在dialog之類的彈出框里面)
解決方式:
在循環(huán)的外層加個$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 的多選內(nèi)容:
官方代碼如圖:
<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]])">切換第二、第三行的選中狀態(tài)</el-button> <el-button @click="toggleSelection()">取消選擇</el-button> </div> </template>
<script> export default { data() { return { tableData: [{ date: '2016-05-03', name: '王小虎', address: '上海市普陀區(qū)金沙江路 1518 弄' }, { date: '2016-05-02', name: '王小虎', address: '上海市普陀區(qū)金沙江路 1518 弄' }, { date: '2016-05-04', name: '王小虎', address: '上海市普陀區(qū)金沙江路 1518 弄' }, { date: '2016-05-01', name: '王小虎', address: '上海市普陀區(qū)金沙江路 1518 弄' }, { date: '2016-05-08', name: '王小虎', address: '上海市普陀區(qū)金沙江路 1518 弄' }, { date: '2016-05-06', name: '王小虎', address: '上海市普陀區(qū)金沙江路 1518 弄' }, { date: '2016-05-07', name: '王小虎', address: '上海市普陀區(qū)金沙江路 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>
上面的代碼就是官方代碼、使用效果如下:
從圖中看,確實可以進行行數(shù)的默認選中
(以上都是官方內(nèi)容);
然而我的需求可能需要對內(nèi)容進行一部分修改,比如:我默認選中的內(nèi)容必須得通過接口或者其他方式來獲取,然后再默認選中
示例如下:
// 這個假如是通過接口或者其他形勢獲得的某個選中行內(nèi)容 // 注意這里多了幾個字段 multipleSelection: [ { date: "2016-05-07", name: "王小虎", address: "上海市普陀區(qū)金沙江路 1518 弄", description: '這里是描述', type: '類型', id: 'aaaaa111111' } ]
// 因此我的選中代碼必須得改成如下: toggleSelection() { // 循環(huán)multipleSelection,然后將內(nèi)容提取出我要的字段 // 使其于table表行字段對應(yīng) this.multipleSelection.forEach(row => { let arr = { date: row.date, name: row.name, address: row.address }; // 設(shè)置默認選中列 this.$refs.multipleTable.toggleRowSelection(arr,true); }); }
理論上上面的內(nèi)容應(yīng)該能讓表格中的某一列進行選中,
然而現(xiàn)實是不行的
從上面可以看出來,首部有選擇效果,但是卻內(nèi)容選中內(nèi)容。
現(xiàn)在對官方示例分析:
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 => { // 區(qū)別僅僅是將內(nèi)容放在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(); } }
效果如下:首部選中,其他行卻沒選中
這是為什么呢?明明傳入的同樣是一個對象啊,而且字段名稱與數(shù)量都是一樣的,然而結(jié)果卻不同?
對比兩個打印的內(nèi)容發(fā)現(xiàn)問題:兩個打印的字段是有一點點細微的區(qū)別的。然而我個人實力有限,無法找到區(qū)別的原理是什么!哎!
有可能是官方的一個Bug,也可能是官方設(shè)計如此,可以去官方git上逛逛:
https://github.com/ElemeFE/element/issues
但是問題卻也是可以解決的(在最上面)。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue3使用el-table實現(xiàn)新舊數(shù)據(jù)對比的代碼詳解
這篇文章主要為大家詳細介紹了在vue3中使用el-table實現(xiàn)新舊數(shù)據(jù)對比,文中的示例代碼講解詳細,具有一定的參考價值,需要的小伙伴可以參考一下2023-12-12Vue中引入bootstrap.min.css的正確姿勢分享
這篇文章主要介紹了Vue中引入bootstrap.min.css的正確姿勢,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10vue組件屬性(props)及私有數(shù)據(jù)data解析
這篇文章主要介紹了vue組件屬性(props)及私有數(shù)據(jù)data解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10vue3-treeselect數(shù)據(jù)綁定失敗的解決方案
這篇文章主要介紹了vue3-treeselect數(shù)據(jù)綁定失敗的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05基于vue2框架的機器人自動回復mini-project實例代碼
本篇文章主要介紹了基于vue2框架的機器人自動回復mini-project實例代碼,具有一定的參考價值,有興趣的可以了解一下2017-06-06