微信小程序自用Tree树形控件
25-04-07 03:27
707
0
功能包含
全选按钮功能、反选按钮功能 父级列表前的开关 icon 子级列表的选中的禁止或启用 父级列表显示子级列表可选数量 父级下所有可选子级选中则父选中(禁用状态不算) 使用了 van-collapse 组件带有折叠关闭动画效果
微信小程序自 Tree 树形控件 WXML 代码部分
<van-collapse value="{{ activeNames }}" bind:change="onChange"> <block wx:for="{{wrongList}}" wx:for-item="itm" wx:key="index"> <van-collapse-item name="{{itm.code}}" data-hans="itm.code"> <view slot="title"> <image src="https://xxxx/{{KG[itm.code]!=true ?'open':'close'}}.png" style="width:20rpx" mode="widthFix" /> {{itm.name}} <view catchtap="catchtap"> <van-checkbox class="fuCheck" disabled="{{tempCodeArr[itm.code].length==0}}" value="{{ checkedAll[itm.code] }}" data-hans="{{itm.code}}" bind:change="checkcheck" /> <view class="counts" style="right:106rpx">({{itm.fallibleCount}})</view> </view> </view> <view class="items"> <van-checkbox-group value="{{ choisObj[itm.code] }}" data-hanscode="{{itm.code}}" bind:change="checkChange"> <van-cell-group> <block wx:if="{{!_itm.hansFu}}" wx:for="{{ itm.children }}" wx:for-index="_index" wx:for-item="_itm" wx:key="code"> <van-cell title="{{ _itm.name }}" value-class="value-class" clickable> <van-checkbox name="{{ _itm.code }}" disabled="{{_itm.fallibleCount=='0'?true:false}}" /> <view class="counts">({{_itm.fallibleCount}})</view> </van-cell> </block> </van-cell-group> </van-checkbox-group> </view> </van-collapse-item> </block> </van-collapse>
微信小程序自 Tree 树形控件 JS 部分
/* * @Author: Han * @Date: 2021-01-04 14:18:09 * @LastEditors: Han * @LastEditTime: 2021-01-04 15:07:09 * @FilePath: \wechat-app\tree.js */ import { get } from "api"; Page({ data: { // 父级按钮合集 checkedAll: [], // 面板状态合集 activeNames: [], // 章节List wrongList: [], // 选中的子节点合集 choisObj: {}, // 临时 父 子 数组 tempCodeArr: {}, // 全选按钮状态 selectAllStatus: true }, // 全选事件 selectAll() { const _this = this; const status = this.data.selectAllStatus; const okTempCodeArr = JSON.parse(JSON.stringify(_this.data.tempCodeArr)); Object.keys(okTempCodeArr).forEach(itm => { okTempCodeArr[itm].length == 0 && delete okTempCodeArr[itm]; }); // 模拟点击 Object.keys(okTempCodeArr).forEach(itm => { _this.checkChange({ currentTarget: { dataset: { hanscode: itm } }, detail: status ? okTempCodeArr[itm] : [] }); }); this.setData({ selectAllStatus: !status }); }, // 父级按钮 checkcheck(e) { const codes = e.currentTarget.dataset.hans; // 判断父级按钮状态 this.setData({ checkedAll: { ...this.data.checkedAll, [codes]: e.detail }, choisObj: { ...this.data.choisObj, [codes]: e.detail ? this.data.tempCodeArr[codes] : [] } }); // 去除空对象,并设置按钮状态 const tempObj = this.data.choisObj; Object.keys(tempObj).forEach(itm => { tempObj[itm].length == 0 && delete tempObj[itm]; }); this.setData({ choisObj: tempObj, btnStatus: Object.keys(tempObj).length }); }, // 子级按钮点击选中或非事件 checkChange(e) { const codes = e.currentTarget.dataset.hanscode; // 可选中的是否全选 const status = e.detail.length == this.data.tempCodeArr[codes].length; this.setData({ choisObj: { ...this.data.choisObj, [codes]: e.detail }, checkedAll: { ...this.data.checkedAll, [codes]: status } }); const tempObj = this.data.choisObj; Object.keys(tempObj).forEach(itm => { tempObj[itm].length == 0 && delete tempObj[itm]; }); this.setData({ choisObj: tempObj, btnStatus: Object.keys(tempObj).length }); }, // 折叠面板切换事件 onChange(event) { let tempArr = []; // 当前面板折叠状态 临时变量 let key = false; // 由于面板可以多个同时展开,所以 ? // 控制面板标题前 图片的 + 或 - if (this.data.activeNames.length > event.detail.length) { // 深拷贝 tempArr = JSON.parse(JSON.stringify(this.data.activeNames)); event.detail.forEach(itm => { const n = tempArr.indexOf(itm); n != -1 && tempArr.splice(n, 1); }); key = false; } else { tempArr = JSON.parse(JSON.stringify(event.detail)); this.data.activeNames.forEach(itm => { const n = tempArr.indexOf(itm); n != -1 && tempArr.splice(n, 1); }); key = true; } this.setData({ activeNames: event.detail, KG: { ...this.data.KG, [tempArr[0]]: key } }); }, // 切换事件 onSwitchChange(e) { // 切换时,清空除额外所有数据 this.setData({ xx: [], xx: {}, ...xx }); // 之后重新获取列表 this.XXX(); }, // 获取书本信息 async getBookArr() { wx.showLoading({ title: "获取数据中" }); let tempArr = []; const _this = this; const { ret: { bookList: _res } } = await get("api"); wx.hideLoading(); // 书本信息赋给下拉框 Array.isArray(_res) && _res.forEach(itm => { tempArr.push({ text: itm.name, value: itm.id }); }); tempArr.length && _this.setData({ bookDataArr: tempArr }); }, // 获取章节列表 async getWrongList() { const _this = this; const _res = await get(`api`); let _tempArr = _res.ret.bookCatalogs; // 章节数据处理 Array.isArray(_tempArr) && _tempArr.length && _tempArr.forEach((itm, idx) => { let tempArrs = []; itm.fallibleCount = Number(itm.fallibleCount); itm.children.length ? itm.children.forEach(_itm => { itm.fallibleCount += Number(_itm.fallibleCount); _itm.fallibleCount != "0" && tempArrs.push(_itm.code); }) : _tempArr[idx].children.push({ name: itm.name, code: itm.code, fallibleCount: itm.fallibleCount, hansFu: true }); _this.setData({ tempCodeArr: { ..._this.data.tempCodeArr, [itm.code]: tempArrs } }); }); _res.ret && this.setData({ wrongList: _tempArr }); }, // 防止父级点击事件冒泡空事件 catchtap() {} });
-
Photoshop CS6图编辑 v13.0 中文精简版 x32
Photoshop(ps) CS6绿色精简版是一款功能强大的图像处理软件,Adobe Photoshop是众所周知的业界领先的图像处理软件系列,非常专业且著名,... 702 0 25-02-15 -
电影语言的语法
关于影片制作方面的书籍已经为数很多了,有人不禁要问,为什么还要写一本,而且为什么要写这一本?作者认为,并且根据个人的经历确信:近二十... 1046 0 24-07-10 -
Listen1音乐播放器-支持全平台的中国免费音乐聚合软件
Listen1音乐播放器软件,它集成了多个音乐平台的搜索和播放功能。用户可以通过 Listen1 在一个应用程序中访问并收听来自不同音乐平台的歌... 932 0 24-05-31 -
码力全开资源站 - 汇集产品、设计、独立开发者的高质量资源站
码力全开是由国内开发者 Larry 创建的设计类导航网站,目前共有接近30种标签分类网站,其中的图库网站,图标网站,样机工具,设计灵感都... 803 0 25-01-14 -
php结合redis实现高并发下的抢购、秒杀功能
抢购、秒杀是平常很常见的使用场景,其实现很简单,但是有两个问题需要解决:1 高并发对数据库产生的压力2 竞争状态下如何解决库存的正确... 574 0 21-07-27 -
浏览页面忘记密码解决办法
如果在网页登录的时候,页面之前记录了密码,但是你忘记了具体的密码,可以用过修改控制台密码的type去除密码的*号1、按f12,打开浏览器控... 870 0 24-11-18 -
企业车辆管理表格 - 企业管理表格
车辆登记表.doc派车单.doc借车审批单.doc车辆请修单.doc领油单.doc燃油效率及耗油量结算表.doc油料库存月报表.doc车辆保养修理记录表.doc车... 1262 0 24-07-30 -
网站、公众号、小程序菜单栏目素材图标
549 0 21-07-14
发表我的评论
共0条评论
- 这篇文章还没有收到评论,赶紧来抢沙发吧~