效果图

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

直接上代码;

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

  

  

vue element tree 上移下移的更多相关文章

  1. vue 实现模块上移下移 实现排序

    效果图 上移 下移 首先想到的是 数组的相互替换嘛 <template> <div> <div class="box" v-for="(it ...

  2. vue+element tree(树形控件)组件(2)

    今天记录组件的代码和一个调用它的父组件的代码,接口接收数据直接传element直接能用的,也就是经过上一章函数处理过的数据以下是代码 父组件 <template> <commonfi ...

  3. vue+element tree(树形控件)组件(1)

    最近做了第一个组内可以使用的组件,虽然是最简版,也废了不少力.各位前辈帮我解决问题,才勉强搞定.让我来记录这个树形组件的编写过程和期间用到的知识点. 首先说说需求,就是点击出现弹窗+蒙板,弹窗内容是一 ...

  4. VUE+element tree 实现权限管理

    先写个标题~ ~,后续有空在写 具体功能: 1. 获取所有角色权限列表展示,点击进行编辑,编辑用terr树形结构显示页面结构 2.提交的数据格式(页面名称,角色ID,父节点ID,子节点ID) 3.后面 ...

  5. table中实现数据上移下移效果

    html 由于vue+Element项目中的table,没有开放的上移下移的api,但是能对数据操作,故思路为数组中的一条数据,再重新添加一条数据,办法有点笨,但是好歹也是实现了,望有好的办法的,请留 ...

  6. 循序渐进VUE+Element 前端应用开发(3)--- 动态菜单和路由的关联处理

    在我开发的很多系统里面,包括Winform混合框架.Bootstrap开发框架等系列产品中,我都倾向于动态配置菜单,并管理对应角色的菜单权限和页面权限,实现系统对用户权限的控制,菜单一般包括有名称.图 ...

  7. 循序渐进VUE+Element 前端应用开发(7)--- 介绍一些常规的JS处理函数

    在我们使用VUE+Element 处理界面的时候,往往碰到需要利用JS集合处理的各种方法,如Filter.Map.reduce等方法,也可以设计到一些对象属性赋值等常规的处理或者递归的处理方法,以前对 ...

  8. 循序渐进VUE+Element 前端应用开发(8)--- 树列表组件的使用

    在我前面随笔<循序渐进VUE+Element 前端应用开发(6)--- 常规Element 界面组件的使用>里面曾经介绍过一些常规的界面组件的处理,主要介绍到单文本输入框.多文本框.下拉列 ...

  9. 循序渐进VUE+Element 前端应用开发(10)--- 基于vue-echarts处理各种图表展示

    在我们做应用系统的时候,往往都会涉及图表的展示,综合的图表展示能够给客户带来视觉的享受和数据直观体验,同时也是增强客户认同感的举措之一.基于图表的处理,我们一般往往都是利用对应第三方的图表组件,然后在 ...

  10. 循序渐进VUE+Element 前端应用开发(26)--- 各种界面组件的使用(2)

    在我们使用Vue+Element开发前端的时候,往往涉及到很多界面组件的使用,其中很多直接采用Element官方的案例即可,有些则是在这个基础上封装更好利用.更少代码的组件:另外有些则是直接采用第三方 ...

随机推荐

  1. 网络负载均衡LVS

    目录 集群负载均衡 一.网络协议原理 1.1 七层模型 什么是协议 1.2 五层模型 1.3 TCP协议 面向连接 表头参数缓存验证 Recv-Q/Send-Q 四元组 TCP三次握手 验证 TCP四 ...

  2. 摄像头的MIPI接口、DVP接口和CSI接口

    电脑摄像头接口是USB接口,智能手机的摄像头接口是MIPI接口,还有一部分的摄像头(比如说某些支持DVP接口的硬件)是DVP接口. USB是串行通用串行总线(Universal Serial Bus) ...

  3. 了解了一下Cookie

    昨天做接口测试被Cookie折腾得云里雾里的,今天下午有时间特意了解了一下. 一:Edge浏览器查看Cookie的路径:设置->Cookie和网站权限 二:一个cookies包含以下信息:(1) ...

  4. joda实现时间工具类

    1.获取当前时间 (底层代码一致) val time1 = new DateTime() val time2 = DateTime.now() //底层调用的就是new DateTime() 2.格式 ...

  5. 我与CSP的一点小事

    今天是20220311 见了YG老师,感觉被打了鸡血.然后想当初研一的时候,有了这篇LeetCode习题集 现在突然有了一点刺激之后,决定记录下这次的CSP经历,说无论怎么样是the shit,这次就 ...

  6. ctp认证权限

    现象: /sys/firmware/dmi/tables/smbios_entry_point: Permission denied/dev/mem: Permission denied/sys/fi ...

  7. SQL自动生成表结构Excel说明文档

    针对已经存在表结构,快速生成整理表结构文档. SELECT字段中文名 = isnull(G.[value],''),字段名 = A.name,类型 = B.name,标识 = Case When CO ...

  8. K8s高可用集群部署(四)

    k8s官网高可用部署参考:https://kubernetes.io/docs/setup/independent/high-availability/                 目录 一 ,k ...

  9. geoserver官网

    https://www.osgeo.cn/geoserver-user-manual/index.html

  10. js内置方法

    数组:        1.push()数组最后添加元素,pop()数组删除最后一个: unshift()数组开头添加元素,shift()删除数字第一个: 注意:push()和unshift()可以添加 ...