Vue3搜索search+下拉选择select的输入框【モモト】

一个输入框,可以输入进行搜索,输入框可以清空,聚焦输入框时上次搜索结果自动清空变为placeholder。

<template>
    <el-popover
      :visible="visible"
      placement="bottom-start"
      :show-arrow="false"
      :teleported="false"
      width="calc(100vw - 288px)"
    >
      <template #reference>
        <div>
          <el-input
            ref="InputRef"
            v-model="search"
            class="country-select"
            filterable
            :placeholder="current"
            :style="inputStyle"
            @focus="focusInput"
            @blur="blurInput"
          >
            <template #append>
              <IconArrowDown
                :class="{ 'arrow-icon': true, 'is-reverse': visible }"
                @click="onBtnClick"
              />
            </template>
          </el-input>
        </div>
      </template>
      <div>
        <SelectEmpty
          v-if="loading || error || (!loading && !countries.length)"
          :loading="loading"
          title="モモ"
          :error="error"
          @retry="request"
        />
        <div
          v-else
          v-show="visible"
          :tabindex="-1"
          @focusin="onFocus"
          @focusout="onBlur"
          @mouseover="() => (hover = true)"
          @mouseleave="() => (hover = false)"
        >
          <SearchList
            v-if="isValue(search)"
            :list="list"
            :input="search"
            @setItem="onSelect"
          />
          <SelectGroup
            v-else
            :continents="continents"
            @setItem="onSelect"
          />
        </div>
      </div>
    </el-popover>
</template>
<script setup lang="ts">
  import SearchList from './SearchList.vue'
  import SelectGroup from './SelectGroup.vue'
  import { isValue } from '@/utils/validotar'

  const props = defineProps<{
    modelValue: any
    placeholder?: string
    inputStyle?: any
  }>()

  let search = $ref(props.modelValue?.value)
  let inputting = $ref(false)
  let focus = $ref(false)
  let hover = $ref(false)

  const visible = computed(() => inputting || focus)

  const current = computed(() => props.modelValue?.title || '')

  const InputRef = ref<any>()

  watch([visible, current], () => {
    search = visible.value ? '' : current.value
    if (search === '请选择(必选)') {
      search = ''
    }
  })

  const onBtnClick = () => {
    if (visible.value === false) {
      unref(InputRef).focus()
    }
    inputting = !visible.value
  }

  const focusInput = () => {
    inputting = true
  }

  const blurInput = () => {
    setTimeout(() => {
      inputting = false
    }, 100)
  }

  const onFocus = () => {
    focus = true
  }

  const onBlur = () => {
    if (!hover) {
      setTimeout(() => {
        focus = false
      }, 100)
    }
  }
</script>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值