el-select 支持拼音搜索(含插件 pinyin-match 的使用)

简介: el-select 支持拼音搜索(含插件 pinyin-match 的使用)

效果预览

安装插件 pinyin-match

cnpm i pinyin-match --save

导入插件 pinyin-match

import PinYinMatch from "pinyin-match";

在过滤方法中使用

    matchFruit(searchContent) {
      if (searchContent) {
        let result = [];
        this.list_org.forEach((item) => {
          // matchResult 的值为 true/false
          let matchResult = PinYinMatch.match(item.label, searchContent);
          if (matchResult) {
            result.push(item);
          }
        });
        this.list_filtered = result;
      } else {
        this.list_filtered = this.list_org;
      }
    },

完整范例

<template>
  <div class="container">
    <el-select
      v-model="fruit"
      placeholder="请选择水果"
      filterable
      :filter-method="matchFruit"
      clearable
      @clear="clearFruit"
    >
      <el-option
        v-for="item in list_filtered"
        :key="item.value"
        :label="item.label"
        :value="item.value"
      >
      </el-option>
    </el-select>
  </div>
</template>
<script>
import PinYinMatch from "pinyin-match";
export default {
  data() {
    return {
      fruit: "",
      list_org: [
        {
          value: 1,
          label: "苹果",
        },
        {
          value: 2,
          label: "香蕉",
        },
        {
          value: 3,
          label: "梨子",
        },
      ],
      list_filtered: [],
    };
  },
  mounted() {
    this.list_filtered = this.list_org;
  },
  methods: {
    matchFruit(searchContent) {
      if (searchContent) {
        let result = [];
        this.list_org.forEach((item) => {
          // matchResult 的值为 true/false
          let matchResult = PinYinMatch.match(item.label, searchContent);
          if (matchResult) {
            result.push(item);
          }
        });
        this.list_filtered = result;
      } else {
        this.list_filtered = this.list_org;
      }
    },
    clearFruit() {
      this.list_filtered = this.list_org;
    },
  },
};
</script>

<style lang="scss" scoped>
.container {
  margin: 30px;
}
</style>

注意事项

  • el-option 的 v-for 循环中的 key 不能用 index, 否则会出现输入拼音不显示的bug,如输入 l 不显示
  • 若 el-select 添加了 clearable,则需如范例添加 @clear=“clearFruit” 以便在清除内容后,将下拉列表恢复为过滤前的列表。
目录
相关文章
Element el-select 选择器(下拉框)详解
本文目录 1. 用途 2. 数据绑定 2.1 固定选项 2.2 选项绑定数组 3. 功能效果 3.1 可清空选项 3.2 多选 3.3 可搜索 4. 事件响应 5. 小结
8045 0
Element el-select 选择器(下拉框)详解
|
JavaScript
原生js实现复选框(全选/全不选/反选)效果【含完整代码】
原生js实现复选框(全选/全不选/反选)效果【含完整代码】
687 1
|
JavaScript
VUE里的find与filter使用与区别
VUE里的find与filter使用与区别
1794 0
|
存储 Java 调度
开发踩坑记录之二:谨慎使用Spring中的@Scheduled注解
在一些业务场景中需要执行定时操作来完成一些周期性的任务,比如每隔一周删除一周前的某些历史数据以及定时进行某项检测任务等等。在日常开发中比较简单的实现方式就是使用Spring的@Scheduled(具体使用方法不再赘述)注解。但是在修改服务器时间时会导致定时任务不执行情况的发生,解决的办法是当修改服务器时间后,将服务进行重启就可以避免此现象的发生。本文将主要探讨服务器时间修改导致@Scheduled注解失效的原因,同时找到在修改服务器时间后不重启服务的情况下,定时任务仍然正常执行的方法。 @Scheduled失效原因分析 解析流程图 使用新的方法
开发踩坑记录之二:谨慎使用Spring中的@Scheduled注解
|
JavaScript 前端开发 UED
PDF在线预览实现:如何使用vue-pdf-embed实现前端PDF在线阅读
本文详细介绍了如何在Vue项目中使用vue-pdf-embed实现PDF文件的在线展示。从项目初始化、插件集成到高级功能的实现和部署优化,希望对你有所帮助。在实际项目中,灵活运用这些技术可以大大提升用户体验和项目质量。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
数据采集 资源调度 JavaScript
极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图
本文介绍了使用 Vue Flow 绘制流程图的方法与技巧。Vue Flow 是一个灵活强大的工具,适合自定义复杂的流程图。文章从环境要求(Node.js v20+ 和 Vue 3.3+)、基础入门案例、自定义功能(节点与连线的定制、事件处理)到实际案例全面解析其用法。重点强调了 Vue Flow 的高度灵活性,虽然预定义内容较少,但提供了丰富的 API 支持深度定制。同时,文中还分享了关于句柄(handles)的使用方法,以及如何解决官网复杂案例无法运行的问题。最后通过对比 mermaid,总结 Vue Flow 更适合需要高度自定义和复杂需求的场景,并附带多个相关技术博客链接供进一步学习。
|
资源调度 JavaScript 前端开发
Vue2项目使用v-viewer插件实现图片预览、切换、缩放、旋转...
这篇文章介绍了在Vue 2项目中如何通过`v-viewer`插件实现图片的预览、切换、缩放、旋转等功能,并提供了插件的安装、配置和使用方法。
5644 0
Vue2项目使用v-viewer插件实现图片预览、切换、缩放、旋转...
|
监控 前端开发 API
实战指南:使用Python Flask与WebSocket实现高效的前后端分离实时系统
【7月更文挑战第18天】构建实时Web应用,如聊天室,可借助Python的Flask和WebSocket。安装Flask及Flask-SocketIO库,创建Flask应用,处理WebSocket事件。前端模板通过Socket.IO库连接服务器,发送和接收消息。运行应用,实现实时通信。此示例展现了Flask结合WebSocket实现前后端实时交互的能力。
1996 3
|
前端开发
边框也疯狂:CSS创造令人瞩目的流光闪烁效果!
边框也疯狂:CSS创造令人瞩目的流光闪烁效果!