自己封裝element-ui樹組件的過濾


前言:vue開發項目時用到了element-ui的樹組件,但是發現一執行過濾事件,樹就全部都展開了,為了解決這個問題,只能自己先過濾數劇,再賦值給樹組件的data,就避免了一上來全部展開的尷尬。

一、簡單版本

  1         data() {
  2             return {
  3                 shopsData: [],
  4                 arrData: [{
  5                     label: '一級 1',
  6                     children: [{
  7                         label: '二級 1-1',
  8                         children: [{
  9                             label: '三級 1-1-1'
 10                         }]
 11                     }]
 12                 }, {
 13                     label: '一級 2',
 14                     children: [{
 15                         label: '二級 2-1',
 16                         children: [{
 17                             label: '三級 2-1-1'
 18                         }]
 19                     }, {
 20                         label: '二級 2-2',
 21                         children: [{
 22                             label: '三級 2-2-1'
 23                         }]
 24                     }]
 25                 }, {
 26                     label: '一級 3',
 27                     children: [{
 28                         label: '二級 3-1',
 29                         children: [{
 30                             label: '三級 3-1-1'
 31                         }]
 32                     }, {
 33                         label: '二級 3-2',
 34                         children: [{
 35                             label: '三級 3-2-1'
 36                         }]
 37                     }]
 38                 }]
 39             }
 40         },
 41         methods: {
 42             filterByName(menu, type, name) { //過濾樹組件
 43                 var menuNew = [];
 44                 for (var i = 0; i < menu.length; i++) {
 45                     var nodeNew = undefined;
 46                     var node = menu[i]; //同級的每一個根節點
 47                     var childrenNode = node.children; //子節點
 48                     var childrenMenu = [];
 49 
 50                     if (childrenNode) {
 51                         if (childrenNode.length > 0) { //子節點下面的子節點遞歸
 52                             childrenMenu = this.filterByName(childrenNode, type, name);
 53                         }
 54                     }
 55 
 56                     if (childrenMenu) {
 57                         if (childrenMenu.length > 0) {
 58                             nodeNew = new Object();
 59                             nodeNew = this.nodeFillNewFromOld(node, nodeNew);
 60                             nodeNew.sublist = childrenMenu; //復制子節點
 61                         } else {
 62                             if (this.checkNodeEquals(node, type, name)) {
 63                                 nodeNew = new Object();
 64                                 nodeNew = this.nodeFillNewFromOld(node, nodeNew);
 65                             }
 66                         }
 67                     }
 68                     if (nodeNew) {
 69                         menuNew.push(nodeNew);
 70                     }
 71                 }
 72 
 73                 return menuNew;
 74             },
 75             nodeFillNewFromOld(oldNode, newNode) { //添加屬性
 76                 newNode.disabled = oldNode.disabled;
 77                 newNode.enabled = oldNode.enabled;
 78                 newNode.level = oldNode.level;
 79                 newNode.name = oldNode.name;
 80                 newNode.onlyHasShop = oldNode.onlyHasShop;
 81                 newNode.orgType = oldNode.orgType;
 82                 newNode.orgcode = oldNode.orgcode;
 83                 newNode.parentCode = oldNode.parentCode;
 84                 newNode.prmType = oldNode.prmType;
 85                 newNode.showPage = oldNode.showPage;
 86                 newNode.children = oldNode.children;
 87 
 88                 return newNode;
 89             },
 90             checkNodeEquals(node, type, name) { //過濾條件
 91                 if (node.type === 2) {
 92                     node.disabled = true
 93                 }
 94                 if (node.orgcode.indexOf(name) === 0) {
 95                     return true;
 96                 } else {
 97                     return false;
 98                 }
 99             }
100         },
101         mounted() {
102             this.shopsData = this.filterByName(this.arrData, 'label', '二級 2-1');
103         }

二、升級版本

 1         filterTree(nodes, predicate, childKey = 'children') { //predicate過濾條件函數
 2             if (!nodes || !nodes.length) return void 0
 3             const children = []
 4             for (let node of nodes) {
 5                 node = Object.assign({}, node)
 6                 const sub = this.filterTree(node[childKey], predicate, childKey)
 7                 if ((sub && sub.length) || predicate(node)) {
 8                     sub && (node[childKey] = sub)
 9                     children.push(node)
10                 }
11             }
12             return children.length ? children : void 0
13         },
14         shopfilterNode(data) { //過濾條件
15             if (data.orgType === 2) {
16                 data.disabled = true
17             }
18             return data.prmType >= 0 && data.orgcode.indexOf(this.groupcode) === 0;
19         },
20         mounted() {
21             this.shopsData = this.filterTree(this.arrData, this.shopfilterNode, 'sublist')
22         }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM