element-tree组件简单用法

前言:最近开发中用到element-tree组件,再次做个笔记记录一哈,不喜勿喷!!!谢谢

1、在项目中我们需要用的层级有4级,超过以后就给个提示就行;每条数据上都有新增子级、删除、修改

2、按照官网给的实例,每条数据后面都会跟上新增、删除按钮,自我定制:当鼠标移上去才显示新增、删除按钮

   官网给的实例:

  自己修改后:

3、修改当前数据的名称、并上传到后台,在重新从后台获取到数据显示在页面上

以上问题就是写这个文档的目的!话不多说了   直接上代码!

首先是html代码

<el-tree ref="SlotTree" :data="setTree" :props="defaultProps" default-expand-all highlight-current :expand-on-click-node="false" :node-key="NODE_KEY">
        <div class="comp-tr-node" slot-scope="{ node, data }">
           <!-- 编辑状态 -->
           <template v-if="node.isEdit">
              <el-input
                v-model="data.jgMc"
                autofocus
                size="small"
                :ref="'slotTreeInput'+data[NODE_KEY]"
                @blur.stop="handleInput(node, data)"
                @keyup.enter.native="handleInput(node, data)"></el-input>
            </template>
           <!-- 非编辑状态 -->
           <template v-else>
            <!-- 名称: 新增节点增加class(is-new) -->
            <span :class="[data[NODE_KEY] < NODE_ID_START ? 'is-new' : '', 'comp-tr-node--name']">
              <span>{{ data.jgMc }}</span>
            </span>
              <!-- 按钮 -->
              <span class="comp-tr-node--btns">
                <!-- 新增 -->
                <el-button icon="el-icon-plus" size="mini" circle type="primary" @click="handleAdd(node, data)"></el-button>
                <!-- 编辑 -->
                <el-button icon="el-icon-edit" size="mini" circle type="info" @click="handleEdit(node, data)"></el-button>
                <!-- 删除 -->
                <el-button icon="el-icon-delete" size="mini" circle type="danger" @click="handleDelete(node, data)"></el-button>
              </span>
           </template>
         </div>
      </el-tree>

接下来是css代码(tree-box:是tree外层的div class名)

  .tree-box >>> .el-tree-node {
    line-height:45px;
  }
  .tree-box >>> .el-tree-node__content{
    height:45px;
    line-height:45px;
  }
  .comp-tr-top{
    margin-left:10%;
  }
  .comp-tr-node{
    height:45px;
  }
  .comp-tr-node >>> .is-new{
    font-weight: bold;
  }
  .comp-tr-node >>> .comp-tr-node--name{
    width:270px;
    display: inline-block;
    line-height: 45px;
  }
  .tree-box >>> .el-tree-node__expand-icon{
    font-size:26px;
  }
  .comp-tr-node--btns{
    opacity:0;
  }
  .el-tree-node__content:hover  .comp-tr-node--btns{
    opacity:1;
  }

  最后是js代码

data(){
      return{
        backupsMode:false,
        signTree:false,//判断tree是新增还是修改
        setTree: [],// tree数据
        NODE_KEY: 'id',// id对应字段
        MAX_LEVEL: 4,// 设定最大层级
        NODE_ID_START: 0,// 新增节点id,逐次递减
        startId: null,
        defaultProps: {// 默认设置
          children: 'jg',
          label: 'jgMc'
        },
        initParam: {// 新增参数
          jgMc: '请填写备件库名',
          pid: 0,
          children: []
        },
      }
    },

  

      // 删除节点
      handleDelete(_node, _data){
        console.log(_node, _data)
        // 判断是否存在子节点
        if(_data.jg && _data.jg.length !== 0){
          this.$message.error("此节点有子级,不可删除!")
          return false;
        }else{
          // 删除操作
          let DeletOprate = () => {
            this.$refs.SlotTree.remove(_data)
            //这个可以填写删除当前数据的接口
          }
          // 二次确认
          let ConfirmFun = () => {
            this.$confirm("是否删除此节点?","提示",{
              confirmButtonText: "确认",
              cancelButtonText: "取消",
              type: "warning"
            }).then(() => {
              DeletOprate()
            }).catch(() => {})
          }
          // 判断是否新增:新增节点直接删除,已存在的节点要二次确认
          _data[this.NODE_KEY] < this.NODE_ID_START ? DeletOprate() : ConfirmFun()
        }
      },
      // 修改节点
      handleInput(_node, _data){
        console.log(_node, _data)
        if(_node.isEdit){
          this.$set(_node, 'isEdit', false)
          // 填写修改节点的接口
        }
      },
      // 编辑节点
      handleEdit(_node, _data){
        console.log(_node, _data)
        if(!_node.isEdit){
          this.$set(_node, 'isEdit', true)
        }
        // 输入框聚焦
        this.$nextTick(() => {
          if(this.$refs['slotTreeInput'+_data[this.NODE_KEY]]){
            this.$refs['slotTreeInput'+_data[this.NODE_KEY]].$refs.input.focus()
          }
        })
      },
      // 新增节点
      handleAdd(_node, _data){
        console.log(_node, _data)
        // 判断层级
        if(_node.level >= this.MAX_LEVEL){
          this.$message.warning("当前已达到"+ this.MAX_LEVEL + "级,无法新增!")
          return false;
        }
        // 参数修改
        let obj = JSON.parse(JSON.stringify(this.initParam));// copy参数
        console.log(obj)
        obj.pid = _data.jgId;// 父id
        obj[this.NODE_KEY] = ++this.startId;// 节点id:逐次递增id
        // 判断字段是否存在
        if(!_data.jg){
          this.$set(_data, 'jg', [])
        }
        // 新增数据
        _data.jg.push(obj)
        // 展开节点
        // _node.expanded = true
        if(!_node.expanded){
          _node.expanded = true
        }
      },
      // 添加顶部节点
      handleAddTop(){
        let obj = JSON.parse(JSON.stringify(this.initParam));// copy参数
        obj[this.NODE_KEY] = ++this.startId;// 节点id:逐次递增id
        this.setTree.push(obj)
        console.log(this.setTree)
      },                

  

posted @ 2021-07-16 10:11  zhumeng_WEB  阅读(1243)  评论(0编辑  收藏  举报