**需求介绍**: ~~~ 页面需求: 左侧展示菜单的树结构 右侧默认展示添加菜单的页面 点击菜单之后显示编辑菜单页面 添加菜单页面有保存 删除 重置按钮 编辑菜单页 面有 修改 添加子节点 删除按钮 功能需求: 左侧 树结构可以无限制的添加节点 拖拽 查询(查询结果显示完整的树结构)同级上下移动 删除 右侧 页面能够添加 编辑 删除节点 可以增删改每个菜单页面的操作按钮 ~~~ **实现方案**: 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 // 移动至目标节点的上方还是下方时存在 如果移动至目标节点里面则不存在 } ~~~