【无标题】

vue3中使用antd 4.0 select组件可选择也可输入可搜索

<template>
	<Select
	     v-model:value="changeReason"
	     :search-value="searchReason"
	     :options="reasonList"
	     :show-search="true"
	     :filter-option="filterOptions"
	     @input-key-down="keyDownFn"
	     @search="searchReasonFn"
	     @change="changeReasonFn"
	 />
</template>
<script setup lang="ts">
  import { ref } from 'vue';
  const changeReason = ref();
  const searchReason = ref();
  const reasonList = [
 	{label: '喜喜', value: 'xixi' },
 	{label: '哈哈', value: 'haha'}
  ]

  // 搜索选项中是否存在输入的内容
  const filterOptions = (v, o) => {
    return o.value.indexOf(v) >= 0;
  };
  
  let canClear = false;
  // 原Select输入内容时,search事件会清楚输入的内容,所以设置是否可以清楚输入内容canClear,如果输入内容长度为1且按键是Backspace/Delete则可以清除输入的内容,否则不可以删除
  function keyDownFn(e) {
    canClear = false;
    if (e.target.value.length == 1 && e.key == 'Backspace') {
      canClear = true;
    }
    if (e.target.value.length == 1 && e.key == 'Delete') {
      canClear = true;
    }
  }
  
  // 输入内容时会触发search事件
  function searchReasonFn(v) {
  	// 在blur的时候输入的数据会被清除,所以看canClear是否可以清除输入值
    if (!v) {
      searchReason.value = canClear ? v : searchReason.value;
      changeReason.value = canClear ? v : changeReason.value;
      return;
    }
    // 如果输入的数据选项中有,就直接赋值给changeReason和searchReason
    let data = reasonList.value?.find((i) => i.label == v);
    changeReason.value = data ? data.label : undefined;
    searchReason.value = v;
  }
  
  // change事件触发的时候把searchReason删除掉,如果不删除select只能显示输入的值
  function changeReasonFn() {
    searchReason.value = undefined;
  }
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值