Vue.js中如何在无下级子项时隐藏+/-按钮
Vue树形列表:无子女节点隐藏展开/收起按钮
要实现当下级没有子项时隐藏+/-按钮,只需通过条件渲染控制按钮显示,并配合状态管理控制子列表的展开/收起,具体步骤如下:
1. 新增展开状态管理
在组件的data中添加一个对象,用来记录每个节点的展开状态:
export default { data() { return { expanded: {} // 用节点唯一标识作为键,存储展开状态(true/false) } } }
2. 修改模板结构
核心逻辑:
- 仅当节点存在子项(
子数组存在且长度>0)时,才渲染展开/收起按钮 - 通过按钮点击切换对应节点的展开状态
- 子列表的显示/隐藏由展开状态控制
- 修复重复的
id和for属性,避免checkbox关联错误
修改后的模板代码:
<template v-for="(item, index) in SevenLengthlist" :key="item"> <ul> <li> <!-- 第一级节点:有子项才显示按钮 --> <span v-if="item.TenLength && item.TenLength.length > 0" @click="expanded[`level1-${index}`] = !expanded[`level1-${index}`]" style="cursor: pointer;"> {{ expanded[`level1-${index}`] ? '-' : '+' }} </span> <input type="checkbox" :id="`item-level1-${index}`" /> <label :for="`item-level1-${index}`">{{ item.mAcName }} --- {{ item.mName }}</label> <!-- 第一级子列表:根据展开状态显示 --> <ul v-show="expanded[`level1-${index}`]"> <li v-for="(item2, idx2) in item.TenLength" :key="item2"> <!-- 第二级节点:有子项才显示按钮 --> <span v-if="item2.TenLength && item2.TenLength.length > 0" @click="expanded[`level2-${index}-${idx2}`] = !expanded[`level2-${index}-${idx2}`]" style="cursor: pointer;"> {{ expanded[`level2-${index}-${idx2}`] ? '-' : '+' }} </span> <input type="checkbox" :id="`item-level2-${index}-${idx2}`" /> <label :for="`item-level2-${index}-${idx2}`">{{ item2.mAcName }} --- {{ item2.mName }}</label> <!-- 第二级子列表:根据展开状态显示 --> <ul v-show="expanded[`level2-${index}-${idx2}`]"> <li v-for="(item3, idx3) in item2.TenLength" :key="item3"> <!-- 第三级无子女节点,无需按钮 --> <input type="checkbox" :id="`item-level3-${index}-${idx2}-${idx3}`" /> <label :for="`item-level3-${index}-${idx2}-${idx3}`">{{ item3.mAcName }} --- {{ item3.mName }}</label> </li> </ul> </li> </ul> </li> </ul> </template>
3. 关键细节说明
- 按钮显示条件:
v-if="item.TenLength && item.TenLength.length > 0"确保只有存在子项的节点才会渲染展开/收起按钮 - 展开状态标识:用
level1-${index}、level2-${index}-${idx2}这种拼接字符串作为expanded对象的键,保证每个节点的状态唯一 - 子列表控制:通过
v-show根据展开状态控制子列表的显示/隐藏(v-show会保留DOM结构,适合频繁切换的场景;如果需要销毁DOM可以用v-if) - checkbox关联修复:动态生成
id和for属性,避免多个checkbox共用同一个id导致的关联错误
内容的提问来源于stack exchange,提问作者Meow
相关产品推荐
相关产品推荐

