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 相关文章推荐
javascript高亮效果的二种实现方法
Sep 14 Javascript
js 深拷贝函数
Dec 04 Javascript
三种AngularJS中获取数据源的方式
Feb 02 Javascript
Three.js学习之文字形状及自定义形状
Aug 01 Javascript
jQuery与JS加载事件用法分析
Sep 04 Javascript
浅谈node中的exports与module.exports的关系
Aug 01 Javascript
JS逻辑运算符短路操作实例分析
Jul 09 Javascript
js实现搜索栏效果
Nov 16 Javascript
js核心基础之闭包的应用实例分析
May 11 Javascript
vue语法自动转typescript(解放双手)
Sep 18 Javascript
jQuery实现可编辑的表格
Dec 11 jQuery
jquery实现拖拽添加元素功能
Dec 01 jQuery
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 8小时时间差的解决方法小结
2009/12/22 PHP
PHP递归算法的详细示例分析
2013/02/19 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
2014/04/25 PHP
php之readdir函数用法实例
2014/11/13 PHP
PHP 生成微信红包代码简单
2016/03/25 PHP
Laravel框架Auth用户认证操作实例分析
2019/09/29 PHP
Javascript SHA-1:Secure Hash Algorithm
2006/12/20 Javascript
一段批量给页面上的控件赋值js
2010/06/19 Javascript
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
Javascript中使用A标签获取当前目录的绝对路径方法
2015/03/02 Javascript
node.js发送邮件email的方法详解
2017/01/06 Javascript
Angularjs中使用轮播图指令swiper
2017/05/30 Javascript
jQuery实现鼠标点击处心形漂浮的炫酷效果示例
2018/04/12 jQuery
Vue多系统切换实现方案
2018/06/05 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
2018/11/05 Javascript
微信小程序实现swiper切换卡内嵌滚动条不显示的方法示例
2018/12/20 Javascript
JavaScript变量Dom对象的所有属性
2020/04/30 Javascript
python实现自动更换ip的方法
2015/05/05 Python
python实现逆波兰计算表达式实例详解
2015/05/06 Python
举例讲解Python中字典的合并值相加与异或对比
2016/06/04 Python
小小聊天室Python代码实现
2016/08/17 Python
Python实现读取及写入csv文件的方法示例
2018/01/12 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
2019/07/11 Python
Python importlib模块重载使用方法详解
2020/10/13 Python
Python列表的深复制和浅复制示例详解
2021/02/12 Python
The Body Shop美体小铺西班牙官网:天然化妆品
2019/06/21 全球购物
临床医学专业毕业生的自我评价
2013/10/17 职场文书
医院实习介绍信
2014/01/12 职场文书
高二地理教学反思
2014/01/24 职场文书
欢迎新生标语
2014/10/06 职场文书
2014年学校卫生工作总结
2014/11/20 职场文书
2014年科技工作总结
2014/11/26 职场文书
歌咏比赛口号大全
2015/12/25 职场文书
vue中data改变后让视图同步更新的方法
2021/03/29 Vue.js
使用pandas模块实现数据的标准化操作
2021/05/14 Python
Python多线程实用方法以及共享变量资源竞争问题
2022/04/12 Python