vue2 实现类似百度一下,支持可输入模糊查询,也支持输入时下拉选择,回车查询

文章展示了如何在Vue2中创建一个类似于百度搜索的输入组件,该组件支持用户输入时的模糊查询,提供下拉选择选项,并在回车时执行查询操作。使用了el-autocomplete组件来实现这些功能,包括数据过滤、回车事件处理和清空输入等交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vue2 实现类似百度一下,支持可输入模糊查询,也支持输入时下拉选择,回车查询

AgentNameInput.vue

<template>
  <div class="AgentNameInput">
    <div class="label">
      代理名称:{{ stateInput }}
    </div>
    <div class="input-wrap">
      <!-- @change="enterQuerySearch2" @keyup.enter.native="enterQuerySearch"-->
      <el-autocomplete
        v-model="stateInput"
        class="inline-input"
        :fetch-suggestions="querySearch"
        :select-when-unmatched="true"
        :debounce="500"
        clearable
        placeholder="请输入内容"
        @select="handleSelect"
        @clear="setBlur()"
      />
    </div>
  </div>
</template>

<script>
export default {
  name: 'AgentNameInput',
  props: {
    value: {
      type: [String, Number],
      default: ''
    }
  },
  data() {
    return {
      restaurants: []
    }
  },
  computed: {
    matchingValue1() {
      return this.matchingValue
    },
    stateInput: {
      get() {
        return this.value
      },
      set(newV) {
        this.$emit('input', newV)
      }
    }
  },
  mounted() {
    this.restaurants = this.loadAll()
  },
  methods: {
    querySearch(queryString, cb) {
    //   console.log('queryString', queryString)
      var restaurants = this.restaurants
      var results = queryString
        ? restaurants.filter(this.createFilter(queryString))
        : restaurants
      // 调用 callback 返回建议列表的数据
      cb(results)
    },
    createFilter(queryString) {
      return restaurant => {
        return (
          restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) ===
          0
        )
      }
    },
    // // 回车拿到的值 label的值
    // enterQuerySearch(event) {
    //   console.log('回车', event.target.value)
    // },
    // 下拉选择的值
    handleSelect(item) {
      console.log('handleSelect-item', item)
    },
    // enterQuerySearch2(event) {
    //   console.log('enterQuerySearch2', event)
    // },
    setBlur() {
      //  在点击由 clearable 属性生成的清空按钮时,主动触发失去焦点,解决‘fetch-suggestions’输入建议不提示的bug
      document.activeElement.blur()
    },
    loadAll() {
      return [
        { value: '1', address: '测试1' },
        { value: '2', address: '测试2' },
        { value: '3', address: '测试3' },
        { value: '4', address: '测试4' },
        { value: '11', address: '测试11' },
        { value: '12', address: '测试12' },
        { value: '13', address: '测试13' },
        { value: '14', address: '测试14' },
        { value: '111', address: '测试111' },
        { value: '122', address: '测试122' },
        { value: '123', address: '测试123' }
      ]
    },
    refreshData() {
      this.state = ''
    }
  }
}
</script>
<style lang="scss" scoped>
.AgentNameInput {
  background: #fff;
  display: flex;
  height: 32px;
  line-height: 32px;

  .label {
    text-align: right;
    padding-right: 12px;
    width: 110px;
    font-size: 12px;
    color: #666;
  }

  .input-wrap {
    position: relative;
    display: flex;
    align-items: center;
    width: calc(100% - 110px);
    margin-top: -1px;

    .input {
      width: 272px;
      height: 32px;
      border: 1px solid #ccc;
    }

    .select-wrap {
      position: absolute;
      top: 37px;
      left: 0;
      height: 210px;
      width: 272px;
      background: #fff;
      z-index: 1000;
      border: 1px solid #ccc;
      padding: 5px 8px;

      .li-item {
        height: 20px;
        line-height: 20px;
        font-size: 14px;
        background: #ccc;
        margin-bottom: 3px;
        cursor: pointer;
      }

      .active {
        color: red;
      }
    }
  }
}
</style>

父组件

    <div>form - {{ form }}</div>
    <AgentNameInput ref="AgentIdSelectInputRef" v-model="form.inputVal"></AgentNameInput>

      form: {
        inputVal: ''
      }

    reset() {
      // 重置
      this.form.inputVal = ''
    }

效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值