解決elementUI中el-tree樹形結(jié)構(gòu)中節(jié)點(diǎn)過濾的問題
elementUI中el-tree樹形結(jié)構(gòu)中節(jié)點(diǎn)過濾
業(yè)務(wù)需求
vue項(xiàng)目,權(quán)限管理模塊中經(jīng)常遇到樹形結(jié)構(gòu)的處理,這篇文章我們講一下樹形結(jié)構(gòu)的節(jié)點(diǎn)過濾問題。在權(quán)限管理中的菜單管理模塊,當(dāng)我們新增菜單是需要選擇它的父級菜單或者目錄(有這樣一個需求,就是菜單下面是可以新增按鈕的,所以新增按鈕就需要選擇它的父級菜單,菜單的父級當(dāng)然只是目錄),那么這里選擇上級菜單或者目錄時(shí)就需要對樹形結(jié)構(gòu)進(jìn)行過濾。
需求分析
處理el-tree的樹形結(jié)構(gòu)過濾問題我們首先會想到遍歷遞歸去給要過濾的節(jié)點(diǎn)的值置空,這樣它既然是空置那么就不會被el-tree樹形渲染,經(jīng)過踩坑這里的答案是不行的,它雖然為空,但還是會占位顯示為空。
這里我使用的是el-tree控件的filter-node-method 方法進(jìn)行過濾。
解決方案
第一步是既然要過濾的節(jié)點(diǎn)置空不行,那么我們就給他設(shè)置一個特殊的過濾值,我用的是'undefined',所以在遞歸遍歷的時(shí)候就給要過濾的節(jié)點(diǎn)的值設(shè)置為'undefined',然后再對樹形數(shù)據(jù)進(jìn)行過濾:
? ? ? ? ?// 樹形數(shù)據(jù)過濾 ? ? ??? ? this.$nextTick(() => { ? ? ? ? ? ? this.$refs.menutree.filter('undefined') ? ? ? ? ? })
第二步,當(dāng)已經(jīng)執(zhí)行樹形數(shù)據(jù)過濾之后,然后在樹形組件上綁定:filter-node-method="filterNode"方法對樹形結(jié)構(gòu)的節(jié)點(diǎn)進(jìn)行過濾:
? ? ? // 樹形節(jié)點(diǎn)過濾 ? ? ? filterNode(value, data, node) { ? ? ? ? // if (!value) return true; ? ? ? ? // 當(dāng)節(jié)點(diǎn)的data.resourcesName里面有值時(shí)展示它,否則過濾它 ? ? ? ? if (data.resourcesName.includes(value)) { ? ? ? ? ? return false ? ? ? ? } else { ? ? ? ? ? return true ? ? ? ? } ? ? ? },
el-tree樹形踩坑
需求:el-tree節(jié)點(diǎn)需要傳選中的父級菜單給后臺,而不是僅僅子節(jié)點(diǎn)。
比如說下方需要將系統(tǒng)管理的節(jié)點(diǎn)id也傳過給后臺。
處理方法
實(shí)現(xiàn):簡單,通過getCheckedNodes()即可,但是需要定義后面的參數(shù)半選節(jié)點(diǎn)為true
遍歷拿到id
let chooseArr = this.$refs.meauTree.getCheckedNodes(false,true); let idList = [] chooseArr.forEach(item=>{ idList.push(item.id); })
普通需求應(yīng)該getCheckedKeys即可滿足。
let chooseArr = this.$refs.meauTree.getCheckedKeys();
回顯菜單
問題來了,回顯菜單的時(shí)候,后臺返回的是包含父節(jié)點(diǎn)的id,于是需要過濾處理。
方法:
遍歷el-tree數(shù)據(jù),看是否有子節(jié)點(diǎn),沒有子節(jié)點(diǎn)則存下id
resolveAllEunuchNodeId(json, idArr, temp) { for (let i = 0; i < json.length; i++) { const item = json[i] // 存在子節(jié)點(diǎn),遞歸遍歷;不存在子節(jié)點(diǎn),將json的id添加到臨時(shí)數(shù)組中 if (item.children && item.children.length !== 0) { this.resolveAllEunuchNodeId(item.children, idArr, temp) } else { temp.push(idArr.filter(id => id === item.id)) } } return temp }
使用:
menuData
樹形結(jié)構(gòu)數(shù)據(jù)menuIds
后臺拿到的包含所有半選的節(jié)點(diǎn)id數(shù)組
// 解析出所有的太監(jiān)節(jié)點(diǎn) this.menuIdList = this.resolveAllEunuchNodeId(this.menuData, menuIds, [])
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
VUE?html5-qrcode實(shí)現(xiàn)H5掃一掃功能實(shí)例
這篇文章主要給大家介紹了關(guān)于VUE?html5-qrcode實(shí)現(xiàn)H5掃一掃功能的相關(guān)資料,html5-qrcode是輕量級和跨平臺的QR碼和條形碼掃碼的JS庫,集成二維碼、條形碼和其他一些類型的代碼掃描功能,需要的朋友可以參考下2023-08-08vue mintui-Loadmore結(jié)合實(shí)現(xiàn)下拉刷新和上拉加載示例
本篇文章主要介紹了vue mintui-Loadmore結(jié)合實(shí)現(xiàn)下拉刷新和上拉加載示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10vue左側(cè)菜單,樹形圖遞歸實(shí)現(xiàn)代碼
這篇文章主要介紹了vue左側(cè)菜單,樹形圖遞歸實(shí)現(xiàn)代碼,非常不錯,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08express+vue+mongodb+session 實(shí)現(xiàn)注冊登錄功能
這篇文章主要介紹了express+vue+mongodb+session 實(shí)現(xiàn)注冊登錄,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-12-12Vue如何實(shí)現(xiàn)分頁功能代碼實(shí)例
這篇文章主要給大家介紹了關(guān)于Vue如何實(shí)現(xiàn)分頁功能的相關(guān)資料,Vue分頁功能的實(shí)現(xiàn)需要前端和后端共同配合完成,文中通過代碼實(shí)例介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09