js手写树形下拉

1.js部分,给每个数据加上状态标识status默认false为关闭状态

studentMyWorkAttendanceRemote(this.semesterId, query).then(res => {
	this.listData = res.data
	this.topDetails.totalOnlineMinute = res.totalOnlineMinute
	for (var i in this.listData) {
		this.listData[i].status = false
		if (this.listData[i].children.length != 0) {
			for (var j in this.listData[i].children) {
				this.listData[i].children[j].status = false
			}
		}
	}
})

2.HTML部分,做了3级

<view class="" v-for="(item,index) in listData" :key='index' style="margin: 5upx;">
	<view class="" @click="clickChapt( item.chapterId,item.status )">
		<view class="zhangStyle">
			<view class="u-line-1" style="width: 80%;">
				{{ item.chapterName }}
			</view>
			<view :class="[item.status ? 'xuanzhuang' : '']">
				<image src="../../../static/image/zahngXiala.png" mode=""
					style="width: 15px;height: 15px;"></image>
			</view>
		</view>
		<view v-if="item.children != [] && item.status  ">
			<view v-for="(item1,index1) in item.children " :key="index1">
				<view class="" @click.stop="clickChapt1( item1.chapterId,item1.status)">
					<view class="jieStyle">
						<view class="u-line-1" style="width: 80%;">
							{{ item1.chapterName }}
						</view>
						<view :class="[item1.status ? 'xuanzhuang' : '']">
							<u-icon name="arrow-down"></u-icon>
						</view>
					</view>
					<view v-if="item1.children !=[] && item1.status  ">
						<view v-for="(item2,index2) in item1.children " :key="index2">
							<view class="pianduanStyle">
								<view class="u-line-1" style="width: 80%;">
									<image src="../../../static/image/zhang.png"
										style="width: 26upx;height: 22upx;" mode=""></image>
									{{ item2.chapterName }}
								</view>
								<view style="color: #1A90FF;">
									<text v-if="item2.onlineMinute != 0">{{item2.onlineMinute}}分钟</text>
									<text v-else>未打卡</text>
								</view>
							</view>
						</view>
					</view>
				</view>
			</view>
		</view>
	</view>
</view>

3.每一级单独设置点击事件

clickChapt1(id, status) {
	for (vari in this.listData) {
		for (var j in this.listData[i].children) {
			if (this.listData[i].children[j].chapterId == id) {
				this.listData[i].children[j].status = !this.listData[i].children[j].status
			} else {
				this.listData[i].children[j].status = false
			}
			this.$forceUpdate()
		}
	}
},
clickChapt(id, status) {
	for (var i in this.listData) {
		if (this.listData[i].chapterId == id) {
			this.listData[i].status = !this.listData[i].status
		} else {
			this.listData[i].status = false
		}
		this.$forceUpdate()
	}
},

4.css样式


	.zhangStyle {
		background: #E8ECF0;
		border-radius: 4px 4px 0px 0px;
		font-size: 14px;
		font-family: PingFang-SC-Bold, PingFang-SC;
		font-weight: bold;
		color: #1A90FF;
		line-height: 20px;
		padding: 32upx;
		display: flex;
		justify-content: space-between;

		.xuanzhuang {
			transform: rotate(180deg);
		}
	}

	.jieStyle {
		background: #F5F7F9;
		border-radius: 4px;
		font-size: 14px;
		font-family: PingFangSC-Medium, PingFang SC;
		font-weight: 500;
		color: #8F8F90;
		line-height: 20px;
		padding: 10px 10px 10px 25px;
		display: flex;
		justify-content: space-between;

		.xuanzhuang {
			transform: rotate(180deg);
		}
	}

	.pianduanStyle {
		background: #F5F7F9;
		border-radius: 4px;
		padding: 10px 10px 10px 30px;
		font-size: 12px;
		font-family: PingFangSC-Regular, PingFang SC;
		font-weight: 400;
		color: #8F8F90;
		line-height: 17px;
		display: flex;
		justify-content: space-between;
		border-top: 1px #E6E6E6 solid;

		>view:first-child {
			display: flex;
			align-items: center;

			image {
				margin-right: 20upx;
			}
		}
	}

5.效果


在这里插入图片描述

好的,我可以为您提供一个简单的前端手写级联树形控件示例,您可以根据自己的需求进行修改和优化。 HTML部分: ```html <div id="tree"></div> ``` JS部分: ```javascript var data = [ { "id": 1, "name": "节点1", "parentId": 0 }, { "id": 2, "name": "节点2", "parentId": 0 }, { "id": 3, "name": "节点1-1", "parentId": 1 }, { "id": 4, "name": "节点1-2", "parentId": 1 }, { "id": 5, "name": "节点2-1", "parentId": 2 }, { "id": 6, "name": "节点2-2", "parentId": 2 }, { "id": 7, "name": "节点1-1-1", "parentId": 3 }, { "id": 8, "name": "节点1-1-2", "parentId": 3 } ]; var tree = document.getElementById("tree"); function createTree(data, parentId, level) { var ul = document.createElement("ul"); for (var i = 0; i < data.length; i++) { if (data[i].parentId == parentId) { var li = document.createElement("li"); li.innerHTML = data[i].name; li.setAttribute("data-id", data[i].id); li.setAttribute("data-level", level); ul.appendChild(li); var childUl = createTree(data, data[i].id, level + 1); if (childUl) { li.appendChild(childUl); } } } return ul.innerHTML ? ul : null; } tree.innerHTML = createTree(data, 0, 1).outerHTML; var selectedId = null; tree.addEventListener("click", function(e) { var target = e.target; if (target.tagName == "LI") { var id = target.getAttribute("data-id"); var level = target.getAttribute("data-level"); if (id != selectedId) { selectedId = id; console.log("您选择了ID为" + id + ",层级为" + level + "的节点"); } } }); ``` 这段代码实现了一个简单的树形结构,您可以根据自己的需要进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值