分类选择,最多五级

news2025/3/14 20:49:27

效果图,这种竖向的分类选择,每一列可以用不同的背景颜色
在这里插入图片描述

组件代码

<template>
	<view class="toolTypeBox" :style="`max-height:${maxHeight}`">
		<block v-for="(item,index) in datalist">
			<block v-if="item.list.length>0">
				<view>
					<scroll-view scroll-y class="toolType-each" :style="`background-color: ${item.bgcolor};max-height:${maxHeight}`">
						<view>
							<view v-for="(ite,inde) in item.list" :key="ite[idValue]" class="toolType-each-box" :class="[pip(index,inde)&&ite[idValue]==nowObject[idValue]?'active':'',item.current===inde?'moactive':'']" @tap="changeTab(index,inde)">{{ite[nameValue]}}</view>
						</view>
					</scroll-view>
				</view>
			</block>
		</block>
	</view>
</template>

<script>
	export default{
		name:'tool-type',
		data(){
			return{
				datalist:[
					{
						list:[],
						current:0,
						bgcolor:'#ECECEC',
					},
					{
						list:[],
						current:0,
						bgcolor:'#F8F8F8',
					},
					{
						list:[],
						current:0,
						bgcolor:'#FFF',
					},
					{
						list:[],
						current:0,
						bgcolor:'#FFF',
					},
					{
						list:[],
						current:0,
						bgcolor:'#FFF',
					},
				],
				nowCurrent:[null,null],//当前选中
				nowObject:{},//当前选中个的数据
			}
		},
		props:{
			dataList:{
				type:Array,
				default:() =>{
					return []
				}
			},
			//默认选中id
			defaultId:{
				type:String|Number,
				default:''
			},
			maxHeight:{
				type:String,
				default:'800rpx'
			},
			parentIdValue:{
				type:String,
				default:'parentId'
			},
			idValue:{
				type:String,
				default:'id'
			},
			nameValue:{
				type:String,
				default:'name'
			},
			childrenValue:{
				type:String,
				default:'children'
			},
		},
		methods:{
			//获取默认id在数组中的位置
		  	getParent(data2, nodeId2) {
			      var arrRes = [];
			      if (data2.length == 0) {
			        if (!!nodeId2) {
			          arrRes.unshift(data2);
			        }
			        return arrRes;
			      }
			      let rev = (data, nodeId) => {
			        for (var i = 0, length = data.length; i < length; i++) {
			          let node = data[i];
			          if (node[this.idValue] == nodeId) {
			            arrRes.unshift(i);
			            rev(data2, node[this.parentIdValue]);
			            break;
			          } else {
			            if (!!node[this.childrenValue]) {
			              rev(node[this.childrenValue], nodeId);
			            }
			          }
			        }
			        return arrRes;
			      };
			      arrRes = rev(data2, nodeId2);
			      return arrRes;
		    },
			mate(list){
				let aaa = this.getParent(list,this.defaultId)
				//没有该id时,清空选中的位置
				if(!aaa || aaa.length == 0){
					this.nowCurrent = [null,null];
					this.changeTab(0,0,'noId')
					return
				}
				let bbb = [];
				aaa.map((r,v) =>{
					this.datalist[v].current = r;
					if(v === 0){
						let ll = this.datalist[0].list[aaa[0]][this.childrenValue];
						bbb = ll;
						this.datalist[v+1].list = ll;
					}else{
						let ll = bbb[r][this.childrenValue];
						bbb = ll;
						this.datalist[v+1].list = ll;
					}
					//将默认选中ID的子集展示出来
					if(v === aaa.length-1){
						this.changeTab(aaa.length-1,aaa[aaa.length-1],'zidong')
					}
				})
			},
			//获取已选中的Id
			getSelectId(){
				return this.nowObject;
			},
			pip(i,v){
				if(this.nowCurrent[0] === i && this.nowCurrent[1] === v){
					return true
				}else{
					return false
				}
			},
			//选择
			changeTab(i,v,s){
				console.log('选择',i,v)
				switch(i){
					case 0:
						//第一层
						if(this.datalist[i].list){
							
							// if(v === this.datalist[i].current)return;
							this.datalist[i].current = v;
							this.datalist[1].current = 0;
							this.datalist[2].current = 0;
							this.datalist[3].current = 0;
							this.datalist[4].current = 0;
							this.datalist[1].list = [];
							this.datalist[2].list = [];
							this.datalist[3].list = [];
							this.datalist[4].list = [];
							let aa = this.datalist[i].list[v][this.childrenValue];
							if(aa?.length>0){
								this.datalist[1].list = aa;
								let bb = aa[0][this.childrenValue];
								if(bb?.length>0){
									this.datalist[2].list = bb;
									let cc = bb[0][this.childrenValue];
									if(cc?.length>0){
										this.datalist[3].list = cc;
										let dd = cc[0][this.childrenValue];
										if(dd?.length>0){
											this.datalist[4].list = dd;
										}
									}
								}
								console.log('叔叔叔苏火速火速',this.datalist)
							}else{
								if(s !== 'noId'){
									this.nowCurrent[0] = i;
									this.nowCurrent[1] = v;
									if(s !== 'zidong'){
										this.$emit('selectType',this.datalist[i].list[v])
										this.nowObject = this.datalist[i].list[v];
									}
								}
							}
						}else{
							this.nowCurrent[0] = i;
							this.nowCurrent[1] = null;
						}
						break
					case 1:
						//第二层
						if(this.datalist[i].list){
							
							// if(v === this.datalist[i].current)return;
							this.datalist[i].current = v;
							this.datalist[2].current = 0;
							this.datalist[3].current = 0;
							this.datalist[4].current = 0;
							this.datalist[2].list = [];
							this.datalist[3].list = [];
							this.datalist[4].list = [];
							let aa = this.datalist[i].list[v][this.childrenValue];
							if(aa?.length>0){
								this.datalist[2].list = aa;
								let bb = aa[0][this.childrenValue];
								if(bb?.length>0){
									this.datalist[3].list = bb;
									let cc = bb[0][this.childrenValue];
									if(cc?.length>0){
										this.datalist[4].list = cc;
									}
								}
							}else{
								if(s !== 'noId'){
									this.nowCurrent[0] = i;
									this.nowCurrent[1] = v;
									if(s !== 'zidong'){
										this.$emit('selectType',this.datalist[i].list[v])
										this.nowObject = this.datalist[i].list[v];
									}
								}
							}
						}else{
							this.nowCurrent[0] = i;
							this.nowCurrent[1] = null;
						}
						break
					case 2:
						//第三层
						if(this.datalist[i].list){
							
							// if(v === this.datalist[i].current)return;
							this.datalist[i].current = v;
							this.datalist[3].current = 0;
							this.datalist[4].current = 0;
							this.datalist[3].list = [];
							this.datalist[4].list = [];
							let aa = this.datalist[i].list[v][this.childrenValue];
							if(aa?.length>0){
								this.datalist[3].list = aa;
								let bb = aa[0][this.childrenValue];
								if(bb?.length>0){
									this.datalist[4].list = bb;
								}
							}else{
								if(s !== 'noId'){
									this.nowCurrent[0] = i;
									this.nowCurrent[1] = v;
									if(s !== 'zidong'){
										this.$emit('selectType',this.datalist[i].list[v])
										this.nowObject = this.datalist[i].list[v];
									}
								}
							}
						}else{
							this.nowCurrent[0] = i;
							this.nowCurrent[1] = null;
						}
						break
					case 3:
						//第四层
						if(this.datalist[i].list){

							// if(v === this.datalist[i].current)return;
							this.datalist[i].current = v;
							this.datalist[4].current = 0;
							this.datalist[4].list = [];
							let aa = this.datalist[i].list[v][this.childrenValue];
							if(aa?.length>0){
								this.datalist[4].list = aa;
							}else{
								if(s !== 'noId'){
									this.nowCurrent[0] = i;
									this.nowCurrent[1] = v;
									if(s !== 'zidong'){
										this.$emit('selectType',this.datalist[i].list[v])
										this.nowObject = this.datalist[i].list[v];
									}
								}
							}
						}else{
							this.nowCurrent[0] = i;
							this.nowCurrent[1] = null;
						}
						break
					case 4:
						//第五层
						if(this.datalist[i].list){
							
							// if(v === this.datalist[i].current)return;
							this.datalist[i].current = v;
							if(s !== 'noId'){
								this.nowCurrent[0] = i;
								this.nowCurrent[1] = v;
								if(s !== 'zidong'){
									this.$emit('selectType',this.datalist[i].list[v])
									this.nowObject = this.datalist[i].list[v];
								}
							}
						}else{
							this.nowCurrent[0] = i;
							this.nowCurrent[1] = null;
						}
						break
				}
			}
		},
		watch:{
			dataList:{
				immediate:true,
				handler(newlist){
					// console.log('来了',newlist)
					if(this.defaultId&&newlist.length>0){
						this.datalist[0].list = newlist;
						this.mate(newlist) //匹配选中默认id
					}else{
						if(newlist?.length>0){
							this.datalist[0].list = newlist;
							let aa = newlist[0][this.childrenValue];
							if(aa?.length>0){
								this.datalist[1].list = aa;
								let bb = aa[0][this.childrenValue];
								if(bb?.length>0){
									this.datalist[2].list = bb;
									let cc = bb[0][this.childrenValue];
									if(cc?.length>0){
										this.datalist[3].list = cc;
										let dd = cc[0][this.childrenValue];
										if(dd?.length>0){
											this.datalist[4].list = dd;
										}
									}
								}
							}
						}else{
							this.datalist[0].list = [];
							this.datalist[0].current = 0;
							this.datalist[1].list = [];
							this.datalist[1].current = 0;
							this.datalist[2].list = [];
							this.datalist[2].current = 0;
							this.datalist[3].list = [];
							this.datalist[3].current = 0;
							this.datalist[4].list = [];
							this.datalist[4].current = 0;
						}
					}
				}
			},
			defaultId:{
				immediate:true,
				handler(newid){
					// console.log('默认',newid)
					if(this.dataList.length>0){
						this.mate(this.dataList) //匹配选中默认id
					}
				}
			}
		},
	}
