Vant TreeSelect 左侧导航区域内容自定义解决方案
Vant的TreeSelect组件默认情况下左侧导航区域显示的是分类标题,但我们可以通过插槽(slot)机制来实现自定义内容。
解决方案思路
- 使用
nav-item插槽来自定义左侧导航项内容 - 通过作用域插槽可以获取当前导航项的数据
- 结合Vant的其他组件(如Icon)来丰富展示效果
代码实现
<template>
<van-tree-select
:items="items"
:main-active-index.sync="activeIndex"
>
<!-- 自定义左侧导航内容 -->
<template #nav-item="{ item, selected }">
<div class="custom-nav-item" :class="{ 'active': selected }">
<van-icon :name="item.icon" />
<span>{{ item.text }}</span>
<span class="badge" v-if="item.count">{{ item.count }}</span>
</div>
</template>
</van-tree-select>
</template>
<script>
export default {
data() {
return {
activeIndex: 0,
items: [
{
text: '分组1',
icon: 'shop-o',
count: 5,
children: [
{ text: '选项1' },
{ text: '选项2' }
]
},
{
text: '分组2',
icon: 'shopping-cart-o',
count: 3,
children: [
{ text: '选项3' },
{ text: '选项4' }
]
}
]
}
}
}
</script>
<style scoped>
.custom-nav-item {
display: flex;
align-items: center;
padding: 10px 12px;
font-size: 14px;
}
.custom-nav-item.active {
color: #1989fa;
background: #f2f2f2;
}
.custom-nav-item .van-icon {
margin-right: 5px;
}
.badge {
margin-left: auto;
padding: 0 6px;
font-size: 12px;
border-radius: 10px;
background: #f44;
color: white;
}
</style>
关键点说明
- nav-item插槽:这是自定义左侧导航项的关键插槽
- 作用域参数:插槽提供了item(当前项数据)和selected(是否选中)两个参数
- 样式控制:通过selected参数可以控制选中状态的样式
- 数据结构:items数组中的每个对象可以添加自定义属性(如icon、count等)
扩展方案
如果需要更复杂的自定义,可以考虑以下方案:
- 完全自定义左侧导航,不使用TreeSelect组件,而是自己实现左右布局
- 结合van-sidebar和van-tree-select组件实现更灵活的布局
- 通过动态组件根据不同的导航项显示不同的内容区域
以上方案可以根据实际项目需求选择最适合的实现方式。