IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Vue项目中 实现ElementUi框架el-select拼音搜索功能 -> 正文阅读

[JavaScript知识库]Vue项目中 实现ElementUi框架el-select拼音搜索功能

Vue项目中 实现ElementUi框架el-select拼音搜索功能

拼音搜索功能

前言:由于项目需要,且elementUI中的el-select只支持中文或英文匹配,不支持全拼音匹配或拼音首字母匹配,故封装该功能。


  1. 代码依赖

    ? 第三方包:pinyin-match

    ? 地址: https://github.com/xmflswood/pinyin-match

  2. 代码支持:

    1. 全拼音匹配 当输入beijing 可以匹配如下:“北京” “背景” “北京烤鸭”
    2. 拼音首字母匹配 当输入bj时 可以匹配如下:“北京烤鸭” “布局” “编辑” “有背景”,即并不是从第一个汉字进行匹配,但需要首字母的汉字前后顺序符合。
    3. 全拼音但最后一个汉字拼音非完整 当输入beijin 可以匹配如下:“被禁” “北京”
    4. 当输入拼音退格时,动态更新options的label(这个功能实现起来比较麻烦,大概多用了80%的代码)
  3. 代码实现

    1. el-select添加属性

      <el-select 
      	filterable
          :filter-method="(val)=>{$handleMatch(val,'deptList','name')}"
          @click.native="$resetOpts('deptList')">
      	<el-option
      		v-for="item in deptList"
              :key="item.dictId"
              :label="item.name"
              :value="item.dictId"></el-option>
      </el-select>
      
    2. 创建拼音搜索相关方法

      import store from '@/store'
      import PinyinMatch from 'pinyin-match/es/traditional.js';
      
      // 方法在filter-method绑定的箭头函数中调用,需要三个参数:
      // 1. el-options的value
      // 2. option元素需要遍历的数组名
      // 3. 要进行拼音匹配的options的属性
      export function handleMatch(val, arrName, attr){
          let res = this.$pyMatch(val, this[arrName], attr)
          if(res.length !== 0){
              this[arrName] = res
          }
      }
      
      // 该方法接收三个参数:
      // 1. el-options的value
      // 2. 需要遍历的options选项
      // 3. 要进行拼音匹配的options的属性
      // 备注:需要在页面销毁生命周期函数当中调用 this.$store.commit('resetTemp')
      
      export function pyMatch(val,options,attr){
          let res = []
          store.commit('copyOpts',options)
          store.commit('pushValArr',val)
          let sVal = store.state.tempSelect.valArr.slice(-2)[0]
          // 当options中的val的长度为1或小于上一次val的值时,重新将options的备份赋值给options
          if(val.length < sVal.length || val.length ===1) {
              options = store.state.tempSelect.tempOptsArr[0];
          }
          options.forEach(item => {
              let m = PinyinMatch.match(item[attr], val)
              if(m){
                  res.push(item)
              }
          })
          // 如果没有匹配到结果,就重新将options的备份赋值给options
          if(res.length === 0) return options
          return res
      }
      
      // 该方法接收一个参数:
      // 1. option元素需要遍历的数组名
      export function resetOpts(arrName){
          if(Array.isArray(this[arrName])){
              if(this[arrName].length <= 1){
                  this[arrName] = this.$store.getters.getOriginalSelect
              }
          }
      }
      
    3. 方法挂载到Vue实例

      // 引入拼音搜索方法
      import { handleMatch, pyMatch, resetOpts } from './utils/pinyinMatch'
      
      // 拼音搜索功能方法挂载到原型
      Vue.prototype.$handleMatch = handleMatch
      Vue.prototype.$pyMatch = pyMatch
      Vue.prototype.$resetOpts = resetOpts
      
    4. store中创建存储options备份的对象及操作方法

      // options备份
      state:{
      	tempSelect:{
            tempOptsArr:[],
            valArr:[]
          }
      },
      mutations:{
      	copyOpts(state,payload){  // 存储匹配到的options,原始的options存储在该数组的第0位
            if(Array.isArray(payload)){
              state.tempSelect.tempOptsArr.push(payload)
            }
          },
          pushValArr(state,val){  // 存储每次input变化时的value
            if(typeof val === 'string'){
              state.tempSelect.valArr.push(val)
            }
          },
          resetTemp(state){ // 清空state中的tempSelect,每次路由跳转时调用
            state.tempSelect.tempOptsArr = []
            state.tempSelect.valArr = []
          }
      },
      getters:{
      	getOriginalSelect(state){
            return state.tempSelect.tempOptsArr[0]
          }
      }
      
    5. 在router全局导航守卫中调用清空options备份的方法

      import store from '@/store'
      
      router.beforeEach((to, from, next) => {
      	// 此处省略其他全局导航守卫中的内容
      	if(store.state.tempSelect.tempOptsArr.length !== 0 || 		store.state.tempSelect.valArr.length !== 0){
                // 当临时存储options备份的数组不为空时,在页面跳转之前清空
                store.commit('resetTemp')
              }
              next()
      })
      
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-10 14:27:32  更:2021-07-10 14:29:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/8 21:46:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码