更新记录

1.0.0(2023-05-22)

数据层级树、逐级选择、多选、复选、反选、全选、面包屑导航


平台兼容性

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

博客地址:(https://www.jianshu.com/p/dad06a0b3e10) 掘金地址:(https://juejin.cn/post/7234419104597770277)

功能和特性:

一、最上层级页增加“全部”字段,支持全选和全不选设备 二、若子层级的设备全部选中,则上级组织展示选中状态,如图1 三、若子层级的设备有部分选中,则上级组织展示为半选中状态,如图3,4 四、若子层级的设备全部未选中,则上级组织展示为非选中状态,如图2 五、可直观定位和追溯所选择设备的信息,各层级展示已选数量/全部数量(例:已选2/10),用于展示在各层级已选的设备情况,展示格式:已选X/Y,其中X表示当前层级内已选择的设备数量,Y表示当前层级内全部设备数量

用法

建议先下载示例项目,运行起来就明白了 1、第一步导入组件: 导入到hbuilderx或者把示例代码中的lius-checkboxtree文件夹拖进项目 2、第二步注册路由: 在pages.json文件中添加该组件的路径,具体如下:

    "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
        {
            "path": "pages/index/index",
            "style": {
                "navigationBarTitleText": "uni-app"
            }
        },
        {
            "path": "uni_modules/lius-checkboxtree/components/lius-checkboxtree/lius-checkboxtree",
            "style": {
                "navigationBarTitleText": "",
                "enablePullDownRefresh": false
            }
        }
    ],

3.第三步跳转逐级多选组件页面: 在需要需要用到组件的页面,写一个跳转组件的方法,方法里对携带的选中数据进行处理:

jumptree() {
        let powerselectedData = []
        if (this.checkList.length > 0) {
            for (let i = 0; i < this.checkList.length; i++) {
                let item = this.checkList[i];
                let info = {}
                info.pid = item.pid;
                info.selecteTag = 2;
                info.deviceCode = item.deviceCode;
                info.deviceName = item.deviceName;
                powerselectedData.push(info)
            }
        }
        const map = new Map();
        const that = this;
        powerselectedData = powerselectedData.filter(key => !map.has(key.deviceCode) && map.set(key.deviceCode,
            1));
        let par = JSON.stringify(powerselectedData);
        uni.navigateTo({
            url: '/uni_modules/lius-checkboxtree/components/lius-checkboxtree/lius-checkboxtree?powerselectedData=' +
                encodeURIComponent(par),
            events: {
                PowerTree: function(data) {
                    console.error('返回的数据', data);
                    that.hanldChooseData(data.data);
                }
            }
        })
    },

4.在跳转组件的页面,对组件选中的数据进行处理和回显:

        hanldChooseData(data) {
                let value = "";
                if (data) {
                    let valueLenth = data.length;
                    if (valueLenth > 0) {
                        let namelist = [];
                        for (let i in data) {
                            namelist.push(data[i].deviceName);
                        }
                        let namestr = namelist.join(', ');
                        value = '选中' + valueLenth + '个;分别是' + namestr;
                    }
                }
                this.prepareVideoList(data, value);
            },
            prepareVideoList(data, value) {
                const that = this;
                setTimeout(function() {
                    that.title = value;
                }, 10);
                this.checkList = [];
                for (let i = 0; i < data.length; i++) {
                    let item = data[i];
                    this.checkList.push(item);
                }
            }

实现思路

每一个单元格item都有3种状态标识,selecteTag分为0,1,2。0是未选中,1是半选中,2是选中状态。点击复选框选中和非选中的方法里,同时向上和向下递归处理,向上拿着该item的上级组织的id递归遍历所有上级组织,同时根据012的逻辑给上级组织selecteTag赋值;向下如果该item的存在子级,就把所有子级递归赋值selecteTag为0或者2。同时只对设备进行处理,在选中的数组newCheckList中进行添加或删除操作。

核心代码
/** 选中当前的值
             * @param {Object} e
             * @param {Object} item 当前项
             * @param {Object} index 索引
             */
            checkboxChange(e, item, index) {
                uni.showLoading({
                    title: '正在加载,请稍候'
                });
                console.log('点击chechckBox', e.detail.value, item);
                let that = this;
                var data = that.newCheckList;
                let findIdex = -1; //that.newCheckList.indexOf(item)
                for (let i in data) {
                    if (data[i].deviceCode == item.deviceCode) {
                        findIdex = i;
                        break;
                    }

                }
                console.log('选中的数组中的第几个', findIdex);
                if (e.detail.value && e.detail.value > 0) {
                    // 点击选中
                    if (!item.children && !item.deviceCode) {
                        console.log('选中第一级', item);
                        // 遍历找到item的上级,赋值选中
                        this.partRadioEach(this.parent_data, item.id, 1);
                        //第一级的选中
                        this.parentSelected(item.id, 1);

                    } else {
                        that.tree[index].selecteTag = 2
                        if (item.deviceCode && findIdex < 0) {
                            that.newCheckList.push(that.tree[index]);
                        }
                        console.log('选中de', that.newCheckList);
                        var childrendata = that.tree[index].children;

                        if (childrendata && childrendata.length > 0) {
                            that.selectedDown(childrendata);
                        }
                    }

                } else {
                    // 点击不选
                    if (!item.children && !item.deviceCode) {
                        console.log('取消选中第一级', item);
                        // 遍历找到item的上级,赋值不选中
                        this.partRadioEach(this.parent_data, item.id, 0);
                        //第一级的不选中
                        this.parentSelected(item.id, 0);

                    } else {
                        if (item.deviceCode) {
                            that.newCheckList.splice(findIdex, 1);
                        }
                        that.tree[index].selecteTag = 0
                        var cancledata = that.tree[index].children;
                        console.log('取消删除', cancledata);
                        if (Array.isArray(cancledata) && cancledata.length > 0) {
                            that.deleteDown(cancledata);
                        }
                    }
                }

                that.parentforEach(that.parent_data, item.pid);

                console.log('最后的选中数组', this.newCheckList, item.pid);
                that.checckNewList();
                this.topSelString = this.getTopChooseItem();
                that.$forceUpdate(); //强制更新数据
                uni.hideLoading();
            },

隐私、权限声明

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

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

插件不采集任何数据

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

许可协议

MIT协议

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