更新记录

1.0.8(2022-02-25)

增加上移下移功能按钮

1.0.7(2022-02-17)

修正小程序显示问题

1.0.6(2022-02-17)

修正小程序显示问题

查看更多

平台兼容性

Vue2 Vue3
×
App 快应用 微信小程序 支付宝小程序 百度小程序 字节小程序 QQ小程序
app-vue app-nvue
钉钉小程序 快手小程序 飞书小程序 京东小程序
× × × ×
H5-Safari Android Browser 微信浏览器(Android) QQ浏览器(Android) Chrome IE Edge Firefox PC-Safari

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>

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无s

许可协议

MIT协议

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问