实现一个移动端的三级tree组件,支持多选、单选、全选、全不选、最好兼容vant组件库、用vue2写,添加测试数据和调用过程

时间: 2023-07-10 13:32:41 浏览: 62
好的,下面是一个Vue2版本的移动端三级tree组件实现,支持多选、单选、全选、全不选,并且兼容vant组件库: ```vue <template> <van-tree-select v-model="checkedList" :items="items" :height="height" :max-height="maxHeight" :main-active-index.sync="mainActiveIndex" :active-id.sync="activeId" :border="false" :accordion="accordion" :selected-icon="selectedIcon" :click-nav="clickNav" @click-nav="onClickNav" > <template v-slot:content="{ item }"> <div class="tree-item"> <van-checkbox v-model="item.checked" :name="item.id" @change="onChange(item)" /> <span>{{ item.label }}</span> </div> </template> </van-tree-select> </template> <script> import { TreeSelect, Checkbox } from 'vant'; import { cloneDeep } from 'lodash'; export default { name: 'ThreeLevelTree', components: { VanTreeSelect: TreeSelect, VanCheckbox: Checkbox, }, props: { items: { type: Array, required: true, }, height: { type: [Number, String], default: 300, }, maxHeight: { type: [Number, String], default: 300, }, accordion: { type: Boolean, default: true, }, selectedIcon: { type: String, default: 'success', }, clickNav: { type: Boolean, default: false, }, defaultValue: { type: [String, Number, Array], default: null, }, defaultChecked: { type: Array, default: () => [], }, multiple: { type: Boolean, default: false, }, checkStrictly: { type: Boolean, default: false, }, }, data() { return { checkedList: cloneDeep(this.defaultChecked), mainActiveIndex: 0, activeId: this.defaultValue, }; }, watch: { defaultValue: { handler(val) { this.activeId = val; }, immediate: true, }, defaultChecked: { handler(val) { this.checkedList = cloneDeep(val); }, immediate: true, }, }, methods: { onClickNav({ index }) { this.mainActiveIndex = index; }, onChange(item) { if (!this.multiple) { this.checkedList = []; } if (item.children && !this.checkStrictly) { this.checkChildren(item, item.checked); this.checkParent(item); } else { this.checkSelf(item); this.checkParent(item); } this.$emit('change', cloneDeep(this.checkedList)); }, checkSelf(item) { const index = this.checkedList.findIndex( (v) => v.id === item.id && v.label === item.label ); if (item.checked && index === -1) { this.checkedList.push(item); } else if (!item.checked && index !== -1) { this.checkedList.splice(index, 1); } }, checkChildren(item, checked) { if (!item.children) { return; } item.children.forEach((child) => { child.checked = checked; this.checkChildren(child, checked); }); }, checkParent(item) { if (!item.parent) { return; } const parent = this.getItemById(item.parent); if (!parent) { return; } const checkedChildrenCount = parent.children.filter((child) => child.checked).length; parent.checked = checkedChildrenCount === parent.children.length; this.checkParent(parent); }, getItemById(id, items = this.items) { for (let i = 0; i < items.length; i++) { const item = items[i]; if (item.id === id) { return item; } if (item.children) { const result = this.getItemById(id, item.children); if (result) { return result; } } } return null; }, checkAll() { this.items.forEach((item) => { item.checked = true; this.checkChildren(item, true); }); this.checkedList = cloneDeep(this.items); this.$emit('change', cloneDeep(this.checkedList)); }, uncheckAll() { this.items.forEach((item) => { item.checked = false; this.checkChildren(item, false); }); this.checkedList = []; this.$emit('change', []); }, }, }; </script> <style scoped> .tree-item { display: flex; align-items: center; } </style> ``` 上面的代码中,我们使用了vant的TreeSelect组件来实现Tree组件,并自定义了节点的内容区域。我们通过props属性接收组件的数据源,并通过data属性初始化组件的状态。在Tree组件中,我们实现了多选、单选、全选、全不选等功能,并通过事件和状态管理来实现这些功能。在组件的methods属性中,我们定义了一些辅助方法,用于实现复杂的业务逻辑。 为了测试这个组件,我们可以在父组件中引入这个组件,并传入测试数据和props属性: ```vue <template> <div class="container"> <three-level-tree :items="items" :default-checked="defaultChecked" :multiple="true" @change="onChange" /> <van-button @click="checkAll">全选</van-button> <van-button @click="uncheckAll">全不选</van-button> </div> </template> <script> import ThreeLevelTree from './ThreeLevelTree.vue'; export default { name: 'App', components: { ThreeLevelTree, }, data() { return { items: [ { id: 1, label: '一级节点1', children: [ { id: 11, label: '二级节点1-1', children: [ { id: 111, label: '三级节点1-1-1', }, { id: 112, label: '三级节点1-1-2', }, ], }, { id: 12, label: '二级节点1-2', children: [ { id: 121, label: '三级节点1-2-1', }, { id: 122, label: '三级节点1-2-2', }, ], }, ], }, { id: 2, label: '一级节点2', children: [ { id: 21, label: '二级节点2-1', children: [ { id: 211, label: '三级节点2-1-1', }, { id: 212, label: '三级节点2-1-2', }, ], }, { id: 22, label: '二级节点2-2', children: [ { id: 221, label: '三级节点2-2-1', }, { id: 222, label: '三级节点2-2-2', }, ], }, ], }, ], defaultChecked: [ { id: 111, label: '三级节点1-1-1', }, { id: 122, label: '三级节点1-2-2', }, ], }; }, methods: { onChange(val) { console.log('选中的节点:', val); }, checkAll() { this.$refs.tree.checkAll(); }, uncheckAll() { this.$refs.tree.uncheckAll(); }, }, }; </script> ``` 上面的代码中,我们定义了一个父组件,包含了一个三级tree组件和两个按钮。我们给三级tree组件传入了测试数据和props属性,并监听change事件输出选中的节点。在组件中,我们通过$refs获取到三级tree组件的实例,并通过调用checkAll和uncheckAll方法实现全选和全不选功能。 最后,我们将父组件渲染到页面中: ```vue <template> <div id="app"> <app /> </div> </template> <script> import App from './App.vue'; export default { components: { App, }, }; </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style> ``` 上面的代码中,我们将App组件渲染到页面中。至此,我们就完成了一个Vue2版本的移动端三级tree组件的实现,支持多选、单选、全选、全不选,并且兼容vant组件库。

