文章目录
需求分析
- 需求分析
- 代码实现
通过拖拽节点, 改变节点顺序和父子关系的功能. 在elemenetUI中, 树形控件有可拖拽节点 ,
拖拽能否被放置的参数 Function(draggingNode, dropNode, type) draggingNode: 当前被拖拽的节点 type: type 参数有三种情况:‘prev’、‘inner’ 和 ‘next’,分别表示放置在目标节点前、插入至目标节点和放置在目标节点后 dropNode: 目标节点 示例代码中有allow-drop
通过allowDrop , 返回true和false , 来判断能否进行拖拽
能否拖动的逻辑判断: 无论是拖动任何节点, 拖动完成后, 树的深度不能大于3 . 当前节点, 加上被拖到的父节点, 以及该父节点的层数不能大于3
测试拖动打印
存储树的最大深度
能否进行拖拽 的方法
计算节点深度的方法
完整代码如下 :
{{ node.label }}
箭头函数 调用指定的方法 -->
Append
update
Delete
取 消
确 定
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如:import 《组件名称》 from '《组件路径》';
export default {
//import引入的组件需要注入到对象中才能使用
components: {},
data() {
return {
// 存储树的最大深度
maxLevel: 0,
// 弹框的标题
title: "",
// 操作类型 是修改还是新增
dialogType: "",
//表单的值
category: {
name: "",
parentCid: 0,
catLevel: 0,
showStatus: 1,
sort: 0,
catId: null,
productUnit: "",
icon: "",
},
dialogVisible: false,
menus: [],
expandedkey: [],
defaultProps: {
children: "children",
label: "name",
},
};
},
methods: {
getMenus() {
this.$http({
url: this.$http.adornUrl("/product/category/list/tree"),
method: "get",
}).then(({ data }) => {
console.log("成功获取到菜单数据 .... ", data.data);
this.menus = data.data;
});
},
// 能否进行拖拽
allowDrop(draggingNode, dropNode, type) {
// 1. 被拖动的当前节点 以及所在的父节点总层数不能大于3
// 1) 被拖动的当前节点的深度
console.log("allowDrop: ", draggingNode, dropNode, type);
//递归计算 当前正在拖动的节点深度, 存储到maxLevel 中
this.countNodeLevel(draggingNode.data);
// 2) 当前正在拖动的节点深度+ 父节点所在的深度 不大于3
console.log("当前正在拖动节点的深度: ", this.maxLevel);
// 实际的深度
let deep = (this.maxLevel - draggingNode.data.catLevel) +1 ;
console.log("深度: ", this.deep);
if (type =="inner") {
// 把某个菜单, 拖进某个菜单里面的时候, 需要进行当前节点的深度和被拖进去的节点的深度相加是否大于3
return (deep+dropNode.level) {
this.category.name = data.data.name;
this.category.catId = data.data.catId;
this.category.icon = data.data.icon;
this.category.productUnit = data.data.productUnit;
this.category.parentCid = data.data.parentCid;
});
},
//点击确定后,发送修改分类数据
editCategory() {
//修改发送的数据. 注意只提交要修改的数据和id , 不能提交其他数据, 否则数据库中会修改其他数据为默认值,导致数据丢失.
var { catId, name, icon, productUnit } = this.category;
this.$http({
url: this.$http.adornUrl("/product/category/update"),
method: "post",
data: this.$http.adornData({ catId, name, icon, productUnit }, false),
}).then(({ data }) => {
//添加成功后的操作
this.$message({
type: "success",
message: "分类修改成功!",
});
this.getMenus();
this.expandedkey = [this.category.parentCid];
this.category.name = "";
this.category.productUnit = "";
this.category.icon = "";
this.dialogVisible = false;
});
},
//添加分类
addCategory() {
//点击添加分类, 关闭表单
this.dialogVisible = false;
console.log("提交的表单数据: ", this.category);
this.$http({
url: this.$http.adornUrl("/product/category/save"),
method: "post",
data: this.$http.adornData(this.category, false),
}).then(({ data }) => {
//添加成功后的操作
this.$message({
type: "success",
message: "分类添加成功!",
});
this.getMenus();
this.expandedkey = [this.category.parentCid];
this.category.name = "";
});
},
// 点击树形的 append, 触发的方法, data为点击的父节点数据
append(data) {
console.log("append ", data);
this.dialogType = "add";
this.title = "添加分类";
//点击 append 弹出添加分类的对话框
this.dialogVisible = true;
//父级的id
this.category.parentCid = data.catId;
//分类的层级, 当前层级, 加一
this.category.catLevel = data.catLevel * 1 + 1;
//赋初始化值
this.category.name = "";
this.category.productUnit = "";
this.category.icon = "";
this.category.catId = null;
this.category.sort = 0;
},
remove(node, data) {
//console.log("remove ", node, data);
this.$confirm(`是否删除 [ ${data.name} ] 菜单?`, "提示", {
confirmButtonText: "确定", // 点击确定, 触发then
cancelButtonText: "取消", // 点击取消 触发 catch ,由于取消不需要任何的操作, 但删除catch会报错, 因此保留空方法
type: "warning",
})
.then(() => {
var idArr = [data.catId];
this.$http({
url: this.$http.adornUrl("/product/category/delete"),
method: "post",
data: this.$http.adornData(idArr, false),
}).then(({ data }) => {
this.$message({
type: "success",
message: "删除成功!",
});
//expandedkey = node.parent.data.catId;
this.getMenus();
this.expandedkey = [node.parent.data.catId];
});
})
.catch(() => {});
},
},
//监听属性 类似于data概念
computed: {},
//监控data中的数据变化
watch: {},
//方法集合
//生命周期 - 创建完成(可以访问当前this实例) 组件创建完成就发送请求
created() {
this.getMenus();
},
//生命周期 - 挂载完成(可以访问DOM元素)
mounted() {},
beforeCreate() {}, //生命周期 - 创建之前
beforeMount() {}, //生命周期 - 挂载之前
beforeUpdate() {}, //生命周期 - 更新之前
updated() {}, //生命周期 - 更新之后
beforeDestroy() {}, //生命周期 - 销毁之前
destroyed() {}, //生命周期 - 销毁完成
activated() {}, //如果页面有keep-alive缓存功能,这个函数会触发. 页面被激活就会发送请求
};