Vue3 AntdV a-select实现自行输入与选择功能(setup语法糖写法)

在网上找了一些思路,大概心里有点数,但是大佬们的代码基本上都是vue2的写法,亦或者是vue3非setup语法糖写法,所以我就自己修改了一下,以此来记录自己的学习过程,文章末尾标注了实现方式的思路来源。在此声明以下思路非我原创!

有两种实现方式,第一种是当输入时会出现选项,如图

第二种则是直接输入内容,不会弹出选项卡,如图

两种实现方式的思路不同,第二种代码会更加简洁。

第一种思路的代码:

<template>
  <a-select
    v-model:value="currentValue"
    showSearch
    :options="options"
    @search="handleSearch"
    @focus="handleFocus"
    @select="handleSelect"
    style="width:200px"
  />
  <div>当前的值为:{{ currentValue }}</div>
</template>

<script setup>
import { ref, computed } from 'vue';
// import { Select, SelectOption } from 'ant-design-vue';

// 定义响应式变量
const currentValue = ref(undefined);

// 切换option列表状态 false:请求option列表 true: 动态option列表
const switchRef = ref(false);

// 动态option列表
const dynamicOptions = ref([]);

// 请求option列表
const requestOptions = ref([]);

// 计算属性 options
const options = computed(() => {
  if (switchRef.value) {
    return [...dynamicOptions.value];
  } else {
    return [...requestOptions.value];
  }
});

// 模拟请求后端接口返回options列表
const handleFocus = () => {
  requestOptions.value = [
    {
      label: '张三',
      value: '1',
    },
    {
      label: '李四',
      value: '2',
    },
    {
      label: '王五',
      value: '3',
    },
  ];
  // 用于重新弹出下拉列表时 展示请求option列表
  switchRef.value = false;
};

const handleSearch = (value) => {
  let arr = [...requestOptions.value];

  if (value) {
    let panArr = arr.filter((item) => item.label.includes(value));
    if (panArr.length <= 0) {
      switchRef.value = true;
      dynamicOptions.value = [
        {
          label: value,
          value: value,
        },
      ];
    } else {
      switchRef.value = false;
    }
  } else {
    switchRef.value = false;
    dynamicOptions.value = [];
  }
};

const handleSelect = (value) => {
  currentValue.value = value;
};
</script>

第二种思路的代码:

<template>
    <div>
      <a-select
        v-model:value="selected"
        show-search
        :notFoundContent="null"
        :filter-option="filterOption"
        style="width: 180px"
        placeholder="请选择或输入"
        @select="handleSelect"
      >
        <a-select-option
          v-for="(item, index) in list"
          :key="index"
          :value="item.id"
        >
          {{ item.value }}
        </a-select-option>
      </a-select>
      <h1>{{ selected }}</h1>
    </div>
  </template>
  
<script setup>
import { ref } from 'vue';

// 定义下拉列表
const list = [
    { id: '1', value: '香蕉' },
    { id: '2', value: '苹果' },
    { id: '3', value: '火龙果' },
];

// 定义选择器值
const selected = ref(undefined);
const handleSelect = (value) => {
    selected.value = value;
};

const filterOption = (input, option) => {
    /* 在此前是可以手动输入,但鼠标离开后,输入的内容不能在输入框内保存,
    将input的值给到a-select标签的v-model绑定的selected,即可实现将手动输入的值赋值给input */
    selected.value = input
    return option.value.toLowerCase().indexOf(input.toLowerCase()) >= 0;
};
</script>

以上两段代码都是可以直接复制跑通的,环境正确的情况下不会有bug产生。

以上两种思路均是借鉴别人而得来的,再次声明并非原创思路。

第一种思路来源:Antd/Antdv Select组件实现可输入且单选,该网站的代码并非setup语法糖写法,我也是对照着大佬的代码修改而成的。

第二种思路来源:antd中的a-select组件既可手动输入又可下拉选择,大佬的代码是vue2的写法,我依旧是对照他的代码进行修改,写成vue3 setup语法糖的模式。

以上供各位看官参考。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值