element的el-tree多選樹(復選框)父子節(jié)點關聯不關聯
屬性check-strictly
官方文檔提供屬性check-strictly,在顯示復選框的情況下,是否嚴格的遵循父子不互相關聯的做法,默認為 false。
而此屬性的意思是:
默認false,父子關聯。有如下現象及問題:
1、當你通過函數設置勾選節(jié)點的時候,只要父節(jié)點被勾選子節(jié)點必會勾選上,即便設置勾選的list中無此子節(jié)點。
2、當你點擊勾選復選框時候,若點擊父節(jié)點,其下子節(jié)點全部統(tǒng)一跟隨父節(jié)點變化;若點擊子節(jié)點,子節(jié)點部分勾選時父節(jié)點處于半選狀態(tài),子節(jié)點全部勾選時父節(jié)點選中,子節(jié)點全部不勾選時父節(jié)點未選中。
設置true,嚴格的遵循父子不互相關聯。
1、當你通過函數設置勾選節(jié)點的時候,嚴格通過設置勾選的list中有無此節(jié)點來斷定是否勾選。
2、當你點擊勾選復選框時候,無論點擊的哪個節(jié)點只會改變當前節(jié)點的勾選狀態(tài),不存在半選狀態(tài)。
系統(tǒng)的角色菜單控制的問題
問題來了,在系統(tǒng)的角色菜單控制的時候,需要滿足以下條件:
1、當通過函數設置勾選節(jié)點的時候,需要嚴格通過設置勾選的list中有無此節(jié)點來斷定是否勾選,即勾選父節(jié)點而不一定勾選全部子節(jié)點。
2、當點擊勾選復選框時候,若點擊父節(jié)點,其下子節(jié)點全部統(tǒng)一跟隨父節(jié)點變化。
3、當點擊勾選復選框時候,若點擊子節(jié)點,子節(jié)點部分勾選時父節(jié)點處于半選狀態(tài),子節(jié)點全部勾選時父節(jié)點選中,子節(jié)點全部不勾選時父節(jié)點未選中。
需求思考:
一、check-strictly=false,行不通
按照需要滿足的條件,明顯靠近將check-strictly設置為false,于是從check-strictly=false父子互相關聯的基礎入手,需要解決的問題就是:
將尚未全部勾選的子節(jié)點對應的父節(jié)點改為半勾選狀態(tài),但是查找文檔良久無果。
只有getHalfCheckedKeys和getHalfCheckedNodes,并沒有設置成半勾選。
二、check-strictly=true,試一試
只能試一下將check-strictly設置為true,從check-strictly=true嚴格的遵循父子不互相關聯入手,需要解決的問題就是:
1、當點擊勾選復選框時候,若點擊父節(jié)點,其下子節(jié)點全部統(tǒng)一跟隨父節(jié)點變化。
2、當點擊勾選復選框時候,若點擊子節(jié)點,子節(jié)點部分勾選時父節(jié)點處于半選狀態(tài),子節(jié)點全部勾選時父節(jié)點選中,子節(jié)點全部不勾選時父節(jié)點未選中。
而在嚴格的父子不互相關聯時,點擊父子節(jié)點不會出現半選狀態(tài),也無法通過函數設置半選狀態(tài),無奈簡化解決問題:
1、當點擊勾選復選框時候,若狀態(tài)為 選中 :
1.1、其所有 父節(jié)點 (父節(jié)點、父節(jié)點的父節(jié)點以此類推)全部統(tǒng)一跟隨當前節(jié)點變化為 選中 。
1.2、其下 子節(jié)點 全部統(tǒng)一跟隨父節(jié)點變化為 選中 。
2、當點擊勾選復選框時候,若狀態(tài)為 未選中 ,其下 子節(jié)點 全部統(tǒng)一跟隨父節(jié)點變化為 未選中 。
解決代碼:
1、el-tree標簽屬性
<el-tree ref="tree" :data="treeMenus" :props="multiProps" :show-checkbox="true" node-key="menuId" highlight-current :expand-on-click-node="false" :default-checked-keys="checkedId" :check-strictly="true" @check="clickDeal">
node-key:每個樹節(jié)點用來作為唯一標識的屬性,整棵樹應該是唯一的。標識節(jié)點唯一的鍵值名稱。
default-checked-keys = checkedId:對應el-tree多選樹組件初始化時默認選中ID
check-strictly = true:是否嚴格的遵循父子不互相關聯的做法
check:當復選框被點擊的時候觸發(fā)的方法
props:配置選項,具體看下圖。

而根據后臺的返回,針對:props=“multiProps”,我的配置為:
multiProps: {
children: 'childs',
label: 'name',
disabled: this.isDisabled
}
識別childs字段為子節(jié)點name為節(jié)點名稱,而默認是識別children為子節(jié)點label為節(jié)點名稱。
2、el-tree組件有變化時給多選樹重新賦值
updated () {
// 給多選樹設置默認值
this.$refs.tree.setCheckedKeys(this.checkedId)
},
checkedId為勾選節(jié)點的數組,不區(qū)分父子節(jié)點。
3、復選框點擊時的特殊處理
clickDeal (currentObj, treeStatus) {
// 用于:父子節(jié)點嚴格互不關聯時,父節(jié)點勾選變化時通知子節(jié)點同步變化,實現單向關聯。
let selected = treeStatus.checkedKeys.indexOf(currentObj.menuId) // -1未選中
// 選中
if (selected !== -1) {
// 子節(jié)點只要被選中父節(jié)點就被選中
this.selectedParent(currentObj)
// 統(tǒng)一處理子節(jié)點為相同的勾選狀態(tài)
this.uniteChildSame(currentObj, true)
} else {
// 未選中 處理子節(jié)點全部未選中
if (currentObj.childs.length !== 0) {
this.uniteChildSame(currentObj, false)
}
}
},
// 統(tǒng)一處理子節(jié)點為相同的勾選狀態(tài)
uniteChildSame (treeList, isSelected) {
this.$refs.tree.setChecked(treeList.menuId, isSelected)
for (let i = 0; i < treeList.childs.length; i++) {
this.uniteChildSame(treeList.childs[i], isSelected)
}
},
// 統(tǒng)一處理父節(jié)點為選中
selectedParent (currentObj) {
let currentNode = this.$refs.tree.getNode(currentObj)
if (currentNode.parent.key !== undefined) {
this.$refs.tree.setChecked(currentNode.parent, true)
this.selectedParent(currentNode.parent)
}
},
到此這篇關于element的el-tree多選樹(復選框)父子節(jié)點關聯不關聯的文章就介紹到這了,更多相關element el-tree多選樹不關聯內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
前端文件導出設置responseType為blob時遇到的問題及解決
這篇文章主要給大家介紹了關于前端文件導出設置responseType為blob時遇到的問題及解決方法,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09
vue3模塊創(chuàng)建runtime-dom源碼解析
這篇文章主要為大家介紹了vue3模塊創(chuàng)建runtime-dom源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01

