前端实现下拉框和树节点模糊查询

在实际开发中,部分模糊查询可由前端来实现,以下介绍下拉框和树节点场景

第一步:安装pinyin-match

npm install pinyin-match --save

第二步:封装成公共方法

const PinyinMatch = require('pinyin-match/dist/main.js');

export function filterCommon(query: any, list: any, labelName = "label") {
  if (query) {
    return list.filter((item: any) => item[labelName] && (item[labelName].toLowerCase().indexOf(query.toLowerCase()) >= 0 || !!PinyinMatch.match(item[labelName], query)));
  } else {
    return list;
  }
}

第三步:在组件中使用

需配合filter-method使用,该方法会返回检索值

<el-select
    class="user-select"
    popper-class="user-select-popper select-popper-theme"
    v-model="userValue"
    filterable
    :filter-method="filterMethod"
    @change="handleUserChange">
    <el-option
      v-for="user in dataList"
      :key="user.value"
      :label="user.label"
      :value="user.value">
    </el-option>
</el-select>
//引入方法
import { filterCommon } from '@/utils/util';
const state = reactive<any>({
      dataList: [],       
      dataFilters: [],
});
 
//获取业务数据
    function getResearchList() {
      fetchResearcher().then((res: any) => {
        if(res && res.length) {
          state.dataList= res.map((item: any) => {
            return {
              label: item.dataValue,
              value: item.dataKey
            }
          });
        } else {
          state.dataList= [];
        }
        state.dataFilters= state.dataList;
      });
    }

    //模糊搜索
    function filterMethod(query: any) {
      state.dataList= filterCommon(query, state.dataFilters);
    }

以上是下拉框的实现方式,接下来介绍树节点的实现方式,使用方法一样

export function filterMethods(query: any, list: any, labelName = "label") {
  if (query) {
      const newarr:any = [];
      list.forEach((item:any) => {
        if (item[labelName] && (item[labelName].toLowerCase().indexOf(query.toLowerCase()) >= 0 || !!PinyinMatch.match(item[labelName], query))) {
          newarr.push(item);
        } else {
          if (item.children && item.children.length > 0) {
            const redata:any = filterMethods(query, item.children);
            const obj:any = {
              ...item,
              children: redata
            };
            if (redata && redata.length>0) {
              newarr.push(obj);
            }
          }
        }
      });
      return newarr;
  } else {
    return list;
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值