vant表单使用TreeSelect 分类实现多选效果

目的:实现二级分类多选(一级分类下的二级菜单多选),把所选的值赋给表单。
背景:因项目选用vant,不想额外找其他的插件啦,发现vant中有TreeSelect 恰好也支持多选效果,以此文章来记录一下具体的实现过程。

先看效果图,如下所示:

1.引入TreeSelect 

import Vue from 'vue';
import { TreeSelect } from 'vant';

Vue.use(TreeSelect);

2.代码实现

<van-form ref="form">
       <div class="input-box">
          <span class="input-box_span">大类</span>
          <van-field
              readonly
              clickable
              :value="form.tag"
              placeholder="请选择大类"
              @click="getShowTag"
          />
          <van-popup v-model="showTag" position="bottom" :close-on-click-overlay="false">
            <div class="van-picker__toolbar">
              <button type="button" class="van-picker__cancel" @click="cancelTag">取消</button>
              <button type="button" class="van-picker__confirm" @click="confirmTag">确认</button>
            </div>
            <van-tree-select
                :items="items"
                :active-id.sync="items"
                :main-active-index.sync="activeIndex"
                @click-nav="onClickNav"
                @click-item="onClickItem"/>
          </van-popup>
        </div>
</van-form>
export default {
  data() {
    return {
      activeIndex: 0,
      form: {
        tag:'', // 大类
      },
       items:[
          {text:'颜色',
            children:[
                {id:'YS_1',text:'红色',isCheck:false},
                {id:'YS_2',text:'粉彩',isCheck:false}
            ]
          },
          {text:'玉翠',
             children:[
                {id:'YC_1',text:'哈哈',isCheck:false},
                {id:'YC_2',text:'单色',isCheck:false}
            ]
          }
        ],
      showTag:false, // 大类
      selectTagList:[], // 选中的二级分类
    };
  },
  methods: {
    getShowTag(){
      this.showTag = true
    },
    onClickNav(index) { // 点击触发左侧大类
      this.leftTagIndex = index
      let tagList = this.items
      // 切换左侧大类时,初始化选中状态
      tagList[index].children.forEach( tag => { 
        tag.isCheck = false
      });
      this.items = tagList
    },
    onClickItem(item) { // 点击触发大类右侧二级分类
      let index = this.leftTagIndex
      this.selectTagList = this.items[index].children
      // 切换勾选状态
      this.selectTagList.forEach( tag => {
        if (tag.id === item.id) {
          tag.isCheck = !item.isCheck
        }
      });
    },
    cancelTag(){ // 取消大类选择
      this.showTag = false
    },
    confirmTag(){ // 获取选中大类标签
      const checkedTags = this.selectTagList.filter(tag => tag.isCheck)
      let text = checkedTags.map( item => item.text)
      this.form.tag = text.join(',')
      this.showTag = false
    },
}
};

PS:看了vant官网只有点击左侧导航(click-nav)和点击右侧导航(click-item)事件,切换左侧导航没有重置勾选的状态,因此我使用了一种笨方法,触发事件手动初始赋值。

如有不足或者更好的方法欢迎大家留言,谢谢~~

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vant TreeSelectVant UI库中的一个组件,用于实现分类择的效果。通过TreeSelect组件,你可以展示一个树形结构的项,并允许用户择其中的一项。 在Vue项目中,你需要先引入TreeSelect组件,并在Vue实例中注册它,以便在项目中使用。你可以使用以下代码来引入和注册TreeSelect组件: import Vue from 'vue'; import { TreeSelect } from 'vant'; Vue.use(TreeSelect); TreeSelect在项目中的使用频率相对较高。尽管组件易用且原理简,但仍然存在一些用户体验上的问题。其中最常见的问题是关于左侧导航栏和右侧内容的滚动。在移动端中,大多数情况下都是以keep-alive模式运行,这意味着当TreeSelect可见时,左侧导航栏和右侧内容也需要保持可见。另外,点击左侧项或右侧项时,需要使TreeSelect滚动到中间位置,以优化用户体验。 综上所述,Vant TreeSelect是一个方便实现分类效果的组件,但在使用过程中可能需要注意一些用户体验上的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [在vue中使用vant TreeSelect分类择组件操作](https://download.csdn.net/download/weixin_38661087/14919626)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [vant使用TreeSelect 分类实现效果](https://blog.csdn.net/weixin_45183187/article/details/131090401)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Vant 源码解析——TreeSelect](https://blog.csdn.net/u011581932/article/details/126791927)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值