1. 程式人生 > >iview的tree元件,設定expand不生效,以及全部展開和全部合併的實現

iview的tree元件,設定expand不生效,以及全部展開和全部合併的實現

前端框架用到了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;
    }