相关推荐

最新推荐

recommend-type

vue多级多选菜单组件开发

主要为大家分享了vue多级多选菜单组件开发案例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

Android Recyclerview实现多选,单选,全选,反选,批量删除的功能

本篇文章主要介绍了Android Recyclerview 实现多选,单选,全选,反选,批量删除的功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

react实现复选框全选和反选组件效果

本文实例为大家分享了react实现复选框全选和反选组件的具体代码,供大家参考,具体内容如下
recommend-type

微信小程序实现多选框全选与取消全选功能示例

主要介绍了微信小程序实现多选框全选与取消全选功能,结合实例形式分析了微信小程序多选框功能实现、布局显示及全选、取消全选相关操作技巧,需要的朋友可以参考下
recommend-type

微信小程序实现多选功能

主要为大家详细介绍了微信小程序实现多选功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章

![:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章](https://img-blog.csdnimg.cn/img_convert/69b98e1a619b1bb3c59cf98f4e397cd2.png) # 1. 目标检测算法概述 目标检测算法是一种计算机视觉技术,用于识别和定位图像或视频中的对象。它在各种应用中至关重要,例如自动驾驶、视频监控和医疗诊断。 目标检测算法通常分为两类:两阶段算法和单阶段算法。两阶段算法,如 R-CNN 和 Fast R-CNN,首先生成候选区域,然后对每个区域进行分类和边界框回归。单阶段算法,如 YOLO 和 SSD,一次性执行检
recommend-type

info-center source defatult

这是一个 Cisco IOS 命令,用于配置 Info Center 默认源。Info Center 是 Cisco 设备的日志记录和报告工具,可以用于收集和查看设备的事件、警报和错误信息。该命令用于配置 Info Center 默认源,即设备的默认日志记录和报告服务器。在命令行界面中输入该命令后,可以使用其他命令来配置默认源的 IP 地址、端口号和协议等参数。
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。