</script>

<style lang="scss">
	.toolTypeBox{
		// width:100%;
		// height:100%;
		display: flex;
		background:#fff;
	}
	.toolType-each{
		width:220rpx;
	}
	.toolType-each-box{
		width:100%;
		padding:26rpx 20rpx;
		box-sizing: border-box;
		font-size: 30rpx;
		color: #666;
		text-align: center;
		word-break:break-all;
	}
	.moactive{
		background-color:#fff;
	}
	.active{
		background-color:#FFC526;
		color:#fff;
	}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1103853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

hanniman 1v1 咨询

‍ 一共4种可选方案&#xff0c;3个To C&#xff08;面向AI产品经理的职业规划诊断、求职内推套餐、模拟面试&#xff09;&#xff0c;1个To B&#xff08;面向AI企业/投资机构/券商等&#xff09;。 方案A&#xff1a;职业规划诊断 适合人群&#xff1a;AI产品经理 or 想转型A…

深入理解强化学习——学习(Learning)、规划(Planning)、探索(Exploration)和利用(Exploitation)

分类目录&#xff1a;《深入理解强化学习》总目录 学习 学习&#xff08;Learning&#xff09;和规划&#xff08;Planning&#xff09;是序列决策的两个基本问题。 如下图所示&#xff0c;在强化学习中&#xff0c;环境初始时是未知的&#xff0c;智能体不知道环境如何工作&a…

