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 LigerUI 插件介绍及使用之ligerDrag和ligerResizable示例代码打包
Apr 06 Javascript
javascript定义变量时带var与不带var的区别分析
Jan 12 Javascript
javascript强制点击广告的方法
Feb 06 Javascript
javascript 中Cookie读、写与删除操作
Mar 29 Javascript
jquery实现简单实用的轮播器
May 23 jQuery
jquery Form轻松实现文件上传
May 24 jQuery
关于meta viewport中target-densitydpi属性详解(推荐)
Aug 18 Javascript
AngularJS实现的输入框字数限制提醒功能示例
Oct 26 Javascript
jQuery ajax读取本地json文件的实例
Oct 31 jQuery
简单了解Ajax表单序列化的实现方法
Jun 14 Javascript
原生Vue 实现右键菜单组件功能
Dec 16 Javascript
javascript canvas封装动态时钟
Sep 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
通达OA公共代码 php常用检测函数
2011/12/14 PHP
PHP 500报错的快速解决方法
2016/12/14 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
2017/03/08 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
javascript在当前窗口关闭前检测窗口是否关闭
2014/09/29 Javascript
JavaScript实现的类字典插入或更新方法实例
2015/07/10 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
JS 循环li添加点击事件 (闭包的应用)
2016/12/10 Javascript
NodeJS遍历文件生产文件列表功能示例
2017/01/22 NodeJs
浅谈regExp的test方法取得的值变化的原因及处理方法
2017/03/01 Javascript
JS身份证信息验证正则表达式
2017/06/12 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
Vee-validate 父组件获取子组件表单校验结果的实例代码
2019/05/20 Javascript
vue从零实现一个消息通知组件的方法详解
2020/03/16 Javascript
jQuery实现倒计时功能完整示例
2020/06/01 jQuery
理解JavaScript中的Proxy 与 Reflection API
2020/09/21 Javascript
举例讲解Python面相对象编程中对象的属性与类的方法
2016/01/19 Python
python正则-re的用法详解
2019/07/28 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
Python使用graphviz画流程图过程解析
2020/03/31 Python
在 Python 中使用 MQTT的方法
2020/08/18 Python
css3 column实现卡片瀑布流布局的示例代码
2018/06/22 HTML / CSS
意大利男装网店:Vrients
2019/05/02 全球购物
Charles & Keith欧盟:新加坡时尚品牌
2019/08/01 全球购物
应届生法律求职信
2013/10/22 职场文书
个人简历自荐信
2013/12/05 职场文书
校运会入场式解说词
2014/02/10 职场文书
走进敬老院活动总结
2014/07/10 职场文书
乡镇挂职心得体会
2014/09/04 职场文书
小学元宵节活动总结
2015/02/06 职场文书
教师个人发展总结
2015/02/11 职场文书
催款律师函范文
2015/05/27 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
升学宴学生致辞
2015/07/27 职场文书
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
2022/05/11 Servers