# m-tree #### 本组件为 leo-tree 增强版 #### 本插件基于 作者: leo9012 发行的leo-tree v1.0.1 #### email:121959858@qq.com #### props #### data 数据源 #### defaultProps 配置选项,return { id: 'id', label: 'label', children: 'children' } #### emit #### 参数: :data tree数据原{id:1, label:'', children:[]} 每个节点必须有children,无子节点设置为[]; :divider 开启节点间分割线, true or false; 不设置为false; :edit 开启编辑功能,数据true or false; 不设置为false; :unfold 控制默认展开状态, true 为默认展开状态 or false为默认收缩状态; 不设置为false; 开启后在节点右边增加 + - ↑ ↓按钮,可以绑定up-item down-item add-item,delete-item,long-press事件; #### 方法: @node-click 监听节点点击事件 返回节点数据 {id: id, label: label, pid: pid,* 节点所有数据}; @up-item 监听节点up上移事件 返回节点数据{item: this.item, items: this.items, index: this.index}; @down-item 监听节点down下移事件 返回节点数据 {item: this.item, items: this.items, index: this.index}; @add-item 监听节点新增事件 返回节点数据 {id: id, label: label, pid: pid,* 节点所有数据}; id:0时根节点新增,id:x, 为对应x节点建立子节点; @edit-item 监听节点编辑事件 返回节点ID {id: id, label: label, pid: pid,* 节点所有数据}; @delete-item 监听节点删除事件 返回节点ID {id: id}; @finger-action 监听节点滑动事件 返回节点数据 {item:选择节点数据, items: 选择节点同级列表,action:number}; action:1上滑, 2下滑,3左滑,4右滑 @long-press 监听节点长按事件 返回节点数据 {id: id, label: label, pid: pid,* 节点所有数据}; ### 使用 #### 本组件符合easycom规范,HBuilderX 2.5.5起,只需将本组件导入项目,在页面template中即可直接使用,无需在页面中import和注册components。 <template> <view class="content"> <view class="user-box"> <m-tree class="u-p-l-40" ref="mtree" :defaultProps="defaultProps" :data="tree" :divider="divider" :edit="edit" :unfold="true" @node-click="nodeClick" @up-item="upNode" @down-item="downNode" @add-item="addNode" @edit-item="editNode" @delete-item="deleteNode" @finger-action="fingerAction" @long-press="longpressNode"></m-tree> </view> </view> </template> <script> export default { data() { return { /* tree 数据 */ defaultProps: { id: 'id', // 此项为id项的key children: 'children', // 此项为修改子集数据的key label: 'label' // 此项为修改显示数据的key }, divider: false, edit: true, tree: [ { checked: false, children: [{ children: [{ children: [], id: 111, label:"芙蓉区", name: "芙蓉区", pid: "11" }], id: 11, label:"长沙市", name: "长沙市", pid: "1" } ], id: 1, label:"湖南省", name: "湖南省", pid: "0" } ] } }, methods: { //遍历id节点并删除 removeNodeData(datas, id){ //遍历树 获取id数组 for(var i in datas){ if(id===datas[i].id) { // datas.push(datas[i]); console.log('要删除项目:', datas[i].id); datas.splice(i,1); break; } else { if(datas[i].children){ //存在子节点就递归 this.removeNodeData(datas[i].children, id); } } } }, //遍历id节点添加子项 addNodeData(datas, id, nodedata){ //遍历树 获取id数组 var addflag = false; if(id===0) { datas.unshift(nodedata); addflag=true; } else { for(var i in datas){ console.log(JSON.stringify(datas[i])); if(id===datas[i].id) { // datas.push(datas[i]); console.log('要增加项目:', datas[i].id, nodedata); datas[i].children.unshift(nodedata); addflag=true; break; } else { if(datas[i].children){ //存在子节点就递归 this.addNodeData(datas[i].children, id, nodedata); } } } } return addflag; }, //节点点击事件 nodeClick(e) { console.log('点击的项目', JSON.stringify(e)); }, //节点up按钮点击事件 upNode(e) { const that = this; console.log('upNode'); if(e.index!=0){ // 根据自身需求,自行修改数据处理方法; // up上移操作,排序并更新tree中对应元素sort属性 var data = { pnode: {}, itemA: {id: e.items[e.index-1].id, sort: e.items[e.index].sort}, itemB: {id: e.items[e.index].id, sort: e.items[e.index-1].sort}, } that.$refs.mtree.treeSort(that.tree, e.item.pid, data); // 调用组件方法 排序sort 从小到大排序 } }, //节点down按钮点击事件 downNode(e) { const that = this; console.log('downNode'); if(e.index != e.items.length-1){ // 根据自身需求,自行修改数据处理方法; // down下移操作,排序并更新tree中对应元素sort属性 var data = { pnode: {}, itemA: {id: e.items[e.index+1].id, sort: e.items[e.index].sort}, itemB: {id: e.items[e.index].id, sort: e.items[e.index+1].sort}, } that.$refs.mtree.treeSort(that.tree, e.item.pid, data); // 调用组件方法 排序sort 从小到大排序 } }, //节点新增按钮点击事件 addNode(e) { //e.pNodeData, e.addContent console.log('点击的项目add', JSON.stringify(e)); // 根据自身需求,自行修改数据新增方法; // 可以配合异步请求 执行服务器删除操作 let data={}; if(e.id===0) { data={id: this.tree.length + 1, pid: e.id, label:'新增节点', name:'新增节点',children:[]} } else { data={id: e.pNodeData.id + e.pNodeData.children.length + 100, pid: e.pNodeData.id, label: e.addContent, name: e.addContent,children:[]} } if(data) { this.addNodeData(this.tree, e.pNodeData.id, data); } }, //节点更新按钮点击事件 editNode(e) { //e.pNodeData, e.editContent console.log('点击的项目add', JSON.stringify(e)); if(e.editContent.length >= 2 && e.editContent.length <= 16) { e.pNodeData.label = e.editContent; e.pNodeData.name = e.editContent; } // 节点已更新 /* const that = this; var updateData = { data: {id: e.pNodeData.id, name: e.editContent}, params: {id: e.pNodeData.id} }; new AreaService().update(updateData).then(result => { if(result.code === 0) { if(result.data.id) { that.getList(); } else { that.getList(); } CommonUtil.toast(`更新巡更区域成功`, 2000); } else { CommonUtil.toast(`更新失败:` + result.message, 2000); } }) CommonUtil.toast(e.editContent + `更新成功`, 2000); */ }, //节点删除按钮点击事件 deleteNode(e) { console.log('点击的项目delete', JSON.stringify(e)); // 根据自身需求,自行修改数据删除方法; if(this.removeNodeData(this.tree, e.id)) { // 可以配合异步请求 执行服务器删除操作 console.log('删除ID:', e,id, '数据'); } }, //节点滑动 fingerAction(e) { console.log('节点滑动fingerAction', JSON.stringify(e)); }, //节点选线长按事件 longpressNode(e) { console.log('长按的项目longpress', JSON.stringify(e)); } } } </script> <style lang="scss"> page{ background-color: #ededed; } .user-box{ background-color: #fff; } </style>