钢铁异常分类 few-shot 问题 小陈读paper 钢铁2

很清爽的 abstract 给出链接 前面的背景意义 其实 是通用的 这里替大家 整理一吓吓 1 缺陷分类在钢铁表面缺陷检测中 有 意义。 2 大多数缺陷分类模型都是基于完全监督的学习&#xff0c; 这需要大量带有图像标签的训练数据。 在工业场景中收集有缺陷的图像是非常困难…

C语言笔记之指针

一.指针含义 1.a、*a与&a的区别 a存储指向变量的地址,*a为指针的值,&a为指针的地址 #include <stdio.h>int main(){/** 测试代码部分一 **/int a12;int *b1;b1&a1;printf(" a1 %d, &a1 %d, b1 %d, *b1 %d, &b1 %d\n\n",a1,&a1…

番外8.0 ---Linux服务器用户与组Task

Task0: 熟悉Linux用户的访问权限&#xff1b; 管理用户账户&#xff1b; 管理组&#xff1b; 使用用户管理器管理组和用户&#xff1b; 使用常用的账户管理命令&#xff1b; 批量新建账户&#xff1b; 项目情况&#xff1a;公司员工&#xff1a;60&#xff0c;部门&#xff1…

Python网络编程之Socket(套接字)

文章目录 一、Socket概念二、套接字的发展史及分类三、Socket的使用语法格式(基于TCP协议)1.基于TCP协议的套接字(socket)编程半连接池 2.基于UDP协议的套接字(socket)编程也可以使用服务端只接收客户端消息 黏包现象 一、Socket概念 Socket套接字&#xff0c;一种独立于协议的…

机器学习,神经网络中,自注意力跟卷积神经网络之间有什么样的差异或者关联?

如图 6.38a 所示&#xff0c;如果用自注意力来处理一张图像&#xff0c;假设红色框内的“1”是要考虑的像素&#xff0c;它会产生查询&#xff0c;其他像素产生 图 6.37 使用自注意力处理图像 键。在做内积的时候&#xff0c;考虑的不是一个小的范围&#xff0c;而是整张图像的…

力扣每日一题45:跳跃游戏

题目描述&#xff1a; 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返…

