el-select使用filter-method实现自定义过滤

最近有个任务要用el-select来自定义过滤,发现有很多细节,网上搜的很多不够严谨,情况考虑不全,此处给出完整解决方案

实现DEMO

  • filter-method input里输入时才会触发,和input上的change事件一样,它只会传一个参数:检索的文字。要结合各种情况,自己过滤出optionsFilter给option赋值

  • 容易遗漏的情况:当输入一段和下面选项不匹配的文字时,此时过滤的结果列表是空,这时点击空白处,检索文字会自动清空,过滤结果保持是空,会影响下一次搜索,所以需要配合@focus来重置过滤结果

html 复制代码
<template>
  <div>
    <el-select v-model="seledMan"
               clearable
               filterable
               size="small"
               :filter-method="filterMan"
               placeholder="请选择"
               @change="searchFirstList"
               @clear="filterMan"
               @focus="filterMan()">
      <el-option v-for="item in optionsFilter"
                 :key="item.value"
                 :label="item.label"
                 :value="item.value">
      </el-option>
    </el-select>
  </div>
</template>
<script>
export default {
  data() {
    return {
      optionsOrigin: [
        { value: 'zhangsan', label: '张三' },
        { value: 'lisi', label: '李四' },
        { value: 'wangwu', label: '王五' },
        { value: 'zhaoliu', label: '赵六' },
      ],
      optionsFilter: [],

      seledMan: '',
    }
  },
  methods: {
    filterMan(query) {
      console.log('触发过滤')
      if (!query) {
        this.optionsFilter = this.optionsOrigin
        return
      }
      const queryStr = query.toLowerCase()
      const filterList = this.optionsOrigin.filter((option) => {
        const nameZh = option.label,
          namePY = option.value.toLowerCase()
        return nameZh.includes(queryStr) || namePY.includes(queryStr)
      })
      this.optionsFilter = filterList
    },

    searchFirstList() {
      //选择人之后,重置页面为第一页,触发检索
      console.log('selDone', this.seledMan)
    },
  },
  created() {
    // 也可以是接口获取optionsOrigin后,同时赋给optionsFilter
    this.optionsFilter = [...this.optionsOrigin]
  },
  mounted() {},
  computed: {},
}
</script>
<style lang="scss" scoped>
</style>
相关推荐
IT_陈寒21 分钟前
Vue的v-for里用index当key,我被自己坑惨了
前端·人工智能·后端
代码不加糖1 小时前
0基础搭建前后端分离项目:实现菜单与界面左右布局
java·前端·javascript·mysql·elementui·mybatis
zhensherlock1 小时前
Protocol Launcher 系列:Tally 快速计数器的深度集成
前端·javascript·typescript·node.js·自动化·github·js
AC赳赳老秦2 小时前
OpenClaw权限管理实操:团队共享Agent,设置操作权限,保障数据安全
服务器·开发语言·前端·javascript·excel·deepseek·openclaw
光影少年2 小时前
Polyline 组件如何绘制渐变区域?
前端·javascript·掘金·金石计划
Pkmer2 小时前
古法编程: React思维模型快速建立
前端·react.js
jiayong232 小时前
第 38 课:任务列表里高亮当前正在查看详情的任务
开发语言·前端·javascript·vue.js·学习
anOnion3 小时前
构建无障碍组件之Spinbutton Pattern
前端·html·交互设计
程序员Better3 小时前
前端成功转型AI全栈,我踩过的坑都替你填上了
前端·后端·ai编程
兔子零10243 小时前
GPT-5.5 与 DeepSeek-V4:大模型竞争的本质,正在从“谁更强”变成“谁让成本更低”
前端·javascript·后端