iview的tree元件,設定expand不生效,以及全部展開和全部合併的實現
阿新 • • 發佈:2019-01-14
前端框架用到了iview,使用tree元件的時候,資料是動態繫結的,頁面控制元件呼叫如下:
<Tree :data="taskTreeData"></Tree>
methods中初始化資料的方法如下:
initTree() { let _this = this; //呼叫後臺查詢樹的資訊,此處略過,後臺查詢的返回結果示例如下 var treeData = [ { title: "模型任務", children: [ { title: "單次任務", children: [ { title: "單次任務-1" } ] }, { title: "定時任務" } ] }, { title: "同步資料任務", children: [ { title: "日任務" } ] }, { title: "指標預警任務" } ]; _this.taskTreeData = _this.treeAddRend(treeData); }
methods中全部展開或全部合併的方法如下:
//展開或合併樹,當flag為true時全部展開,flag為false時全部合併 exchangeTree(flag) { this.taskTreeData = this.treeChangeExpand(this.taskTreeData, flag); }, //遞迴給樹設定expand treeChangeExpand(treeData, flag) { let _this = this; for (var i = 0; treeData && i < treeData.length; i++) { treeData[i].expand = flag; if (treeData[i].children) { treeData[i].children = _this.treeChangeExpand(treeData[i].children,flag); } } return treeData; }
測試發現並不生效。
對比發現,不呼叫上述自己寫的treeChangeExpand方法設定expand,而是在初始化的時候就直接在treeData中寫expand,如下:
則console.log(this.taskTreeData),結果有expand並且有expand的get和set方法,如下,
而呼叫上述treeChangeExpand方法新增expand以後,打印出來的結果中有expand但沒有expand的get和set方法。如下:
參考了https://blog.csdn.net/preferG/article/details/78278032,發現原來vue直接在json資料中新增屬性是不行的,無法生成get和set方法,而需要使用vue的set方法。
將上述的treeChangeExpand方法改為如下,問題解決:
treeChangeExpand(treeData, flag) {
let _this = this;
for (var i = 0; treeData && i < treeData.length; i++) {
this.$set(treeData[i],'expand',flag); //重要!用set方法
if (treeData[i].children) {
treeData[i].children = _this.treeChangeExpand(treeData[i].children,flag);
}
}
return treeData;
}