基于ElementUI中Table嵌套實現(xiàn)多選的示例代碼
前言:
寫這個是因為幫朋友修改項目中的bug
我也是第一次寫這個功能,有不對的希望大家指正,如果看完有幫助點個贊!
代碼中關鍵是js中Tree的路徑查找這個核心,有不懂的自行百度
多了不說了,有需要的可以私信找我要代碼,來看下我怎么實現(xiàn)的
思路:
從頭開始看這個需求,我們需要知道用到哪寫東西
1、表格Table
2、多選&全選
3、嵌套數(shù)據(jù)(下拉操作)
正好我們可以找下ElementUI官方文檔

找到了我們需要用到的API
- 在嵌套數(shù)據(jù)的時候需要使用tree-props
- 選中數(shù)據(jù)的時候使用toggleRowSelection
基本就以上這些能用到的可以開搞了
實現(xiàn):
基于以上我們可以寫出HTML結構
<template>
<div>
<el-table
ref="multipleTable"
:data="tableData"
style="width: 100%; margin-bottom: 20px"
row-key="id"
border
default-expand-all
:select-on-indeterminate="true"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
@select="rowSelect"
@select-all="selectAll"
>
<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>
</div>
</template>
表格的多選我可以分為2項目,1個是正向選中,意思就是checkout為true的時候,2是反向取消就是checkout為false的時候,那下面我就來分析下這個正向選中和反向取消如何實現(xiàn)
一、正向選中
假設我有這樣的數(shù)據(jù)
以下面圖1片為例:
在點擊子節(jié)點的時候我們需要把子節(jié)點的父節(jié)點和跟節(jié)點同時進行選中處理
跟節(jié)點-父節(jié)點-子節(jié)點
圖2是我data中聲明的數(shù)據(jù),數(shù)據(jù)中包含isChecked是否被選中和children是否有子節(jié)點


現(xiàn)在我們正向選中思路明確了那我們怎么來實現(xiàn)?
當我點擊子節(jié)點時候需要記錄子節(jié)點的父節(jié)點一直到跟節(jié)點,那我們就用到了Tree樹的概念
下面代碼用到了樹的回溯的思想,查找路徑使用先序遍歷,因為你不確定你點擊的是子節(jié)點是在哪個子樹上,
具體的Tree方法思想請百度一下;
treeFindPath(tree, func, path = []) {
if (!tree) return [];
for (const data of tree) {
path.push(data);
if (func(data)) return path;
if (data.children) {
const findChildren = this.treeFindPath(data.children, func, path);
if (findChildren.length) return findChildren;
}
path.pop();
}
return [];
},
通過上面這段代碼我們調用的時候傳節(jié)點的id會返回一個數(shù)組,數(shù)組包含它所在路徑上的對象,這樣我們就可以通過循環(huán)遍歷這個數(shù)組通過toggleRowSelection反法來實現(xiàn)頁面狀態(tài)樣式的改變。
二、反向取消
反向取消正好和選中相反
在點擊子節(jié)點取消的時候我們需要判斷同級的節(jié)點是不是都取消了,如果都取消了需要把這個節(jié)點的父節(jié)點改為取消狀態(tài),之后再查其父節(jié)點同級是否都是取消狀態(tài),如果還有取消狀態(tài),同理跟剛才方式一樣接著向其上級節(jié)點查找直到不滿足條件為止,跳出循環(huán)。
簡單的來個示意圖

在點擊4節(jié)點時,會查看同級節(jié)點5和6是否是取消狀態(tài),如果都是取消狀態(tài),查他們的上一級2,把2改為false,在查2的同級3是否是取消如果是取消在查1
如果同級有選中狀態(tài)會直接跳出循環(huán)不進行下一步操作
下面是取消選中代碼
還是用Tree的代碼,把獲取的數(shù)組reverse()進行了翻轉
第一次循環(huán)從點擊那個節(jié)點網上查找
這里使用for循環(huán)如果不滿足直接終止后面循環(huán)

三、全選
這里我感覺寫的比較啰嗦,
全選時候我會先通過數(shù)據(jù)中isChecked來遞歸判斷是否有沒有選中的
如果有沒有選中會遞歸執(zhí)行把所有數(shù)據(jù)中的isChecked變?yōu)閠rue,如果都選中了,會遞歸修改為false,
下面是全選的所有代碼
/**
* @describe 全選
*/
selectAll(selection) {
console.log(selection);
let isAllCheck = this.selectAllRecursion(this.tableData);
// 是否有aa為false代表是有沒選中
this.checkoutAll(this.tableData, !isAllCheck);
},
/**
* @describe 遞歸判斷isChecked是否都是true,false代表是有沒選中
*/
selectAllRecursion(arr) {
let isCheck = true;
function isRecursion(arr) {
arr.forEach((item) => {
if (!item.isChecked) {
isCheck = false;
if (item.children) {
isRecursion(item.children);
}
}
});
}
isRecursion(arr);
return isCheck;
},
/**
* @describe 把所有的夠改為true或者false
*/
checkoutAll(arr, boole) {
var _this = this;
function allCheck(arr, boole) {
arr.forEach((item) => {
item.isChecked = boole;
_this.$refs.multipleTable.toggleRowSelection(item, boole);
if (item.children) {
allCheck(item.children, boole);
}
});
}
allCheck(arr, boole);
},
END:
基本代碼就以上這些,不包含表格分頁功能
到此這篇關于基于ElementUI中Table嵌套實現(xiàn)多選的示例代碼的文章就介紹到這了,更多相關ElementUI Table嵌套多選內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Vue 使用高德地圖添加點標記 + 點擊地圖獲取坐標 + 帶搜索(即地
這篇文章主要介紹了Vue 使用高德地圖添加點標記 + 點擊地圖獲取坐標 + 帶搜索(即地理編碼 + 逆地理編碼) 附完整示例,本文結合示例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧2024-01-01
淺談vue項目4rs vue-router上線后history模式遇到的坑
今天小編就為大家分享一篇淺談vue項目4rs vue-router上線后history模式遇到的坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09

