在uniapp中实现折叠面板的效果 树形结构数据

本来以为只能在DCloud找组件来套,找了一圈发现都不是非常适合自己的需求,而且有些由于说明不全或难以理解做适应自己的细小变动,索性自己写了一遍。

效果大致是这样的,可以看得出来我有些层级展开到第二层就不往下继续了,而有些第二层下面还有第三层,所以,让我们来看看是如何实现的吧~

我先拆分给大家讲解一下各部分代码的意思,完整代码放在最后大家可以直接取用。

首先给大家看一下我们这里要渲染的data里面list的数据结构,需要注意的是,每一个还有子级的元素必须有一个open属性,用以作为控制当前层级是否展开的依据,供我们来操作显示与否。

list: [{
						name: "家电清洗",
						open: false,
						child: [{
							name: "空调清洗",
							child: []
						}, {
							name: "油烟机清洗",
							child: []
						}]
					},
					{
						name: "水电维修安装",
						open: false,
						child: [{
							name: "灯具电路维修与安装",
							open: false,
							child: [{
								name: "电路检测与维修",
								child: []
							}, {
								name: "灯具维修与安装",
								child: []
							}]
						}, {
							name: "龙头管件维修与安装",
							open: false,
							child: [{
								name: "水龙头维修与安装",
								child: []
							}, {
								name: "水管维修与安装",
								child: []
							}, {
								name: "阀门维修与安装",
								child: []
							}]
						} , {
							name: "管道疏通",
							open: false,
							child: [{
								name: "马桶疏通",
								child: []
							}, {
								name: "地漏疏通",
								child: []
							}]
						}]
					},
					{
						name: "房屋修缮",
						open: false,
						child: [{
								name: "防水补漏",
								open: false,
								child: [{
										name: "漏水定位检测",
										child: []
									}, {
										name: "卫生间防水补漏",
										child: []
									}, {
										name: "屋顶防水补漏",
										child: []
									}
								]
							}, {
								name: "房屋局改",
								open: false,
								child: [{
									name: "适老化改造",
									child: []
								}, {
									name: "儿童房改造",
									child: []
								}]
							}

						]
					}
				],

这一部分主要是三层v-for循环,每一级标题判断是否还有子级元素,如果有的话就需要“展开”和“收起”的按钮;

先看第一层:

第一层是最外层分类,如果这一层包含了子级那么item.child.length>0就能判断出来,且这时候item.open的状态也是true,也就是被点击之后,子级就会展示。

<view class="lvone" v-for="(item,index) in list">
    <view class="lvoneline">
        <view class="lvonetitle">{
  {item.name}}</view>
            <view class="oneexpand" v-if="item.child.length > 0 && item.open == false" @click="toggleOne(index)">
            </view>
			<view class="onecollapse" v-if="item.child.length > 0 && item.open == true" @click="toggleOne(index)">
			</view>
...

展开和收起的按钮,每点击一次都需要切换当前的展开/收起状态,但是因为是循环,我们需要将当前操作动作的这个元素的索引传给方法toggleOne(index)或者toggleTwo(index,childindex),否则点击一下,所有当前层级都会开始动。这里注意,二级标题的展开和收起除了要传当前自己的索引,也要传递父级索引。一级标题收起的时候需要将其下的所有子级的open属性都置为false,所有子级也需要收起。

// 一级分类展开关闭
toggleOne(index) {
    const item = this.list[index];    
    if (item.open) {
		item.open = false;
		item.child.forEach(child => child.open = false);
	} else {
	    item.open = true;
	}
},
// 二级分类展开关闭
toggleTwo(index, childindex) {
	this.list[index].child[childindex].open = !this.list[index].child[childindex].open
}

从第二层开始,有些已经变成了可选择的项,而有些还有子级可以继

### 实现 UniApp H5 端树形结构数据展示 在 UniApp 中,H5 端可以通过多种方式来实现树形结构数据的展示。通常的做法是利用前端框架中的组件化开发能力以及 CSS 的样式支持[^1]。 #### 数据准备 树形结构数据一般是以嵌套对象的形式存在,例如: ```javascript const treeData = [ { id: 1, name: '节点1', children: [ { id: 2, name: '子节点1-1' }, { id: 3, name: '子节点1-2', children: [{ id: 4, name: '子节点1-2-1' }] } ] }, { id: 5, name: '节点2' } ]; ``` 上述 `treeData` 是典型的树形结构数据模型,其中每个节点可能包含子节点 `children` 属性[^2]。 #### 使用递归组件渲染树形结构 UniApp 支持 Vue.js 的语法特性,因此可以借助 Vue 的递归组件功能来动态渲染树形结构。以下是具体实现方法: ##### 组件定义 创建一个名为 `TreeItem.vue` 的组件用于递归渲染树节点: ```vue <template> <view class="tree-node"> <!-- 当前节点 --> <text>{{ node.name }}</text> <!-- 子节点列表 --> <block v-if="node.children && node.children.length > 0"> <TreeItem v-for="(child, index) in node.children" :key="index" :node="child" /> </block> </view> </template> <script> export default { name: 'TreeItem', props: { node: { type: Object, required: true } } }; </script> <style scoped> .tree-node { padding-left: 20px; } </style> ``` 此组件通过接收父级传递的 `node` 参数,判断是否存在子节点并递归调用自身完成整个树的渲染[^3]。 ##### 页面集成 在页面中引入该组件并将数据绑定到根节点上: ```vue <template> <view> <TreeItem v-for="(item, index) in treeData" :key="index" :node="item" /> </view> </template> <script> import TreeItem from './components/TreeItem.vue'; export default { components: { TreeItem }, data() { return { treeData: [ { id: 1, name: '节点1', children: [ { id: 2, name: '子节点1-1' }, { id: 3, name: '子节点1-2', children: [{ id: 4, name: '子节点1-2-1' }] } ] }, { id: 5, name: '节点2' } ] }; } }; </script> ``` 以上代码展示了如何将树形结构数据映射成可视化的 HTML 结构,并通过递归逻辑处理多层嵌套关系[^4]。 #### 样式优化 为了增强用户体验,可以在不同层次增加缩进效果或者图标表示展开折叠状态。例如,在 `.tree-node` 类基础上添加背景颜色渐变或边框装饰[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值