Bootstrap

el-autocomplete组件模糊查询及显示空白解决方法

  

el-autocomplete组件模糊查询显示空白,如图所示

原因:

下面这里是官网的部分JS代码,是因为这里只能使用restaurant.value,尽管后端传值给restaurant下是其他key的名称也不行(后端传来的只能是value,或者通过JS再处理一下)。

   createFilter(queryString) {
        return (restaurant) => {
          return (restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0);
        };

:value-key="item.valueKey" 

valueKey就是显示的名称

 解决方案:

将结果进行处理一下,用value返回。

成功了。

扩展阅读: 

示例一:基本使用

<template>
  <el-autocomplete
    v-model="state"
    :fetch-suggestions="querySearch"
    placeholder="请输入"
    trigger-on-focus>
  </el-autocomplete>
</template>

<script>
export default {
  data() {
    return {
      state: '',
      dataList: [
        { custom_name: '北京xxxxxx公司' },
        { custom_name: '上海xxxx公司' },
        { custom_name: '广州xxxx公司' },
        { custom_name: '深圳xxxx公司' }
      ]
    };
  },
  methods: {
    querySearch(queryString, cb) {
      var dataList = this.dataList.forEach(item=>{
               //必须使用value
             item.value = item.custom_name
        });
      var results = queryString ? dataList.filter(this.createFilter(queryString)) : dataList;
      // 调用 callback 返回建议列表的数据
      cb(results);
    },
    createFilter(queryString) {
      return (data) => {
        return (data.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0);
      };
    }
  }
};
</script>

 示例二:实现模糊匹配

为了让 el-autocomplete 支持模糊匹配,我们需要修改 createFilter 函数。

createFilter(queryString) {
  return (data) => {
    return data.value.toLowerCase().includes(queryString.toLowerCase());
  };
}

通过将 indexOf 替换为 includes 方法,我们现在可以实现部分匹配。

示例三:优化搜索体验

为了提供更好的用户体验,我们可以增加一些额外的功能,比如搜索高亮、最近搜索记录等。

methods: {
  createFilter(queryString) {
    return (data) => {
      const lowerCaseQuery = queryString.toLowerCase();
      const lowerCaseCity = data.value.toLowerCase();
      return lowerCaseCity.includes(lowerCaseQuery);
    };
  },
  highlightMatch(term, query) {
    const regExp = new RegExp(query, 'gi');
    return term.replace(regExp, '<strong>$&</strong>');
  }
},

在 el-autocomplete 的模板中,我们可以使用这个方法来高亮匹配的部分。

<template>
  <el-autocomplete
    v-model="state"
    :fetch-suggestions="querySearch"
    placeholder="请输入"
    trigger-on-focus>
    <template slot-scope="{ item }">
          <span v-html="highlightMatch(item.value, state)"></span>
   </template>

  </el-autocomplete>
</template>

示例四:使用第三方库

对于更复杂的模糊搜索需求,可以考虑使用像 Fuse.js 这样的第三方库,它提供了一种简单的方式来执行模糊搜索。

import Fuse from 'fuse.js';

const options = {
  shouldSort: true,
  threshold: 0.6,
  location: 0,
  distance: 100,
  maxPatternLength: 32,
  minMatchCharLength: 1,
  keys: ['value']
};

this.fuse = new Fuse(this.dataList, options);

methods: {
  querySearch(queryString, cb) {
    const results = this.fuse.search(queryString);
    cb(results.map(result => result.item));
  }
}

通过这种方式,我们可以获得更精确的模糊搜索结果。

示例五:结合Vuex存储搜索历史

为了保持搜索记录,我们可以使用 Vuex 来存储最近的搜索历史。

import { mapState, mapMutations } from 'vuex';

export default {
  computed: {
    ...mapState(['searchHistory'])
  },
  methods: {
    ...mapMutations(['addSearchHistory']),
    onInput(value) {
      this.addSearchHistory(value);
    }
  },
  created() {
    this.$store.dispatch('loadSearchHistory');
  }
};

然后,在 Vuex store 中定义相应的 actions 和 mutations 来处理搜索历史的保存和加载。

;