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 相关文章推荐
jQuery 创建Dom元素
May 07 Javascript
jQuery ajax 路由和过滤器使用说明
Aug 02 Javascript
在javascript中如何得到中英文混合字符串的长度
Jan 17 Javascript
使用javascript将时间转换成今天,昨天,前天等格式
Jun 25 Javascript
jQuery实现可展开折叠的导航效果示例
Sep 12 Javascript
JS中作用域和变量提升(hoisting)的深入理解
Oct 31 Javascript
AngularJS 最常用的八种功能(基础知识)
Jun 26 Javascript
微信小程序之判断页面滚动方向的示例代码
Aug 30 Javascript
vue自动路由-单页面项目(非build时构建)
Apr 30 Javascript
vue 实现滚动到底部翻页效果(pc端)
Jul 31 Javascript
layer弹出层取消遮罩的方法
Sep 25 Javascript
浅析JavaScript预编译和暗示全局变量
Sep 03 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生成略缩图代码
2012/07/16 PHP
PHP实现15位身份证号转18位的方法分析
2019/10/16 PHP
Javascript事件热键兼容ie|firefox
2010/12/30 Javascript
jquery分页插件AmSetPager(自写)
2013/04/15 Javascript
Jquery事件的连接使用示例
2013/06/18 Javascript
jQuery制作拼图小游戏
2015/01/12 Javascript
JS+CSS实现实用的单击输入框弹出选择框的方法
2015/02/28 Javascript
总结javascript中的六种迭代器
2016/08/16 Javascript
JS实现复制内容到剪贴板功能
2017/02/05 Javascript
百度地图JavascriptApi Marker平滑移动及车头指向行径方向
2017/03/13 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
解决vue-router进行build无法正常显示路由页面的问题
2018/03/06 Javascript
Vue实现导出excel表格功能
2018/03/30 Javascript
小程序开发基础之view视图容器
2018/08/21 Javascript
axios全局注册,设置token,以及全局设置url请求网段的方法
2018/09/25 Javascript
如何在JavaScript中优雅的提取循环内数据详解
2019/03/04 Javascript
详解一次Vue低版本安卓白屏问题的解决过程
2019/05/30 Javascript
node.JS事件机制与events事件模块的使用方法详解
2020/02/06 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
[02:07]DOTA2新英雄展现中国元素,完美“圣典”亮相央视
2016/12/19 DOTA
动态规划之矩阵连乘问题Python实现方法
2017/11/27 Python
Python处理CSV与List的转换方法
2018/04/19 Python
详解TensorFlow查看ckpt中变量的几种方法
2018/06/19 Python
python将txt文件读取为字典的示例
2018/12/22 Python
python给微信好友定时推送消息的示例
2019/02/20 Python
python 使用pdfminer3k 读取PDF文档的例子
2019/08/27 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
2020/05/18 Python
Html5获取高德地图定位天气的方法
2019/12/26 HTML / CSS
荷兰游戏商店:Allyouplay
2019/03/16 全球购物
应届大学生自荐信格式
2013/09/21 职场文书
美发活动策划书
2014/01/14 职场文书
公司活动邀请函
2014/01/24 职场文书
个人承诺书格式
2014/06/03 职场文书
2014年个人思想工作总结
2014/11/27 职场文书
Spring Boot 排除某个类加载注入IOC的操作
2021/08/02 Java/Android
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS