uniApp 三级折叠面板显示

HTML 部分

<template>
	<view class="content">
		<view class="position-group">
			<!-- 一级循环 -->
			<view class="pronames_one" v-for="(item,index) in positionlist" :key="index"
				:class="item.oneliststare?'oneshow':'onehide'">
				<view class="pronames-one-label" @click="onelist(index)">
					<view class="pronames-one-option" @click.stop="oneListSe(item)">
						<label :class="item.isOneSele?'cuIcon-round':'cuIcon-roundcheckfill'"></label>
						<text>{{item.onename}}</text>
					</view>
					<label :class="item.oneliststare?'cuIcon-fold':'cuIcon-unfold'"></label>
				</view>
				<!-- 二级循环 -->
				<view class="pronames_two" v-for="(item2,index2) in item.positiontwo" :key="index2"
					:class="item2.twoliststare?'twoshow':'twohide'">
					<view class="pronames-two-label" @click="twolist(index,index2)">
						<view class="pronames-two-option" @click.stop="twoListSe(item,item2)">
							<label :class="item2.isTwoSele?'cuIcon-round':'cuIcon-roundcheckfill'"></label>
							<text>{{item2.twoname}}</text>
						</view>
						<label :class="item2.twoliststare?'cuIcon-fold':'cuIcon-unfold'"></label>
					</view>
					<view class="pronames_three">
						<!-- 三级循环 -->
						<view class="pronames_three-label" v-for="(item3,index3) in item2.positionthree" :key="index3"
							@click="threeListSe(item,item2,item3)">
							<label :class="item3.isThreeSele?'cuIcon-round':'cuIcon-roundcheckfill'"></label>
							<text>{{item3.threename}}</text>
						</view>
					</view>
				</view>
			</view>
		</view>
		<view class="foot-utn">
			<button type="primary" @click="submit">确认选择</button>
		</view>
	</view>
</template>

js部分

<script>
	export default {
		data() {
			return {
				positionlist: [{
					id: 0,
					onename: "销售|客服|市场",
					oneliststare: false, // 是否展开二级
					isOneSele: false, // 当前第一级是否全部选中
					isOneTain: false, // 当前第一级是否有选中的
					positiontwo: [{
						twoid: 0,
						twoname: "销售业务",
						twoliststare: false, // 是否展开三级
						isTwoSele: false, // 当前第二级是否全部选中
						isTwoTain: false, // 当前第二级是否有选中的
						positionthree: [{
							trheeid: 0,
							threename: "销售代表",
							isThreeSele: false, // 当前第三级是否选中
						}, {
							trheeid: 0,
							threename: "客户代表",
							isThreeSele: false
						}, {
							trheeid: 0,
							threename: "销售顾问",
							isThreeSele: false
						}]
					}, {
						twoid: 1,
						twoname: "销售管理",
						twoliststare: false,
						isTwoSele: false,
						isTwoTain: false,
						positionthree: [{
							trheeid: 0,
							threename: "销售主管",
							isThreeSele: false
						}, {
							trheeid: 0,
							threename: "销售经理",
							isThreeSele: false
						}, {
							trheeid: 0,
							threename: "销售总监",
							isThreeSele: false
						}]
					}]
				}, {
					id: 1,
					onename: "IT|互联网|通信",
					oneliststare: false,
					isOneSele: false,
					isOneTain: false, // 是否有选中的
					positiontwo: [{
						twoid: 0,
						twoname: "软件/互联网开发/系统集成",
						twoliststare: false,
						isTwoSele: false,
						isTwoTain: false,
						positionthree: [{
							trheeid: 0,
							threename: "软件工程师",
							isThreeSele: false
						}, {
							trheeid: 1,
							threename: "软件研发工程师",
							isThreeSele: false
						}, {
							trheeid: 2,
							threename: "高级软件工程师",
							isThreeSele: false
						}]
					}, {
						twoid: 1,
						twoname: "互联网产品/运营管理",
						twoliststare: false,
						isTwoSele: false,
						isTwoTain: false,
						positionthree: [{
							trheeid: 0,
							threename: "网店客服",
							isThreeSele: false
						}, {
							trheeid: 1,
							threename: "网店运营",
							isThreeSele: false
						}, {
							trheeid: 2,
							threename: "网店管理员",
							isThreeSele: false
						}]
					}]
				}]
			}
		},
		onLoad() {},
		methods: {
			onelist(index) {
				let positionlist = this.positionlist;
				// 展开收起一级列表 start
				if (positionlist[index]['oneliststare'] == false) {
					positionlist[index]['oneliststare'] = true;
				} else {
					positionlist[index]['oneliststare'] = false;
				}
				// 展开收起一级列表 end
			},
			twolist(index, index2) {
				let positionlist = this.positionlist;
				let positiontwo = this.positionlist[index].positiontwo[index2]['twoliststare'];
				console.log(positiontwo)
				// 展开收起二级列表 start
				if (positiontwo == false) {
					this.positionlist[index].positiontwo[index2]['twoliststare'] = true;
				} else {
					this.positionlist[index].positiontwo[index2]['twoliststare'] = false;
				}
				// 展开收起二级列表 end				
			},
			oneListSe(item) {
				item.isOneSele = !item.isOneSele
				item.positiontwo.forEach(i => {
					i.isTwoSele = item.isOneSele
					i.isTwoTain = item.isOneSele
					i.positionthree.forEach(j => {
						j.isThreeSele = i.isTwoSele
					})
				})
				// 下级是否有选中的
				let yis = item.positiontwo.some(i => i.isTwoSele)
				item.isOneTain = yis
				// console.log(item.isOneTain);
			},
			twoListSe(item, item2) {
				item2.isTwoSele = !item2.isTwoSele
				item2.positionthree.forEach(i => {
					i.isThreeSele = item2.isTwoSele
				})
				let ers = item2.positionthree.some(i => i.isThreeSele) // 第三层是否有选中的
				item2.isTwoTain = ers
				let yi = item.positiontwo.some(i => !i.isTwoSele)
				let yis = item.positiontwo.some(i => i.isTwoTain)
				item.isOneSele = !yi
				item.isOneTain = yis
				// console.log(item.isOneTain);
				// console.log(item2.isTwoTain);
			},
			threeListSe(item, item2, item3) {
				item3.isThreeSele = !item3.isThreeSele
				let er = item2.positionthree.some(i => !i.isThreeSele) // 第三层是否有未选中的
				let ers = item2.positionthree.some(i => i.isThreeSele) // 第三层是否有选中的
				item2.isTwoSele = !er
				item2.isTwoTain = ers
				let yi = item.positiontwo.some(i => !i.isTwoSele) // 第二层是否有未选中的
				let yis = item.positiontwo.some(i => i.isTwoTain) // 第二层是否有选中的
				item.isOneSele = !yi
				item.isOneTain = yis
				// console.log(item.isOneTain);
				// console.log(item2.isTwoTain);
			},
			//确认选择
			submit() {
				let sie = this.positionlist.filter(i => i.isOneSele || i.isOneTain)
				let data = JSON.parse(JSON.stringify(sie))
				let sieo = data.map(i => {
					let tie = i.positiontwo.filter(j => j.isTwoSele || j.isTwoTain)
					let tis = JSON.parse(JSON.stringify(tie))
					let tieo = tis.map(o => {
						o.positionthree = o.positionthree.map(e => {
							return {
								isThreeSele: e.isThreeSele,
								threename: e.threename
							}
						})
						console.log(o.positionthree);
						return {
							positionthree: o.positionthree,
							archiveId: o.archiveId,
							archiveName: o.archiveName,
							isTwoSele: o.isTwoSele,
							isTwoTain: o.isTwoTain,
							twoname: o.twoname
						}
					})
					tieo.forEach(s => {
						s.positionthree = s.positionthree.filter(c => c.isThreeSele)
					})
					return {
						positiontwo: tieo,
						boxId: i.id,
						boxNo: i.boxNo,
						lockbarNo: i.lockbarNo,
						isOneSele: i.isOneSele,
						isOneTain: i.isOneTain,
						onename: i.onename
					}
				})
				sieo.forEach(i => {
					i.positiontwo = i.positiontwo.filter(i => i.isTwoTain)
				})
				console.log(sieo)
			}

		}
	}
