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 事件参考手册
Dec 24 Javascript
iframe子父页面调用js函数示例
Nov 07 Javascript
javascript 上下banner替换具体实现
Nov 14 Javascript
随鼠标上下滚动的jquery代码
Dec 05 Javascript
js检测输入内容全为空格的方法
May 03 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
Jun 09 Javascript
JS实现旋转木马式图片轮播效果
Jan 18 Javascript
JavaScript基于面向对象实现的猜拳游戏
Jan 03 Javascript
解决vue移动端适配问题
Dec 12 Javascript
详解微信小程序的不同函数调用的几种方法
May 08 Javascript
vue实现浏览器全屏展示功能
Nov 27 Javascript
VUE中的v-if与v-show区别介绍
Mar 13 Vue.js
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性能优化准备篇图解PEAR安装
2011/12/05 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
js技巧--转义符&quot;\&quot;的妙用
2007/01/09 Javascript
(仅IE下有效)关于checkbox 三态
2007/05/12 Javascript
JavaScript中的style.display属性操作
2013/03/27 Javascript
jquery实现控制表格行高亮实例
2013/06/05 Javascript
让页面上两个div中的滚动条(滑块)同步运动示例
2013/08/07 Javascript
jQuery源码分析之jQuery.fn.each与jQuery.each用法
2015/01/23 Javascript
Angular2 环境配置详细介绍
2016/09/21 Javascript
JS 验证密码 不能为空,必须含有数字、字母、特殊字符,长度在8-12位
2017/06/21 Javascript
Angular 2父子组件之间共享服务通信的实现
2017/07/04 Javascript
仿京东快报向上滚动的实例
2017/12/13 Javascript
JS闭包原理与应用经典示例
2018/12/20 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
2019/11/01 Javascript
微信小程序 (地址选择1)--选取搜索地点并显示效果
2019/12/17 Javascript
js canvas实现俄罗斯方块
2020/10/11 Javascript
[01:39]2014DOTA2国际邀请赛 Newbee经理CU专访队伍火力全开
2014/07/15 DOTA
Python中的一些陷阱与技巧小结
2015/07/10 Python
python中使用%与.format格式化文本方法解析
2017/12/27 Python
python调用Matplotlib绘制分布点图
2019/10/18 Python
Python3变量与基本数据类型用法实例分析
2020/02/14 Python
Python3 获取文件属性的方式(时间、大小等)
2020/03/12 Python
python中watchdog文件监控与检测上传功能
2020/10/30 Python
详解Selenium 元素定位和WebDriver常用方法
2020/12/04 Python
使用HTML5 Canvas API中的clip()方法裁剪区域图像
2016/03/25 HTML / CSS
html5调用摄像头功能的实现代码
2018/05/07 HTML / CSS
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
2013/01/30 HTML / CSS
英国性感内衣和睡衣品牌:Bluebella
2018/01/26 全球购物
香港连卡佛百货官网:Lane Crawford
2019/09/04 全球购物
SQL Server笔试题
2012/01/10 面试题
业务部门经理岗位职责
2014/02/23 职场文书
升学宴主持词
2014/04/02 职场文书
2014个人四风对照检查材料思想汇报
2014/09/18 职场文书
调任通知
2015/04/21 职场文书
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
2021/05/14 Python
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android