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组件实现更灵活的布局
- 通过动态组件根据不同的导航项显示不同的内容区域
以上方案可以根据实际项目需求选择最适合的实现方式。