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

  上一篇讲到了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://www.cnblogs.com/dengyao-blogs/p/11350292.html),然后下面有一个ul列表,不过ul列表是判断展示的;(至于为什么会用v-show而不是v-if,可以点击链接查阅之前的博文  https://www.cnblogs.com/dengyao-blogs/p/11378228.html);

  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展示;

  效果图如下:

  

  到这里我们就可以看到我们要的模糊查询功能已经实现了,但是我们上面讲到模糊查询会影响浏览器的性能,从控制台输入的变量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,当用户输入字符的时候触发节流函数;效果图如下:

  

  

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

原文地址:https://www.cnblogs.com/dengyao-blogs/p/11438925.html

时间: 2024-08-04 23:53:56

vue实现输入框的模糊查询(节流函数的应用场景)的相关文章

数据库创建两个表格及模糊查询,函数

--创建表格 create table xinxi ( code int not null, name varchar(50) not null, birth varchar(50) not null, sex char(10) not null, score decimal(18,2) not null, banji varchar(20) not null, ) --创建一班数据 insert into xinxi values(101,'张三','1990年3月2日','男',86,'一班

mongodb3.2系统性学习——5、游标 模糊查询 findAndModify函数

1首先介绍查询结果 返回的过程: 进行查询的时候mongodb 并不是一次哪个返回结果集合的所有文档,而是以多条文档的形式分批返回查询的结果,返回文档到内存中. 好处: 减少了客户端与服务器端的查询负担. 查询的结果集合很大的时候批量返回数据,提高了效率. 注意事项 如果执行查询的时候不使用 var keyword 则查询的结果会自动迭代 20次. cursor 游标第一次返回101条文档或者4兆 数据(谁先满足). 不活跃的游标会在10分钟内自动关闭,或者客户端主动关闭游标,如果让游标一致有效

vue中节流函数实现搜索数据

在日常开发中有很多场景我们都需要用到节流函数和防抖函数,比如:实现输入框的模糊查询因为需要轮询ajax,影响浏览器性能,所以需要用到节流函数:实现手机号.姓名之类的的验证,往往我们只需要验证一次,这个时候我们就需要用到防抖函数:但是网上的很多资料都是不够具体和便于理解. 基本代码如下 <el-input placeholder="请输入搜索内容" suffix-icon="el-icon-search" class="searchItem searc

解密PHP模糊查询技术

慕课网解密PHP模糊查询技术学习笔记! 对于以前知识的巩固,可以跳跃式选择性观看! /** *解密PHP模糊查询技术 * *本节课程是PHP模糊查询技术专题视频之课程引入 *大纲: *    模糊查询的实用性,应用场景:站内搜索技术: * * *PHP用户查询器 案例演示 *(关键字高亮技术) * *程序流程: *客户端提交关键词, *程序端获取关键词,通过PHP模糊查询技术到用户信息库查询相关用户, *将查询结果返回到客户端. * *课程目标: *1掌握PHP模糊查询技术的应用 *2独立完成站

vue 如何实现 Input 输入框模糊查询方法

原理:原生js的indexOf() 方法,该方法将从头到尾地检索数组,看它是否含有对应的元素.开始检索的位置在数组 start 处或数组的开头(没有指定 start 参数时).如果找到一个 item,则返回 item 的第一次出现的位置.开始位置的索引为 0. 如果在数组中没找到指定元素则返回 -1. 下面先看示例: 搜索前: 搜索后: 实现方法: 1 methods:{ 2 // 点击搜索工程 3 search(){ 4 // 支持模糊查询 5 // this.xmgcqkJsonsData:

SQL Server之 (二) SQL语句 模糊查询 空值处理 聚合函数

(二) SQL语句  模糊查询  空值处理  聚合函数 自己学习笔记,转载请注明出处,谢谢!---酸菜 SQL :结构化查询语言(Structured Query Language),关系数据库管理系统的标准语言. Sybase与Mircosoft对标准SQL做了扩展:T-SQL (Transact-SQL); 注:①SQL对大小写的敏感取决于排序规则,一般不敏感; ②SQL对单引号的转义,用两个单引号来表示一个单引号; ③SQL执行顺序: 1→2→3→4 select  * ---------

聚合函数:sum,avg,max,min,count;模糊查询;排序

----聚合函数 --做计算 做统计 对null过滤:null是指不知道什么值,所以无法做计算--sum(参数):统计和--avg(参数):求平均值--max(参数):最大值--min(参数):最小值--count(参数):获取满足条件的记录数--1.获取学员总人数select COUNT(Email) from Student--2.获取最大的年龄值 年龄值越大,年龄越小 年龄值越小,年龄越大select MAX(BornDate) from Studentselect min(BornDat

0831 数据库建立,增删改查,各种函数类型,类型转换,模糊查询,排序

create database lian0831gouse lian0831gocreate table stu(code int not null,cid varchar(20) not null,name varchar(10), banji varchar(10),sex varchar(10),age int not null,yufen decimal(18,2),shufen decimal(18,2),yingfen decimal(18,2),)insert into stu v

第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all; Select 列 into 新表;字符串函数;日期函数

第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all;  Select 列 into 新表;字符串函数;日期函数 SQL聚合函数 MAX(最大值).MIN(最小值).AVG(平均值).SUM(和).COUNT(数量:记录的条数) 聚合函数对null不计算.如果一行数据都是null,count(*)包含对空值行.重复行的统计. --聚合函数演示 selec