Vue2 自定义vant-select封装

 select组件封装代码

<template>
  <div>
    <van-field
      :class="fieldClass"
      v-model="text"
      v-bind="$attrs"
      readonly
      is-link
      :name="$attrs.name"
      @click="show = !show"
    >
    </van-field>
    <van-popup v-model="show" round position="bottom" get-container="body">
      <van-picker
        :columns="columns"
        show-toolbar
        :value-key="labelKey"
        :title="$attrs.label"
        :default-index="index"
        :loading="$attrs.loading"
        @cancel="show = !show"
        @confirm="onConfirm"
      ></van-picker>
    </van-popup>
  </div>
</template>

<script>
export default {
  name: "van-select",
  props: {
    columns: {
      type: Array,
    },
    modelValue: {
      type: [String, Number],
      default: "",
    },
    // field块自定义类名
    fieldClass: {
      type: String,
      default: "",
    },
    // 选项对象中,选项文字对应的键名
    labelKey: {
      type: String,
      default: "label",
    },
    // 选项对象中,选项值对应的键名
    valueKey: {
      type: String,
      default: "value",
    },
  },
  data() {
    return {
      show: false,
      value: "",
      text: "",
      index: 0,
    };
  },
  created() {
    this.echo() // 初始值默认存在
  },
  watch: {
    value(newVal) {
      this.$emit("update:modelValue", newVal);
    },
    /**
     * @description: 初始值异步更新,触发value更新
     */
    modelValue() {
      this.echo();
    },
    /**
     * @description: columns异步更新,触发value更新
     */
    columns() {
      this.echo();
    },
  },

  methods: {
    onConfirm(value) {
      this.text = value[this.labelKey];
      this.value = value[this.valueKey];
      this.show = !this.show;
    },
    echo() {
      this.columns.some((item, index) => {
        if (item[this.valueKey] === this.modelValue) {
          this.text = this.columns[index][this.labelKey];
          this.index = index;
          return true;
        } else {
          return false;
        }
      });
    },
  },
};
</script>

使用van-select组件 

<van-select
  :modelValue.sync="formData.value6"
  :columns="columns1"
  fieldClass="field"
  input-align="right"
  clearable
  label="供电电压"
  placeholder="请选择"
  :rules="[{ required: true }]"
></van-select>

对应的数据

export const columns1 = [
  {
    label: '苹果',
    value: '01',
  },
  {
    label: '香蕉',
    value: '02',
  },
]

组件props解释

  1. columns:传入的对象数组,支持异步更新,内部van-field的显示值和van-picker的选项也会自动更新

  2. modelValue: 传入的默认值,支持异步更新,内部van-field的显示值也会自动更新

  3. fieldClass:可以给select内部的van-field传递自定义类名,需要使用样式穿透

  4. labelKey:对象数组用于显示的字段的键名,默认label

  5. valueKey:对象数组用于value的字段的键名,默认value

修改转载自:vue3 vant picker封装select 并支持回显清空_vant-ui中picker 选择器清空选择值_阿狸!!!!的博客-CSDN博客

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值