首页 > 其他分享 >vue element tree 上移下移

vue element tree 上移下移

时间:2022-12-07 21:59:06浏览次数:37  
标签:node vue const parent tree element cIndex data id

效果图

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

 

 

 

 

 

 

 

直接上代码;

<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>

  

  

 

标签:node,vue,const,parent,tree,element,cIndex,data,id
From: https://www.cnblogs.com/zzm131400/p/16964641.html

相关文章

  • Agileboot 1.6.0 发布啦 - 一款致力于规范/精简/可维护 的Springboot + Vue3的快速开
    ⚡平台简介⚡AgileBoot是一套开源的全栈精简快速开发平台,毫无保留给个人及企业免费使用。本项目的目标是做一款精简可靠,代码风格优良,项目规范的小型开发脚手架。适合个人......
  • vue的watch监听器里面如果使用箭头函数需谨慎
    vue.runtime.esm.js:587[Vuewarn]:Errorincallbackforwatcher"form.psiType":"TypeError:Cannotreadpropertiesofundefined(reading'form')"——————......
  • vue-axios接口调用
    post-json格式:exportfunctionsaveScriptInfo(parameter){returnrequest({//headers:{//'Content-Type':'multipart/form-data',//},ur......
  • Vue视频 | 【Vue2 + Vue3 前端教程】完整版
    目前大部分公司还是以vue、react技术为主的,而Vue中还是以Vue2为主流,但不可否认Vue3是未来所必须的且已有这个趋向了今天给大家介绍一个Vue的教程里面既有现在主流的Vue2......
  • vue+element列表排序
    1.默认排序很简单在el-table标签中加入默认属性:default-sort="{prop:'date',order:'descending'}"然后在单独一列中<el-table-columnprop="date"l......
  • 有序Map集合:LinkedHashMap和TreeMap该如何选用
    文章目录​​前言​​​​一、为什么HashMap是无序的​​​​二、LinkedHashMap如何保证有序性​​​​三、TreeMap的底层原理​​​​四、LinkedHashMap和TreeMap比较​​......
  • vue data中的字符串用'和`包含有什么区别?模板字符串
    vuedata中的字符串用'和`包含有什么区别?字段代码我验证过可以正常的执行,但是我不清楚这个``(ESC下面的那个键)在这里和单引号有什么区别,请教大佬们作者:李李链接:https......
  • vue父子组件的传值总结
    情况一:父组件给子组件传值方法,使用props父页面:parent.vue<template><divclass="sidebar_contianer"><sidebar-item:routerData="transmitData"></sideb......
  • vue2 中实现全局事件组件通信
    Date:2022-11-1117:38:37Author:gavin目的:实现兄弟组件数据传输First:insertbelowcodeSecond:发布事件,aSecond:订阅事件,a识别一个好的前端开源项目的方法......
  • Vue 实时获取屏幕宽高
    exportdefault{name:'page-index',data(){return{windowWidth:document.documentElement.clientWidth,//实时屏幕宽度......