el-tree相关问题

<template>
  <div id="app" style="padding:50px">
    <el-button type="primary" size="mini" @click="showAll">全部展开</el-button>
    <el-button type="primary" size="mini" @click="notShowAll">全部收缩</el-button>
    <div style="300px;height:500px;border:1px solid red; overflow: scroll;">
      <el-tree
        node-key="id"
        :data="treeData"
        :props="defaultProps"
        :default-expand-all="defaultExpand"
        :expand-on-click-node="false"
        ref="tree"
      >
        <span class="custom-tree-node" slot-scope="{ node, data }">
          <span v-if="data.status==0">{{ node.label }}</span>
          <el-input size="mini" v-else v-model="rename"></el-input>
          <span>
            <el-button type="text" size="mini">添加</el-button>
            <el-button type="text" size="mini">删除</el-button>
            <el-button type="text" size="mini" @click="change(node,data)">修改</el-button>
          </span>
        </span>
      </el-tree>
    </div>
  </div>
</template>

<script>
import Children from "./components/children";

import { xxx } from "./mixins/mixins";
export default {
  mixins: [xxx],
  data() {
    return {
      rename: "",
      currentID: "",
      defaultExpand: true, //默认展开全部
      defaultProps: {
        children: "mychildrnes",
        label: "name"
      },
      treeData: [
        {
          name: "四川省",
          number: 105,
          parentsId: "",
          id: "1",
          mychildrnes: [
            {
              name: "成都市",
              number: 98,
              parentsId: "1",
              id: "11",
              mychildrnes: [
                {
                  name: "双流区",
                  number: 55,
                  parentsId: "11",
                  id: "111",
                  mychildrnes: [
                    {
                      name: "双流区地名1",
                      number: 55,
                      parentsId: "111",
                      id: "1111",
                      mychildrnes: []
                    },
                    {
                      name: "双流区地名2",
                      number: 15,
                      parentsId: "111",
                      id: "1112",
                      mychildrnes: []
                    }
                  ]
                },
                {
                  name: "高新区",
                  number: 66,
                  parentsId: "11",
                  id: "112",
                  mychildrnes: [
                    {
                      name: "高新区地名1",
                      number: 55,
                      parentsId: "112",
                      id: "1121",
                      mychildrnes: []
                    },
                    {
                      name: "高新区地名2中和",
                      number: 15,
                      parentsId: "112",
                      id: "1122",
                      mychildrnes: []
                    }
                  ]
                },
                {
                  name: "天府新区",
                  number: 88,
                  parentsId: "11",
                  id: "113",
                  mychildrnes: []
                }
              ]
            },
            {
              name: "绵阳市",
              number: 48,
              parentsId: "1",
              id: "12",
              mychildrnes: [
                {
                  name: "梓潼县",
                  number: 96,
                  parentsId: "12",
                  id: "121",
                  mychildrnes: []
                }
              ]
            }
          ]
        },
        {
          name: "云南省",
          number: 89,
          parentsId: "",
          id: "2",
          mychildrnes: []
        }
      ]
    };
  },

  methods: {
    repeat(array) {
      array.forEach(item => {
        item.name = item.name + "[" + item.number + "]";
        item.status = 0;
        if (item.mychildrnes.length !== 0) {
          //调用自己
          return this.repeat(item.mychildrnes);
        }
      });
    },
    showAll() {
      this.defaultExpand = true; //展开所有节点
      for (let i = 0; i < this.$refs.tree.store._getAllNodes().length; i++) {
        this.$refs.tree.store._getAllNodes()[i].expanded = this.defaultExpand;
      }
    },
    notShowAll() {
      //必须唯一键值  node-key="id"必须要不然不行

      this.defaultExpand = false; //收缩所有节点
      for (let i = 0; i < this.$refs.tree.store._getAllNodes().length; i++) {
        this.$refs.tree.store._getAllNodes()[i].expanded = this.defaultExpand;
      }
    },
    change(node, data) {
      //修改无非就在展示框和输入框之间切换v-if 切换 v-show不行(获取焦点有问题)

      this.rename = data.name;
      this.currentID = data.id;
      let arryHH=[] //vue 数组改变 不刷新问题
      this.treeData.forEach(item=>{
          arryHH.push(item)
      })
      
      for (let i = 0; i < arryHH.length; i++) {
        if (arryHH[i].id == this.currentID) {
          arryHH[i].status = 1;
          return;
        } else if (arryHH[i].mychildrnes.length !== 0) {
          this.repeatTwo(arryHH[i].mychildrnes);
        }
      }
      this.treeData=[]
     arryHH.forEach(item=>{
          this.treeData.push(item)
      })
      
      console.log(this.treeData, "++");
    },
    repeatTwo(array) {
      for (let i = 0; i < array.length; i++) {
        if (array[i].id == this.currentID) {
          array[i].status = 1;
          return;
        } else if (array[i].mychildrnes.length !== 0) {
          return this.repeatTwo(array[i].mychildrnes);
        }
      }
    }
  },
  created() {
    this.treeData.forEach(item => {
      item.name = item.name + "[" + item.number + "]";
      item.status = 0; //手动添加键值0 展示1 输入框可修改
      if (item.mychildrnes.length !== 0) {
        //递归循环(因为层级不止3级很可能是N级)
        this.repeat(item.mychildrnes);
      }
    });
    console.log(this.treeData);
  }
};
</script>

<style scope lang='scss'>
// 超出范围滚动条
.el-tree>.el-tree-node{
    min-100%;
    display: inline-block;
}
</style>

  

原文地址:https://www.cnblogs.com/myfirstboke/p/14141362.html