Vant组件--下拉多选和单选功能

Vant组件–支持下拉多选和单选

<template>
  <van-picker
    :title="placeholder || '请选择'"
    :columns="optionsConverted"
    @cancel="handleCancel"
    @confirm="handleConfirm"
  >
    <template #option="option">
      <!-- 多选 -->
      <div v-if="isMultiple">
        <van-checkbox-group
          v-model="selectedValue"
        >
          <van-checkbox :key="option.value" :name="option.value" shape="square">{{ option.text }}</van-checkbox>
        </van-checkbox-group>
      </div>
      <!-- 单选 -->
      <div v-else>
        <van-radio-group
          v-model="selectedValue"
        >
          <van-radio
            :key="option.value"
            :name="option.value"
            shape="square"
          >{{ option.text }}</van-radio>
        </van-radio-group>
      </div>
    </template>
  </van-picker>
</template>

<script setup>
const props = defineProps({
  label: {},
  placeholder: {
    type: String,
    default: '请选择',
  },
  columns: {
    type: Array,
    default: () => [],
  },
  isMultiple: {
    type: Boolean,
    default: false,
  },
});
const selectedValue = ref([]);

const emits = defineEmits(['cancel', 'confirm']);

const optionsConverted = computed(() => unref(props.columns).map((option) => ({
  text: option.label,
  value: option.value,
})));

const handleCancel = () => {
  emits('cancel');
};

const handleConfirm = () => {
  emits('confirm', selectedValue.value);
};

</script>

组件使用

  <div>
    <van-field
      v-model="pickedLabel"
      :is-link="true"
      placeholder="请选择消息类型"
      @click="showPicker = true"
    />
  </div>
  <van-popup v-model:show="showPicker" round position="bottom">
    <mb-picker
      title="类别筛选"
      :columns="sendMsgType.toArray()"
      :is-multiple="true"
      @confirm="onConfirm"
      @cancel="onCancel"
    />
  </van-popup>

效果

在这里插入图片描述

### Vant 组件库中 `van-dropdown-menu` 的功能 #### 功能支持情况 Vant 官方文档并未直接提供关于 `van-dropdown-menu` 支持功能说明[^1]。然而,通过自定义扩展可以实现这一需求。 --- #### 实现方式 为了实现 `van-dropdown-menu` 的功能,可以通过以下方法: 1. **自定义下拉项内容** 使用 `<van-dropdown-item>` 的插槽来自定义其内部结构,允许用户项并展示已中的结果。 2. **维护状态管理** 需要引入一个数组来存储当前中的项数据,并在每次点击时更新该数组的状态。 3. **动态渲染中结果显示** 将中的项名称拼接成字符串显示到标题栏中。 以下是具体代码示例: ```vue <template> <van-dropdown-menu> <!-- 自定义 dropdown-item --> <van-dropdown-item title="请择" ref="multiSelect"> <van-checkbox-group v-model="selectedItems" @change="onChange"> <div v-for="(item, index) in options" :key="index" style="padding: 10px;"> <van-checkbox :name="item.value">{{ item.text }}</van-checkbox> </div> </van-checkbox-group> <!-- 底部按钮 --> <div style="text-align: center; margin-top: 20px;"> <van-button type="primary" size="small" @click="confirmSelection">确认</van-button> <van-button type="default" size="small" @click="cancelSelection">取消</van-button> </div> </van-dropdown-item> </van-dropdown-menu> </template> <script> export default { data() { return { selectedItems: [], // 存储中的值 options: [ { text: '项一', value: 'value1' }, { text: '项二', value: 'value2' }, { text: '项三', value: 'value3' } ] }; }, methods: { onChange(checkedValues) { console.log('当前中的值:', checkedValues); }, confirmSelection() { const titles = this.options .filter(option => this.selectedItems.includes(option.value)) .map(option => option.text); this.$refs.multiSelect.setTitle(titles.join(', ') || '未择'); this.$refs.multiSelect.toggle(); // 关闭菜单 }, cancelSelection() { this.$refs.multiSelect.toggle(); // 取消操作并关闭菜单 } } }; </script> ``` --- #### 样式优化建议 如果发现滚动穿透或其他交互问题,可参考以下解决方案: - 添加全局样式控制弹窗可见性[^5]: ```css page-visible { overflow: hidden; } ``` - 修改特定组件的层级关系以防止冲突[^4]: ```css .custom-class .van-dropdown-item { overflow: visible !important; position: static !important; } ``` --- ### 注意事项 1. 如果需要兼容更场景(如小程序),需额外注意事件绑定逻辑可能存在的差异。 2. 对于复杂业务逻辑,推荐封装独立组件以便复用维护。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值