vue element tree 上移下移

效果图

需求是:上边没有了应该取最后一个    下边没有了 应该取第一个

 

 

 

 

 

 

 

直接上代码;

<template>
 <el-tree
      :key="tree_key"
      v-loading="treeLoading"
      :data="data"
      node-key="id"
      :props="defaultProps"
      :default-expanded-keys="defaultExpand"
      :highlight-current="true"
      :expand-on-click-node="false"
    >
      <span slot-scope="{ node, data}" class="custom-tree-node">
        <div>
          <span
            v-if="data.children"
            class="el-icon-folder-opened"
          >  </span>
          <span v-else class="el-icon-folder" style="margin-right: 3px"></span>
          <span>{{ node.label }}</span>
        </div>
        <span class="button">
          <el-button v-if="data.level<5" type="text" :disabled="data.type===1" size="mini" @click="() => append(data)"><i class="el-icon-plus" /> </el-button>
          <el-button :disabled="data.type===1" type="text" size="mini" @click="() => edit(data)"> <i class="el-icon-edit-outline" /> </el-button>
          <el-button :disabled="data.type===1" type="text" size="mini" @click="() => remove( data)"><i class="el-icon-delete" /> </el-button>
          <el-button :disabled="data.type===1" type="text" size="mini" @click="() => sortMove(1,data,node)"> <i class="el-icon-top" /></el-button>
          <el-button :disabled="data.type===1" type="text" size="mini" @click="() => sortMove(2,data,node)"> <i class="el-icon-bottom" /></el-button>
        
          <!-- <el-button v-if="data.level<5&&data.type!==1" type="text" :disabled="data.type===1" size="mini" @click="() => append(data)"><i class="el-icon-plus" /> </el-button>
          <el-button v-if="data.type!==1" :disabled="data.type===1" type="text" size="mini" @click="() => edit(data)"> <i class="el-icon-edit-outline" /> </el-button>
          <el-button v-if="data.type!==1" :disabled="data.type===1" type="text" size="mini" @click="() => remove( data)"><i class="el-icon-delete" /> </el-button>
          <el-button v-if="data.type!==1" :disabled="data.type===1" type="text" size="mini" @click="() => sortMove(1,data,node)"> <i class="el-icon-top" /></el-button>
          <el-button v-if="data.type!==1" :disabled="data.type===1" type="text" size="mini" @click="() => sortMove(2,data,node)"> <i class="el-icon-bottom" /></el-button> -->
        </span>
      </span>
    </el-tree>
</template>
<script>

    sortMove(type, data, node) {
      if (type === 1) {
        this.nodeUp(data, node);// 上移
      } else if (type === 2) {
        this.nodeDown(data, node);// 下移
      }
    },
    nodeUp(data, node) {
      const parent = node.parent;
      let configData = {
        from_id: '',
        to_id: ''
      };
      /*
      * node.parent.childNodes
      * <1 不移动
        >1 根据data.id findIndex node.parent.childNodes  找出索引
           索引
           0
           长度-1
      */
      const children = parent.data.children || parent.data;
      const cIndex = children.findIndex(d => d.id === data.id);
      if (parent.level === 0 && cIndex === 0) {
        return;
      } else if (parent.level !== 0 && cIndex === 0) {
        // 不同父节点中移动
        if (node.parent.childNodes.length <= 1) {
          this.$message.error('只能在同一父节点中移动!');
          return;
        } else if (node.parent.childNodes.length > 1) {
          const lastId = node.parent.childNodes.slice(-1).map(item => item.key);
          configData = {
            from_id: data.id,
            to_id: lastId.toString()
          };
        }
      } else if (
        (parent.level === 0 && cIndex !== 0) ||
        (parent.level !== 0 && cIndex !== 0)
      ) {
        const tempChildrenNodex1 = children[cIndex - 1];// to_id

        const tempChildrenNodex2 = children[cIndex]; // from_id
        configData = {
          from_id: tempChildrenNodex2.id,
          to_id: tempChildrenNodex1.id
        };
       
        this.defaultExpand[0] = data.id;
      }
      this.initRealodTree(configData); //请求后端接口方法
      this.tree_key++;
    },
    
    nodeDown(data, node) {
      const parent = node.parent;
      let configDataDown = {
        from_id: '',
        to_id: ''
      };
      const children = parent.data.children || parent.data;
      const cIndex = children.findIndex(d => d.id === data.id);
      const cLength = children.length - 1; // 最边上的节点
      const allLevel = node.parent.childNodes.length;
      if (parent.level === allLevel && cIndex === cLength) {
        // 最最末的节点
        this.$message.error('处于最低端不能在下移动!');
        return;
      } else if (parent.level !== allLevel && cIndex === cLength) {
        // 父节点不同
        if (node.parent.childNodes.length <= 1) {
          this.$message.error('只能在同一父节点中移动!');
          return;
        } else if (node.parent.childNodes.length > 1) {
          configDataDown = {
            from_id: data.id,
            to_id: node.parent.childNodes[0].key
          };
        }
      } else if (
        (parent.level === allLevel && cIndex !== cLength) ||
        (parent.level !== allLevel && cIndex !== cLength)
      ) {
        // 父节点相同

        const tempChildrenNodex1 = children[cIndex + 1];

        const tempChildrenNodex2 = children[cIndex];

        configDataDown = {
          from_id: tempChildrenNodex2.id,
          to_id: tempChildrenNodex1.id
        };
       
        this.defaultExpand[0] = data.id;
      }
      this.initRealodTree(configDataDown);//请求后端接口方法

      this.tree_key++;
    },
   initRealodTree(){}
</script>

  

  

 

posted @ 2022-12-07 21:40  小十六哇  阅读(508)  评论(0编辑  收藏  举报