Vue文本模糊匹配功能如何实现


Posted in Javascript onJuly 30, 2020

模糊匹配功能在下拉菜单的组件中用的非常多,于是打算写几个demo看看细节上是如何实现的。

一、最简单的模糊匹配:计算属性

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <input type="text" v-model="message">
    <ul>
      <li v-for="(option, index) in matchedOptions" :key="index">{{ option }}</li>
    </ul>
  </div>
  <script src="./vue.js"></script>
  <script>
    new Vue({
      el: '#app',
      data: {
        message: '',
        options: ['html', 'css', 'javascript']
      },
      computed: {
        matchedOptions() {
          if (this.message !== '') {
            return this.options.filter(option => option.includes(this.message))
          }
          return this.options
        }
      }
    })
  </script>
</body>
</html>

在上面的例子中,计算属性matchedOptions会在文本框内容message变化时筛选options里的数据,效果图如下所示:

Vue文本模糊匹配功能如何实现

二、使用作用域插槽实现

使用插槽主要是为了使该功能组件化:在select组件中插入option,然后option通过作用域插槽从select中获取文本值:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <my-select>
      <template #default="{ message }">
        <ul>
          <li v-for="(option, index) in options" :key="index" v-show="option.includes(message)">{{ option }}</li>
        </ul>
      </template>
    </my-select>
  </div>
  <script src="./vue.js"></script>
  <script>
    Vue.component('my-select', {
      template: `
        <div class="my-select">
          <input type="text" v-model="message">
          <slot :message="message"></slot>
        </div>
      `,
      data() {
        return {
          message: ''
        }
      }
    })
    new Vue({
      el: '#app',
      data: {
        options: ['html', 'css', 'javascript']
      }
    })
  </script>
</body>
</html>

全局注册了my-select组件后,可以删除app里的message数据,使用v-show来控制选项的显示,运行效果和计算属性方式相同。缺点就是无法单文件化(刚学vue没多久,不知道怎么在单文件里使用作用域插槽,试过直接把template里的东西封装成my-option好像并不管用)

三、混入广播和派发方法在独立组件中实现模糊匹配

首先需要一个emitter文件:

/**
 * 子组件广播事件
 * @param {string} componentName 子组件名
 * @param {string} eventName 事件名
 * @param {...any} params 事件参数
 */
function _broadcast(componentName, eventName, ...params) {
  this.$children.forEach(child => {
    if (child.$options.name === componentName) {
      child.$emit(eventName, ...params)
    }
    _broadcast.call(child, componentName, eventName, ...params)
  })
}

/**
 * 父组件派发事件
 * @param {string} componentName 父组件名
 * @param {string} eventName 事件名
 * @param {...any} params 事件参数
 */
function _dispatch(componentName, eventName, ...params) {
  if (this.$parent) {
    if (this.$parent.$options.name === componentName) {
      this.$parent.$emit(eventName, ...params)
    }
    _dispatch.call(this.$parent, componentName, eventName, ...params)
  }
}

/**
 * mixin
 */
export default {
  methods: {
    broadcast(componentName, eventName, ...params) {
      _broadcast.call(this, componentName, eventName, ...params)
    },
    dispatch(componentName, eventName, ...params) {
      _dispatch.call(this, componentName, eventName, ...params)
    }
  }
}

注意,这里的$children和$parent都是指具有dom父子关系的vue组件。

最后,通过设置查询条件来控制子组件的显示与隐藏即可实现实时模糊搜索。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Domino中运用jQuery读取视图内容的方法
Oct 21 Javascript
jQuery对象和DOM对象使用说明
Jun 25 Javascript
Ajax搜索结果页面下方的分页按钮的生成
Apr 05 Javascript
一道优雅面试题分析js中fn()和return fn()的区别
Jul 05 Javascript
Vuex和前端缓存的整合策略详解
May 09 Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
Aug 12 Javascript
详解vue-router传参的两种方式
Sep 10 Javascript
js基础之事件捕获与冒泡原理
Oct 09 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
Nov 06 Javascript
浅谈Vue中render中的h箭头函数
Nov 07 Javascript
python实现迭代法求方程组的根过程解析
Nov 25 Javascript
Ajax实现局部刷新的方法实例
Mar 31 Javascript
VUE 单页面使用 echart 窗口变化时的用法
Jul 30 #Javascript
解决vue单页面多个组件嵌套监听浏览器窗口变化问题
Jul 30 #Javascript
Vue Render函数原理及代码实例解析
Jul 30 #Javascript
vue - props 声明数组和对象操作
Jul 30 #Javascript
vue项目,代码提交至码云,iconfont的用法说明
Jul 30 #Javascript
vue如何使用外部特殊字体的操作
Jul 30 #Javascript
在vue-cli3中使用axios获取本地json操作
Jul 30 #Javascript
You might like
PHP MSSQL 存储过程的方法
2008/12/24 PHP
浅析is_writable的php实现
2013/06/18 PHP
解析php开发中的中文编码问题
2013/08/08 PHP
PHP设计模式之观察者模式(Observer)详细介绍和代码实例
2014/04/08 PHP
实例讲解PHP面向对象之多态
2014/08/20 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
PHP的APC模块实现上传进度条
2015/10/27 PHP
PHP如何通过带尾指针的链表实现'队列'
2020/10/22 PHP
Javascript 读后台cookie代码
2008/09/15 Javascript
用javascript替换URL中的参数值示例代码
2014/01/27 Javascript
IE中图片的onload事件无效问题和解决方法
2014/06/06 Javascript
DOM基础教程之事件对象
2015/01/20 Javascript
JS的数组迭代方法
2015/02/05 Javascript
jquery实现简单的无缝滚动
2015/04/15 Javascript
javascript跨域请求包装函数与用法示例
2016/11/03 Javascript
详解JS中的attribute属性
2017/04/25 Javascript
浅谈mint-ui 填坑之路
2017/11/06 Javascript
Angular4实现图片上传预览路径不安全的问题解决
2017/12/25 Javascript
微信小程序画布圆形进度条显示效果
2020/11/17 Javascript
js中数组常用方法总结(推荐)
2019/04/09 Javascript
JavaScript中继承原理与用法实例入门
2020/05/09 Javascript
ES6箭头函数和扩展实例分析
2020/05/23 Javascript
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
2020/10/27 Javascript
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python 'takes exactly 1 argument (2 given)' Python error
2016/12/13 Python
Python读取sqlite数据库文件的方法分析
2017/08/07 Python
详解python多线程、锁、event事件机制的简单使用
2018/04/27 Python
pytorch 数据集图片显示方法
2018/07/26 Python
python读写配置文件操作示例
2019/07/03 Python
Python基础之函数原理与应用实例详解
2020/01/03 Python
投标授权委托书范文
2014/08/02 职场文书
作风建设年活动总结
2014/08/27 职场文书
销售助理岗位职责
2015/02/11 职场文书
2015年基建工作总结范文
2015/05/23 职场文书
2015年文秘个人工作总结
2015/10/14 职场文书