</script>

css 部分

<style>
	page {
		/* background: #fff; */
	}

	.position-group {
		width: 100%;
		height: auto;
		padding-bottom: 200rpx;
	}

	/* 一级 */
	.pronames_one {
		width: 100%;
		height: auto;
	}

	.pronames-one-label {
		width: 100%;
		height: 120rpx;
		line-height: 120rpx;
		background: #fff;
		box-sizing: border-box;
		padding: 0px 3%;
		display: flex;
		flex-direction: row;
		justify-content: space-between;
		align-items: center;
		background-color: aliceblue;
	}

	.pronames-one-label text {
		font-size: 15px;
		color: #2ebbfe;
	}

	.pronames-one-label label {
		color: #aaa;
		transition: all 0.5s;
	}


	/* 二级 */
	.pronames_two {
		width: 100%;
		height: auto;
		transition: all 0.5s;
	}

	.pronames-two-label {
		width: 100%;
		height: 100rpx;
		line-height: 100rpx;
		display: flex;
		flex-direction: row;
		justify-content: space-between;
		align-items: center;
		box-sizing: border-box;
		padding: 0px 3%;
		background-color: #f7f7f7;
	}

	.pronames-two-label text {
		font-size: 15px;
		color: #333;
	}

	.pronames-two-label label {
		color: #aaa;
		transition: all 0.5s;
	}

	.pronames-two-option label {
		padding-left: 37px;
	}


	/* 三级 */
	.pronames_three {
		width: 100%;
		height: auto;
	}

	.pronames_three-label {
		width: 100%;
		height: 90rpx;
		padding: 0 3%;
		line-height: 90rpx;
		display: flex;
		flex-direction: row;
		align-items: center;
		background-color: #fff;
	}

	.pronames_three-label label {
		width: 10%;
		height: 90rpx;
		line-height: 90rpx;
		display: block;
		color: #D5D5D5;
	}

	.pronames_three-label text {
		width: 90%;
		font-size: 15px;
		padding-left: 10px;
		color: #868686;
	}


	/* 展开收起效果 start */

	.oneshow {}

	.oneshow .pronames_two {
		display: block;
	}

	.onehide {}

	.onehide .pronames_two {
		display: none;
	}

	/* 展开收起效果 end */


	.twoshow {}

	.twoshow .pronames_three {
		display: block;
	}

	.twohide {}

	.twohide .pronames_three {
		display: none;
	}

	.onehide:not(:last-child) {
		border-bottom: 1px #eaeaea solid;
	}

	.twohide:not(:last-child) {
		border-bottom: 1px #eaeaea solid;
	}

	.cuIcon-fold {
		width: 34rpx;
		height: 34rpx;
		background-image: url('../../static/user5.png');
		background-repeat: no-repeat;
		background-size: 100%;
		transform: rotate(-90deg);
		transition-property: transform;
		transition-duration: 0.3s;
	}

	.cuIcon-unfold {
		width: 34rpx;
		height: 34rpx;
		background-image: url('../../static/user5.png');
		background-repeat: no-repeat;
		background-size: 100%;
		transform: rotate(90deg);
		transition-property: transform;
		transition-duration: 0.3s;
	}

	.cuIcon-round {
		background-image: url('../../static/kai.png');     /* 选中 */
		background-repeat: no-repeat;
		background-size: 46rpx;
		padding-left: 54rpx;
		background-position: left center;
	}

	.cuIcon-roundcheckfill {
		background-image: url('../../static/guan.png');       /* 未选中 */
		background-repeat: no-repeat;
		background-size: 46rpx;
		padding-left: 54rpx;
		background-position: left center;
	}
</style>

效果图

原作者:uniapp 三级折叠列表(展开/收起)_uniapp 多级折叠列表-CSDN博客

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值