vue实现输入框的模糊查询的示例代码(节流函数的应用场景)


Posted in Javascript onSeptember 01, 2019

上一篇讲到了javascript的节流函数和防抖函数,那么我们在实际场合中该如何运用呢?

首先,我们来理解一下:节流函数首先是节流,就是节约流量、内存的损耗,旨在提升性能,在高频率频发的事件中才会用到,比如:onresize,onmousemove,onscroll,oninput等事件中会用到节流函数;

输入框的模糊查询功能原理分析

所谓模糊查询就是不需要用户完整的输入或者说全部输入信息即可提供查询服务,也就是用户可以在边输入的同时边看到提示的信息(其实是查询出来匹配到的信息),百度的搜索功能就是很好的模糊查询的例子;其实模糊查询的原理就是给输入框绑定oninput事件监听用户输入情况,然后每次用户只要在输入框中输入了信息就触发事件进行查询然后实时展示;原理很简单,但是实现起来会有一些问题,我们可以想想,每输入一个字符都会触发事件,那如果我们需要输入很长的信息呢,那查询是不是就得触发多次?ajax连续多次触发,再加上如果我们的方法体中有操作DOM元素的方法,那么必然会给我们的浏览器进入假死甚至崩溃状态;那么我们有没有办法来解决此类问题呢?答案是:有的;(不了解模糊查询功能的同学可以出门右转去百度首页试一下搜索,给你5分钟,我等你回来)

HTML视图层代码:

<div id="app">



//输入框,绑定输入框的值是变量input_value的值,然后对输入框做了事件绑定keyup,在用户输入的时候会触发
       <input type="text" placehold="请输入id进行查询" v-model="input_value" @keyup="throttle" ref="input"/>
       
         <ul v-show="state">
           <li v-for="(item,index) in list" :key="index" >
            <span>{{item.id}}</span>
            <span>{{item.name}}</span>
            <span>{{item.time}}</span>
         </li>
      </ul>
    </div>

