el-autocomplete 配合 @keyup.enter.native 使用时,无法关闭搜索建议弹框问题解决方案

el-autocomplete 配合 @keyup.enter.native 使用时,无法关闭搜索建议弹框问题解决方案

  1. 使用场景,本人使用element ui 时由于业务需求,需要用到一个搜索业务,看着 el-autocomplete 这个组件感觉蛮适合的,于是便踩入这个坑中。因为需要同时存在搜索建议列表和点击enter跳转搜索结果页需求,使用enter点击跳转后,无法在跳转完成时隐藏掉之前的搜索建议,通过鼠标点击其他元素却可以关闭,开始以为是因为 input 的 focus 问题,便写了一个隐藏的input框,在enter事件后 focus 在隐藏的input 中,结果仍然不行,搜索建议结果依旧坚挺。此时,经过我查看文档,反复观察,也么有提供方法进行手动关闭的选项。然后就想着,这个组件设计是不是跟我一样是个菜鸟程序猴,没考虑到这方面的问题,再一想,不对。想到一句至理名言,当有疑惑时,请仔细阅读文档。然后!结果来了!
  2. :fetch-suggestions="querySearch" 这个属性提供了很大的操作空间,fetch-suggestions 返回输入建议的方法,仅当你的输入建议数据 resolve 时,通过调用 callback(data:[]) 来返回它,
  3. 在 querySearch(queryString,cb) 中,判断当前 queryString 是否为true, 为 true 时触发enter事件,不调用 cb() 回调函数,便没有了搜索建议,便看不见了,为 false 时代表是正在输入搜索关键词,执行搜索请求接口,并调用 cb() 函数。就是这么简单,下面上源码示例:
 <el-autocomplete
        class="inline-input"
        v-model="searchWord"
        :fetch-suggestions="querySearch"
        placeholder="WHAT ARE YOU LOOKING FOR?"
        @select="handleSelect"
        :trigger-on-focus="false"
        :select-when-unmatched="true"
        popper-class="search-wrap"
        @keyup.enter.native="handleSearch"
      >
        <template slot-scope="{ item }">
          <div class="c6 size13" @click="searchTag(item)" v-html="includeWord(item.spuTitle) "></div>
        </template>
      </el-autocomplete>

```javascript
  // 输入查询关键词时的触发器
    querySearch(queryString, cb) {
      if (!queryString) {
        // 仅为输入时的搜索
        this.searchByKeyWord(cb);
      } else {
        // 输入完成时的点击enter事件后触发的,需配合 el的 :select-when-unmatched="true" 同时使用
        this.handleSearch();
      }
    },
     // 输入时进行检索
    searchByKeyWord(cb) {
      if (!this.searchWord || this.searchWord.length < 2) {
        // 如果搜索关键词长度小于2时不进行检索
        return false;
      }
      clearInterval(this.timer);
      this.timer = setTimeout(() => {
        let params = {
          sysType: 1, //系统类型 1 - PC
          keyWord: this.searchWord.trim(), // 关键词
          deviceType: 6, // 设备类型 6 - PC
          pageLocation: this.$route.path // 搜索所在页面
        };
        this.$req.shopSearchByKeyword(params).then(res => {
          if (res.code == 0) {
            this.restaurants = res.data;
            cb(this.restaurants);
          }
        });
      }, 200);
    }

关机,下班!

在这里插入图片描述

那是不可能这么嚣张的。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
使用 el-autocomplete 组件,通常会在用户输入将后端获取的数据传递给输入建议。 一种常见的做法是使用 `:fetch-suggestions` 属性来定义一个方法,该方法会在用户输入触发,并向后端发送请求获取建议选项数据。在请求返回后,将数据传递给 el-autocomplete 组件的输入建议。 以下是一个示例: ```html <template> <el-autocomplete v-model="inputValue" :fetch-suggestions="fetchSuggestions" :popper-append-to-body="false" ></el-autocomplete> </template> <script> export default { data() { return { inputValue: '', suggestions: [] }; }, methods: { fetchSuggestions(queryString, callback) { // 向后端发送请求获取建议选项数据 // 这里假设使用 axios 发送异步请求 axios.get('/api/suggestions', { params: { query: queryString } }) .then(response => { this.suggestions = response.data; // 将获取到的数据赋值给 suggestions 数组 callback(this.suggestions); // 将建议选项数据传递给 el-autocomplete 组件 }) .catch(error => { console.error(error); }); } } }; </script> ``` 在这个示例中,我们定义了一个名为 `fetchSuggestions` 的方法,并将其作为 `:fetch-suggestions` 属性的值。当用户输入值变化,该方法会被触发。 在 `fetchSuggestions` 方法中,我们使用 axios 发送异步请求来获取建议选项的数据。请求返回后,我们将数据赋值给一个名为 `suggestions` 的数组,并通过 `callback(this.suggestions)` 将建议选项数据传递给 el-autocomplete 组件。 这样,el-autocomplete 组件会根据输入值和传递的建议选项数据来显示对应的输入建议。 请根据你的实际情况,调整代码中的请求逻辑和数据处理部分。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值