vant4下拉选择器多选的封装

本来想从网上找一个封装好的直接用,没找到(可能是我没怎么找吧),然后就自己简单封装了一下,如有不好的地方,希望各位大佬多多指导(欢迎多多评论)

 效果图(支持通过关键字搜索)

1.子组件

<template>
  <div>
    <van-field
      :modelValue="selectedItems"
      readonly
      clearable
      required
      :label="label"
      :name="name"
      v-bind="$attrs"
      @click="showPopup"
    />
    <van-popup
      v-model:show="popupVisible"
      position="bottom"
      class="popup-style"
    >
      <div>
        <div class="pad10 flex-between showMultipleButton">
          <van-button plain size="normal" @click="cancelSelection"
            >取消</van-button
          >
          <!-- 标题 -->
          <div class="bold">
            {
  
  { label }}
          </div>
          <van-
### 实现 Vant2 下拉选择器与数组对象的绑定 在 Vant2 中,`Picker` 是用于实现下拉择功能的核心组件。要将其绑定到一个数组对象上,可以通过 `columns` 属性传递项数据,并通过监听事件来更新中的值。 以下是具体实现方法: #### 1. 数据结构设计 假设有一个数组对象表示可项,其形式如下: ```javascript const columns = [ { text: '项一', value: 'value1' }, { text: '项二', value: 'value2' }, { text: '项三', value: 'value3' } ]; ``` 此数组对象中,`text` 表示显示的文字内容,`value` 则是对应的值[^1]。 #### 2. 使用 Picker 组件 在模板部分引入并配置 `van-picker` 组件,设置 `columns` 属性为上述定义的对象数组。 ```html <template> <div> <!-- 显示当前中的值 --> <p>已:{{ selectedValue }}</p> <!-- 下拉选择器 --> <van-popup v-model="showPicker" position="bottom"> <van-picker :columns="columns" @confirm="onConfirm" @cancel="onCancel" show-toolbar /> </van-popup> <!-- 打开择器按钮 --> <button @click="togglePicker">打开择器</button> </div> </template> ``` #### 3. Vue 方法实现 在脚本部分编写逻辑处理函数,管理弹窗状态以及确认/取消操作的行为。 ```javascript <script> export default { data() { return { // 是否展示 picker showPicker: false, // 已中的值 selectedValue: '', // 可项数据 columns: [ { text: '项一', value: 'value1' }, { text: '项二', value: 'value2' }, { text: '项三', value: 'value3' } ] }; }, methods: { togglePicker() { this.showPicker = !this.showPicker; }, onConfirm(value) { this.selectedValue = value.value; // 更新中的值 this.togglePicker(); // 关闭 picker }, onCancel() { this.togglePicker(); // 关闭 picker } } }; </script> ``` #### 4. 处理 keep-alive 场景下的初始化问题 如果该组件被设置为 `keep-alive` 的话,在切换回页面时可能需要重新加载数据。可以利用 `activated` 生命周期钩子完成这一需求[^2]。 ```javascript activated() { if (this.columns.length === 0) { // 假设这里调用接口获取最新数据 const newData = [ { text: '动态项一', value: 'dynamic1' }, { text: '动态项二', value: 'dynamic2' } ]; this.columns = newData; } } ``` --- ### 注意事项 - 如果组件内部有复杂业务逻辑,建议将某些功能模块化或封装成独立工具函数[^4]。 - 对于级联动场景(如省市区择),需额外关注列之间的依赖关系调整。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值