从上述代码中我们可以很明显的看到DOM结构,就是一个输入框,我们给输入框加了ref属性是为了方便我们后面操作DOM拿到输入框的值(详情可见ref和$refs的区别博文https://3water.com/article/167643.htm),然后下面有一个ul列表,不过ul列表是判断展示的;(至于为什么会用v-show而不是v-if,可以点击链接查阅之前的博文https://3water.com/article/168984.htm);

js数据逻辑层代码:

// 实例化 vue对象
    new Vue({
      el:"#app",
      data:{
        input_value:"",
        state:false,
        statu:true,
        dataList:[
        { id: "1001", name: "哈哈", time: "20170207" },
        { id: "1002", name: "呵呵", time: "20170213" },
        { id: "1103", name: "晓丽", time: "20170304" },  
        { id: "1104", name: "小兰", time: "20170112" },
        { id: "1205", name: "财务", time: "20170203" },
        { id: "1206", name: "嘻嘻", time: "20170208" },
        { id: "1307", name: "测试", time: "20170201" }
       ],  
         list:[]
    },
    
    methods:{//触发keyup事件之后触发的方法
      search(){


//这个变量主要是用来测试节流后和不节流的区别





var i=0;





console.log(i++);

//定义的新数组存放筛选之后的数据
        this.list=[];
        //拿到当前input输入框输入的值
        this.input_value=this.$refs.input.value;
        //判断展示ul列表,如果输入了就展示没输入就不展示
        if(this.input_value.length>0){
          this.state=true;
        }else{
          this.state=false;
        }
        
        //循环模拟数据的数组
        this.dataList.map((msg)=>{
          //拿当前json的id、name、time去分别跟输入的值进行比较
          //indexOf 如果在检索的字符串中没有出现要找的值是会返回-1的,所以我们这里不等于-1就是假设输入框的值在当前json里面找到的情况
          if(msg.id.indexOf(this.input_value)!=-1  || msg.name.indexOf(this.input_value)!=-1 || msg.time.indexOf(this.input_value)!=-1){
            //然后把当前json添加到list数组中
            this.list.push(msg);
          }
        })
      },
    }
  })

js数据逻辑层代码其实不难,主要就是给input绑定了keyup事件,在用户输入的时候会触发search事件,用户每输入一个字符都会触发一次;然后我们通过this.$refs.input.value来获取输入框当前的值并赋值给变量this.input_value,然后我们对this.input_value的长度进行判断来实现对用户是否输入的判断,如果用书输入了我们就把v-show绑定的值state赋值给true,反之则赋值为false;然后我们来用ES6的map方法来循环我们的dataList数组,dataList数组的数据是模拟后台接口数据,通过indexOf方法是否等于-1来进行判断当前json里面是否有输入框中输入的数组,indexOf是javascript提供的操作字符串方法,调用方式:string.indexOf("要查询的值"),如果str中没有要查询的值会返回我们-1,如果有会直接返回给我们查询数据的当前下标;所以我们可以借助indexOf是否等于-1来进行判断当前json中是否有我们要查询的字符串;如果有的话,我们只需要把当前json添加到空数组list中即可,然后li绑定list展示;

效果图如下:

vue实现输入框的模糊查询的示例代码(节流函数的应用场景)

到这里我们就可以看到我们要的模糊查询功能已经实现了,但是我们上面讲到模糊查询会影响浏览器的性能,从控制台输入的变量i的值可以看到我们的search方法已经被调用了8次,我们输入的字符越长被调用的次数越多,如果方法里面有操作DOM的行为性能影响会更严重;所以我们现在来加上节流函数来看看:

//节流函数
      throttle(){
        //保持this的指向始终指向vue实例
        var that=this;
        if(!that.statu){
          return;
        }  
        that.statu=false;
        setTimeout(function(){
          console.log(new Date());
          that.search();
          that.statu=true;
        },1000)
      },

我们把我们写的节流函数封装在throttle里面执行,把@keyup绑定的点击事件修改为throttle,当用户输入字符的时候触发节流函数;

效果图如下:

vue实现输入框的模糊查询的示例代码(节流函数的应用场景)

我们可以从控制台很清晰的看到当我们使用节流函数的时候,当我们输入了8个字符我们的方法只执行了两次,并且执行时间是每隔一秒执行一次,一个方法执行2次肯定会比执行8次不管是在效率还是在性能方面都会是比较大的提升,用了节流函数之后相对上面没用的节流函数来说,我们极大的实现了性能提升、优化,所以在高频率触发的事件中我们是可以建议用节流函数来进行控制和解决问题的;

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery里面的几种选择器 查找满足条件的元素$(&quot;#控件ID&quot;)
Aug 23 Javascript
location.href用法总结(最主要的)
Dec 27 Javascript
使用AngularJS实现可伸缩的页面切换的方法
Jun 19 Javascript
使用Node.js处理前端代码文件的编码问题
Feb 16 Javascript
jquery二级目录选中当前页的css样式
Dec 08 Javascript
JavaScript数据结构之二叉树的查找算法示例
Apr 13 Javascript
JavaScript字符串_动力节点Java学院整理
Jun 27 Javascript
JS实现验证码倒计时的注册页面
Jan 02 Javascript
浅谈ajax请求不同页面的微信JSSDK问题
Feb 26 Javascript
angularJs select绑定的model取不到值的解决方法
Oct 08 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
Mar 08 Javascript
layui type2 通过url给iframe子页面传值的例子
Sep 06 Javascript
vue中的v-if和v-show的区别详解
Sep 01 #Javascript
react中Suspense的使用详解
Sep 01 #Javascript
vue 实现微信浮标效果
Sep 01 #Javascript
微信小程序获取位置展示地图并标注信息的实例代码
Sep 01 #Javascript
JS实现可用滑块滑动的缓动图代码
Sep 01 #Javascript
vue动态子组件的两种实现方式
Sep 01 #Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
Sep 01 #Javascript
You might like
PHP中substr()与explode()函数用法分析
2014/11/24 PHP
php实现微信公众平台账号自定义菜单类
2014/12/02 PHP
PHP获取数组长度或某个值出现次数的方法
2015/02/11 PHP
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
2013/01/24 Javascript
JavaScript函数作用域链分析
2015/02/13 Javascript
使用JavaScript的AngularJS库编写hello world的方法
2015/06/23 Javascript
动态加载JavaScript文件的两种方法
2016/04/22 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
2016/11/02 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
JS设置时间无效问题的解决办法
2017/02/18 Javascript
利用vue.js插入dom节点的方法
2017/03/15 Javascript
移动前端图片压缩上传的实例
2017/12/06 Javascript
[03:37]2016完美“圣”典 风云人物:Mikasa专访
2016/12/07 DOTA
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
2009/04/09 Python
Python fileinput模块使用介绍
2014/11/30 Python
Python生成随机验证码的两种方法
2015/12/22 Python
python 判断网络连通的实现方法
2018/04/22 Python
python 对给定可迭代集合统计出现频率,并排序的方法
2018/10/18 Python
pygame游戏之旅 添加icon和bgm音效的方法
2018/11/21 Python
Django中URL的参数传递的实现
2019/08/04 Python
python Manager 之dict KeyError问题的解决
2019/12/21 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
2020/10/27 Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
2020/12/23 Python
CSS3提交意见输入框样式代码
2014/10/30 HTML / CSS
Opodo英国旅游网站:预订廉价航班、酒店和汽车租赁
2018/07/14 全球购物
送给他或她的礼物:FUN.com
2018/08/17 全球购物
会话Bean的种类
2013/11/07 面试题
网络通讯中,端口有什么含义,端口的取值范围
2012/11/23 面试题
建筑施工实习自我鉴定
2013/09/19 职场文书
酒店管理专业学生求职信
2013/09/27 职场文书
园林施工员岗位职责
2013/12/11 职场文书
大学生职业生涯规划范文
2014/01/22 职场文书
事业单位工作人员2015年度思想工作总结
2015/10/15 职场文书
公证书
2019/04/17 职场文书
2019年浪漫婚礼证婚词
2019/06/27 职场文书