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常见注意事项
Jan 01 Javascript
jquery插件jbox使用iframe关闭问题
Feb 09 Javascript
浅析javascript操作 cookie对象
Dec 26 Javascript
灵活的理解JavaScript中的this指向
Feb 25 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
Aug 18 Javascript
Bootstrap fileinput文件上传组件使用详解
Jun 06 Javascript
seaJs使用心得之exports与module.exports的区别实例分析
Oct 13 Javascript
JS中DOM元素的attribute与property属性示例详解
Sep 04 Javascript
vue elementui el-form rules动态验证的实例代码详解
May 23 Javascript
electron实现静默打印的示例代码
Aug 12 Javascript
vue.js中ref及$refs的使用方法解析
Oct 08 Javascript
js this 绑定机制深入详解
Apr 30 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设计模式之原型模式定义与用法详解
2018/04/03 PHP
laravel5.5添加echarts实现画图功能的方法
2019/10/09 PHP
jQuery DOM操作小结与实例
2010/01/07 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
基于Node.js实现nodemailer邮件发送
2016/01/26 Javascript
jQuery实现页面下拉100像素出现悬浮窗口的方法
2016/09/05 Javascript
老生常谈Javascript中的原型和this指针
2016/10/09 Javascript
基于JavaScript实现图片剪切效果
2017/03/07 Javascript
vue如何引用其他组件(css和js)
2017/04/13 Javascript
详解前端路由实现与react-router使用姿势
2017/08/07 Javascript
详解PHP后期静态绑定分析与应用
2018/03/21 Javascript
详解性能更优越的小程序图片懒加载方式
2018/07/18 Javascript
详解利用nodejs对本地json文件进行增删改查
2019/09/20 NodeJs
Python 条件判断的缩写方法
2008/09/06 Python
python实现机械分词之逆向最大匹配算法代码示例
2017/12/13 Python
python学生管理系统代码实现
2020/04/05 Python
python3.4实现邮件发送功能
2018/05/28 Python
python3.6中@property装饰器的使用方法示例
2019/08/17 Python
世界上最好的帽子:Tilley
2016/11/27 全球购物
乌克兰香水和化妆品网站:Notino.ua
2018/03/26 全球购物
Java语言程序设计测试题判断题部分
2013/01/06 面试题
厨房工作人员岗位职责
2013/11/15 职场文书
学生自我评价范文
2014/02/02 职场文书
企业军训感言
2014/02/08 职场文书
有关爱国演讲稿
2014/05/07 职场文书
乡镇八一建军节活动方案
2014/08/24 职场文书
领导班子四风对照检查材料思想汇报
2014/09/26 职场文书
2014年共青团工作总结
2014/12/10 职场文书
考察邀请函范文
2015/01/31 职场文书
2015年中个人总结范文
2015/03/10 职场文书
2016自主招生校长推荐信范文
2015/03/23 职场文书
幼儿园奖惩制度范本
2015/08/05 职场文书
2016入党积极分子党课学习心得体会
2015/10/09 职场文书
大学优秀学生主要事迹材料
2015/11/04 职场文书
spring boot中nativeQuery的用法
2021/07/26 Java/Android
python超详细实现完整学生成绩管理系统
2022/03/17 Python