使用autocomplete组件来实现前端模糊匹配

418 阅读1分钟

纯前端实现模糊搜索

本文主要使用autocomplete组件来实现

autocomplete组件介绍

autocomplete是input组件的一个分支,专门用来处理模糊匹配的相关知识,很多时候用户希望输入一个单词就可以自动匹配到相关的内容,内容会显示在下拉框,这时候就是这个组件就有发挥作用的地方了

html

<el-form-item label="优惠券名称">
    <el-autocomplete
      class="inline-input"
      v-model="queryParams.couponPackageName"
      :fetch-suggestions="querySearch"
      placeholder="请输入优惠券名称"
      style="width: 220px"
      clearable
      :trigger-on-focus="false"
    ></el-autocomplete>
</el-form-item>

:fetch-suggestions="querySearch" 是一个绑定的属性,用于指定一个方法,该方法将在用户输入时触发以获取下拉列表

JS

    // 获取后台数据并格式化成我们需要的格式 看你自己后台接口是啥数据格式
    // 处理后的数据格式 [{ value: item.couponPackageName }]
    getFilterList() {
      // obtainList 后台接口
      return obtainList(params)
        .then((res) => {
          if (res.code === "200") {
            console.log(
              res.rows.map((item) => ({ value: item.couponPackageName })),
              "res"
            );
            return res.rows.map((item) => ({ value: item.couponPackageName }));
          } else {
            return [];
          }
        })
        .catch((error) => {
          console.error("Error while obtaining list:", error);
          return [];
        });
    },
    // 当用户输入时返回下拉栏列表
    querySearch(queryString, cb) {
      // 调用后台接口获取List
      this.getFilterList().then((queryCompanyNameList) => {
        // results即为下拉列表数组
        let results = queryString
          ? queryCompanyNameList.filter(this.createFilter(queryString))
          : queryCompanyNameList;
        // 对结果数组进行去重
        const uniqueResults = results.reduce((acc, curr) => {
          // 判断当前结果是否已经存在于累积的结果数组中
          const exists = acc.some((item) => item.value === curr.value);
          if (!exists) {
            acc.push(curr);
          }
          return acc;
        }, []);
        // 调用 callback 返回下拉栏列表的数据
        console.log("// 调用 callback 返回下拉栏列表的数据", results);
        cb(results);
      });
    },
    // 返回过滤函数 
    createFilter(queryString) {
      return (item) => {
        // 对每一个数组里的对象{ value: item.couponPackageName }
        // 判断 item.couponPackageName是否包含输入的数据,toUpperCase()不区分大小写
        return item.value.toUpperCase().includes(queryString.toUpperCase());
      };
    },