elementui[el-table]toggleRowSelection默認(rèn)多選事件無法選中問題
問題
今天發(fā)現(xiàn)了一個(gè)elment el-table toggleRowSelection事件無法默認(rèn)選中的情況,
我的需求可能需要對(duì)內(nèi)容進(jìn)行一部分修改,比如:我默認(rèn)選中的內(nèi)容必須得通過接口或者其他方式來獲取,然后再默認(rèn)選中
解決方式
// 這里通過循環(huán)選中列表multipleSelection,然后從所有列表tableData中找到需要選中的項(xiàng)來幫助選中,直接使用選中列表來設(shè)置可能會(huì)出錯(cuò)
toggleSelection(rows) {
// multipleSelection是一個(gè)選中數(shù)據(jù)列表
// tableData 是所有的數(shù)據(jù)列表
this.multipleSelection.forEach(row => {
// 不能自己自定義對(duì)象來設(shè)置選中(原因如下分析),那我可以從列表中找到需要選中的那個(gè)對(duì)象,然后把它拿過來作為選中的項(xiàng)就可以了
this.$refs.multipleTable.toggleRowSelection(this.tableData.find(item=>{
return row.name == item.name; // 注意這里尋找的字段要唯一,示例僅參考
}),true);
});
}
另外一種無法選中的方式
原因可能在于vue組件和表格的渲染順序問題。如:代碼執(zhí)行的時(shí)候頁面渲染還未完成。(表格放在dialog之類的彈出框里面)
解決方式:
在循環(huán)的外層加個(gè)$nextTick即可
this.$nextTick(()=>{
this.multipleSelection.forEach(row => {
console.log(row); // 這里僅僅加了個(gè)打印操作
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í)可以進(jìn)行行數(shù)的默認(rèn)選中
(以上都是官方內(nèi)容);
然而我的需求可能需要對(duì)內(nèi)容進(jìn)行一部分修改,比如:我默認(rèn)選中的內(nèi)容必須得通過接口或者其他方式來獲取,然后再默認(rèn)選中
示例如下:
// 這個(gè)假如是通過接口或者其他形勢(shì)獲得的某個(gè)選中行內(nèi)容
// 注意這里多了幾個(gè)字段
multipleSelection: [
{
date: "2016-05-07",
name: "王小虎",
address: "上海市普陀區(qū)金沙江路 1518 弄",
description: '這里是描述',
type: '類型',
id: 'aaaaa111111'
}
]
// 因此我的選中代碼必須得改成如下:
toggleSelection() {
// 循環(huán)multipleSelection,然后將內(nèi)容提取出我要的字段
// 使其于table表行字段對(duì)應(yīng)
this.multipleSelection.forEach(row => {
let arr = {
date: row.date,
name: row.name,
address: row.address
};
// 設(shè)置默認(rèn)選中列
this.$refs.multipleTable.toggleRowSelection(arr,true);
});
}
理論上上面的內(nèi)容應(yīng)該能讓表格中的某一列進(jìn)行選中,
然而現(xiàn)實(shí)是不行的

從上面可以看出來,首部有選擇效果,但是卻內(nèi)容選中內(nèi)容。
現(xiàn)在對(duì)官方示例分析:
toggleSelection(rows) {
if (rows) {
rows.forEach(row => {
console.log(row); // 這里僅僅加了個(gè)打印操作
this.$refs.multipleTable.toggleRowSelection(row);
});
} else {
this.$refs.multipleTable.clearSelection();
}
}
效果如下:此時(shí)可以選中


然后對(duì)代碼進(jìn)行細(xì)微修改
toggleSelection(rows) {
if (rows) {
rows.forEach(row => {
// 區(qū)別僅僅是將內(nèi)容放在arr對(duì)象里面了,用于提取需要的字段
let arr = {
date: row.date,
name: row.name,
address: row.address
}
console.log(arr); // 打印操作
this.$refs.multipleTable.toggleRowSelection(arr);
});
} else {
this.$refs.multipleTable.clearSelection();
}
}
效果如下:首部選中,其他行卻沒選中


這是為什么呢?明明傳入的同樣是一個(gè)對(duì)象啊,而且字段名稱與數(shù)量都是一樣的,然而結(jié)果卻不同?
對(duì)比兩個(gè)打印的內(nèi)容發(fā)現(xiàn)問題:兩個(gè)打印的字段是有一點(diǎn)點(diǎn)細(xì)微的區(qū)別的。然而我個(gè)人實(shí)力有限,無法找到區(qū)別的原理是什么!哎!
有可能是官方的一個(gè)Bug,也可能是官方設(shè)計(jì)如此,可以去官方git上逛逛:
https://github.com/ElemeFE/element/issues
但是問題卻也是可以解決的(在最上面)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Vue+ElementUI踩坑之動(dòng)態(tài)顯示/隱藏表格的列el-table-column問題
- Vue+EleMentUI實(shí)現(xiàn)el-table-colum表格select下拉框可編輯功能實(shí)例
- VUE2.0+ElementUI2.0表格el-table實(shí)現(xiàn)表頭擴(kuò)展el-tooltip
- VUE2.0+ElementUI2.0表格el-table循環(huán)動(dòng)態(tài)列渲染的寫法詳解
- VUE2.0 ElementUI2.0表格el-table自適應(yīng)高度的實(shí)現(xiàn)方法
- elementui實(shí)現(xiàn)表格(el-table)默認(rèn)選中功能
相關(guān)文章
vue3使用el-table實(shí)現(xiàn)新舊數(shù)據(jù)對(duì)比的代碼詳解
這篇文章主要為大家詳細(xì)介紹了在vue3中使用el-table實(shí)現(xiàn)新舊數(shù)據(jù)對(duì)比,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的小伙伴可以參考一下2023-12-12
Vue中引入bootstrap.min.css的正確姿勢(shì)分享
這篇文章主要介紹了Vue中引入bootstrap.min.css的正確姿勢(shì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
vue-router路由懶加載及實(shí)現(xiàn)的3種方式
這篇文章主要給大家介紹了關(guān)于vue-router路由懶加載及實(shí)現(xiàn)的3種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
vue組件屬性(props)及私有數(shù)據(jù)data解析
這篇文章主要介紹了vue組件屬性(props)及私有數(shù)據(jù)data解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
vue3-treeselect數(shù)據(jù)綁定失敗的解決方案
這篇文章主要介紹了vue3-treeselect數(shù)據(jù)綁定失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
基于vue2框架的機(jī)器人自動(dòng)回復(fù)mini-project實(shí)例代碼
本篇文章主要介紹了基于vue2框架的機(jī)器人自動(dòng)回復(fù)mini-project實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-06-06

