這篇文章給大家介紹使用ElementUI怎么實現一個table嵌套功能,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
<template> <div> <el-table ref="multipleTable" :data="tableData" 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的時候,那下面我就來分析下這個正向選中和反向取消如何實現
假設我有這樣的數據
以下面圖1片為例:
在點擊子節點的時候我們需要把子節點的父節點和跟節點同時進行選中處理
跟節點-父節點-子節點
圖2是我data中聲明的數據,數據中包含isChecked是否被選中和children是否有子節點
現在我們正向選中思路明確了那我們怎么來實現?
當我點擊子節點時候需要記錄子節點的父節點一直到跟節點,那我們就用到了Tree樹的概念
下面代碼用到了樹的回溯的思想,查找路徑使用先序遍歷,因為你不確定你點擊的是子節點是在哪個子樹上,
具體的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 []; },
通過上面這段代碼我們調用的時候傳節點的id會返回一個數組,數組包含它所在路徑上的對象,這樣我們就可以通過循環遍歷這個數組通過toggleRowSelection反法來實現頁面狀態樣式的改變。
反向取消正好和選中相反
在點擊子節點取消的時候我們需要判斷同級的節點是不是都取消了,如果都取消了需要把這個節點的父節點改為取消狀態,之后再查其父節點同級是否都是取消狀態,如果還有取消狀態,同理跟剛才方式一樣接著向其上級節點查找直到不滿足條件為止,跳出循環。
簡單的來個示意圖
在點擊4節點時,會查看同級節點5和6是否是取消狀態,如果都是取消狀態,查他們的上一級2,把2改為false,在查2的同級3是否是取消如果是取消在查1
如果同級有選中狀態會直接跳出循環不進行下一步操作
下面是取消選中代碼
還是用Tree的代碼,把獲取的數組reverse()進行了翻轉
第一次循環從點擊那個節點網上查找
這里使用for循環如果不滿足直接終止后面循環
這里我感覺寫的比較啰嗦,
全選時候我會先通過數據中isChecked來遞歸判斷是否有沒有選中的
如果有沒有選中會遞歸執行把所有數據中的isChecked變為true,如果都選中了,會遞歸修改為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); },
關于使用ElementUI怎么實現一個table嵌套功能就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。