**需求介绍**:
~~~
页面需求:
左侧展示菜单的树结构
右侧默认展示添加菜单的页面
点击菜单之后显示编辑菜单页面
添加菜单页面有保存 删除 重置按钮
编辑菜单页 面有 修改 添加子节点 删除按钮
功能需求:
左侧 树结构可以无限制的添加节点 拖拽 查询(查询结果显示完整的树结构)同级上下移动 删除
右侧 页面能够添加 编辑 删除节点 可以增删改每个菜单页面的操作按钮
~~~
**实现方案**:
1: 页面布局:
父组件index.vue 分为左右两部分
![](https://img.kancloud.cn/1a/20/1a20aa6b84a90f12dd305bc152b5b51f_815x403.png)
右侧页面加载子组件(加载子组件方法:1:父组件import 子组件 2:export default 中的components 中添加子组件的名称 3:页面加载是使用子组件名标签)
1:引入子组件
![](https://img.kancloud.cn/e7/60/e7604c47fab11649d835c15e09fb0afa_515x62.png)
2:添加组件
![](https://img.kancloud.cn/2e/28/2e288bd49135c016f602f633d9852f7f_330x303.png)
3:使用组件
![](https://img.kancloud.cn/52/63/52637fe98a1eae38edd57f861e20f1cc_634x130.png)
ref的作用:父组件调用子组件的方法
![](https://img.kancloud.cn/16/f2/16f2803e61b3ae57069f0e5951dea85d_635x157.png)
子组件调用父组件的方法 可以用:this.$parent
示例:
![](https://img.kancloud.cn/cf/60/cf60535ff924fe29e28b68ed47f6bc1a_495x45.png)
2:功能实现:
1:使用树控件 (参考api:[https://www.antdv.com/components/tree-cn/](https://www.antdv.com/components/tree-cn/))
![](https://img.kancloud.cn/60/a0/60a0db1aa26cb68849d7c3ceb070f989_511x359.png)
~~~
异步加载数据 defaultExpandAll 无法生效 需要加载判断 v-if="orgTree.length" 获取到数据之后再加载组件
draggable : 允许节点拖拽
drop: 拖拽时放手触发的函数
showLine: 显示虚线
selectedKeys :选中的节点
tree-data: 数据
defaultExpandAll:默认展开所有节点
主要有两个函数一个是选中节点select 再一个是拖拽drop
handleSelect(selectKey,info){
// selectKey 选中节点的key值 这个是控件自动算的
//info 包括选中节点的所有信息 可以获取选中节点的详细信息
}
OnDrop(info){
const dropKey = info.node.eventKey // 目标节点
const dragKey = info.dragNode.eventKey // 移动节点
const dropPos = info.node.pos.split('-')
const dropPosition = info.dropPosition - Number(dropPos[dropPos.length - 1]); // 目标节点的上方还是下方 上方-1 下方 1 移动至目标里面 即成为子节点 为0
info.dropToGap // 移动至目标节点的上方还是下方时存在 如果移动至目标节点里面则不存在
}
~~~