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 相关文章推荐
利用谷歌地图API获取点与点的距离的js代码
Oct 11 Javascript
js中符号转意问题示例探讨
Aug 19 Javascript
js实现tab切换效果实例
Sep 16 Javascript
JavaScript中Window对象的属性及事件
Dec 25 Javascript
label+input实现按钮开关切换效果的实例
Aug 16 Javascript
React Native使用百度Echarts显示图表的示例代码
Nov 07 Javascript
微信二次分享报错invalid signature问题及解决方法
Apr 01 Javascript
微信小程序实现的绘制table表格功能示例
Apr 26 Javascript
js变量值传到php过程详解 将php解析成数据
Jun 26 Javascript
JS控制下拉列表左右选择实例代码
May 08 Javascript
ant-design-vue按需加载的坑的解决
May 14 Javascript
JavaScript实现贪吃蛇游戏
Jun 16 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
别人整理的服务器变量:$_SERVER
2006/10/20 PHP
JS实现php的伪分页
2008/05/25 PHP
如何使用PHP实现javascript的escape和unescape函数
2013/06/29 PHP
jQuery 常见操作实现方式和常用函数方法总结
2011/05/06 Javascript
javascript if条件判断方法小结
2014/05/17 Javascript
jQuery实现动画效果circle实例
2015/08/06 Javascript
通过node-mysql搭建Windows+Node.js+MySQL环境的教程
2016/03/01 Javascript
基于vuejs+webpack的日期选择插件
2020/05/21 Javascript
JavaScript中splice与slice的区别
2017/05/09 Javascript
protractor的安装与基本使用教程
2017/07/07 Javascript
纯html+css+javascript实现楼层跳跃式的页面布局(实例代码)
2017/10/25 Javascript
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
Vue.js中的extend绑定节点并显示的方法
2019/06/20 Javascript
JavaScript实现图片伪异步上传过程解析
2020/04/10 Javascript
微信小程序中使用 async/await的方法实例分析
2020/05/06 Javascript
[02:54]DOTA2英雄基础教程 撼地者
2014/01/14 DOTA
[03:28]2014DOTA2国际邀请赛 EG战队官方纪录片
2014/07/21 DOTA
Python 字符串定义
2009/09/25 Python
python用于url解码和中文解析的小脚本(python url decoder)
2013/08/11 Python
Python列表append和+的区别浅析
2015/02/02 Python
python实现字符串和日期相互转换的方法
2015/05/13 Python
Python通过select实现异步IO的方法
2015/06/04 Python
Python编写一个优美的下载器
2018/04/15 Python
python 获取字符串MD5值方法
2018/05/29 Python
pyqt5的QComboBox 使用模板的具体方法
2018/09/06 Python
Python实现的大数据分析操作系统日志功能示例
2019/02/11 Python
pyqt5 实现在别的窗口弹出进度条
2019/06/18 Python
Python使用psutil获取进程信息的例子
2019/12/17 Python
python中最小二乘法详细讲解
2021/02/19 Python
玩具反斗城美国官网:Toys"R"Us
2016/09/17 全球购物
Evisu官方网站:日本牛仔品牌,时尚街头设计风格
2016/12/30 全球购物
世界上最大的铁人三项商店:Tri UK
2020/11/04 全球购物
实习老师个人总结的自我评价
2013/09/28 职场文书
安全生产先进个人材料
2014/02/06 职场文书
党支部群众路线整改措施思想汇报
2014/10/10 职场文书
离婚协议书的范本
2015/01/27 职场文书