C语言实现// 输入一个英文句子,以‘ . ’结束,统计句子中包含的字符个数

完整代码&#xff1a; // 输入一个英文句子&#xff0c;以‘ . ’结束&#xff0c;统计句子中包含的字符个数 #include<stdio.h>int main(){char ch;int length0;printf("请输入一个英文句子\n");while (chgetchar()!.){length;}printf("字符个数是&…

Qt/C++开源作品45-CPU内存显示控件/和任务管理器一致

一、前言 在很多软件上&#xff0c;会在某个部位显示一个部件&#xff0c;专门显示当前的CPU使用率以及内存占用&#xff0c;方便用户判断当前程序或者当前环境中是否还有剩余的CPU和内存留给程序使用&#xff0c;在不用打开任务管理器或者资源查看器的时候直接得知当前系统的…

大模型,重构自动驾驶

文&#xff5c;刘俊宏 编&#xff5c;王一粟 大模型如何重构自动驾驶&#xff1f;答案已经逐渐露出水面。 “在大数据、大模型为特征&#xff0c;以数据驱动为开发模式的自动驾驶3.0时代&#xff0c;自动驾驶大模型将在车端、云端上实现一个统一的端到端的平台管理。”毫末智…

【线性表的查找,线性表插入,线性表的删除,线性表的链式表示和实现】

文章目录 线性表的查找线性表插入线性表的删除线性表的链式表示和实现1.单链表&#xff0c;双链表&#xff0c;循环列表2.头指针&#xff0c;头结点和首元结点3.链表的存储结构特点 线性表的查找 int LocateElem(Sqlist L,ElemType e){ //在线性表L中查找值为e的数据元素&…

jmeter(三十三):阶梯线程组Stepping Thread Group,并发线程Concurrency Thread Group

Stepping Thread Group参数详解 this group will start:表示总共要启动的线程数;若设置为 100,表示总共会加载到 100 个线程first,wait for:从运行之后多长时间开始启动线程;若设置为 0 秒,表示运行之后立即启动线程then start:初次启动多少个线程;若设置为 0 个,表示…

实验室设备modbus小结

背景&#xff1a; 大概花1个月&#xff0c;后端代码量再1W行多点&#xff0c;不同厂商的指令不同需要定制化开发。参与了设备的数据采集工作&#xff0c;当然常规的设备管理、权限就不重点展开。 都是物联网相关&#xff0c;但是还是有所不同。 之前做过海尔的U home相关的项目…

京东AIGC实战项目复盘;第一门AI动画系统课程;百川智能启动2024校园招聘;Kaggle 2023 AI前沿报告 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f525; 李彦宏宣布「文心大模型4.0」正式发布&#xff0c;并开启邀请测试 10月17日&#xff0c;李彦宏在百度世界2023上宣布「文心大模型4.0」…

微信小程序 —— 会议OA项目首页布局与Mock数据交互

14天阅读挑战赛如果世界上有奇迹&#xff0c;那一定是努力的另一个名字。 目录 一、小程序布局 1.1 Flex布局 1.2 Flex属性 二、OA会议首页搭建 2.1 首页底部菜单 2.2 创建后端结口 2.3 Mock模拟数据 2.4 首页轮播图搭建 2.5 首页内容搭建 一、小程序布局 1.1 Flex布…

SpringBoot+Mybatis实现多数据源+分页

1 主要依赖版本 &#xff08;1&#xff09;SpringBoot 2.7.8 &#xff08;2&#xff09;Mybatis 2.2.2 &#xff08;3&#xff09;Pagehelper 1.3.0 &#xff08;4&#xff09;MySQL 8.0.26 &#xff08;5&#xff09;Oracle 11.2.0.3 2 概述 &#xff08;1&#xff09;…

Linux内核8. 进程地址空间

进程地址空间也就是每个进程所使用的内存&#xff0c;内核对进程地址空间的管理&#xff0c;也就是对用户态程序的内存管理。 主要内容&#xff1a; 地址空间(mm_struct)虚拟内存区域(VMA)地址空间和页表 1. 地址空间(mm_struct) 地址空间就是每个进程所能访问的内存地址范围…

React高级特性之RenderProps

一、概念 renderProps是另外一个能实现类似于HOC这种多个组件抽离公共组件逻辑的方式。 二、例子 import React from react import PropTypes from prop-typesclass Mouse extends React.Component {constructor(props) {super(props)this.state { x: 0, y: 0 }}handleMouse…

日志技术快速入门

1、创建Maven项目 这里不再说如何创建Maven项目 2、导入相关依赖 <dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.12</version></dependency>3、创建配置文件 在re…