tnblog
首页
视频
资源
登录

vue之放抖动与节流

6333人阅读 2020/3/17 18:04 总访问:47189 评论:3 收藏:0 手机
分类: Vue

模拟需求:在input输入框中输入账号,求情接口,返回所有账号中包含的数据,不需要点击按钮

我们大概看一下原型图

需求分析

1、没有button,那么我们需要监听文本框的输入时间,判断值改变后去请求后台,将数据返回显示。

2、文本框清空后数据清零。

没错,大概就这两个,而且基本上没有难度。

老样子,先把基础的代码写好,如同那些下象棋的人一样,开始几步的套路都是一样的,不用思考。

  1. <!-- html代码 -->
  2. <el-input placeholder="搜索" v-model="undefined" clearable size="mini">
  3.     <i slot="prefix" class="el-input__icon el-icon-search"></i>
  4. </el-input>
  5. <ul>
  6.     <li v-for="item in resultList">
  7.     <!-- 具体显示效果... -->
  8.     </li>
  9. </ul>
  10. <!-- js代码 -->
  11. <script>
  12.     var app;
  13.     var vm = new Vue({
  14.         el'#app',
  15.         datafunction ({
  16.             app = this;
  17.             return {
  18.                 searchundefined,  //搜索值
  19.                 resultList:[]       //返回结果
  20.             }
  21.         },
  22.         mounted: {
  23.         }
  24.     });
  25. </script>

ok,基本的已经完成了,既然是请求数据,那么肯定有一个请求接口的方法

  1. mounted: {
  2.     getData() {
  3.         axios.post(url,{
  4.             参数1:值1,
  5.             ...
  6.         }).then(function (response{
  7.             //符合你结构的判断,我这里简单处理,直接赋值
  8.             app.resultList= response.data.data;
  9.         }).catch(function (error{
  10.             console.log(error);
  11.         });
  12.     }
  13. }

那么现在第一个问题来了,我该怎么去调用这个方法,没有按钮可以点击,如何出发事件?既然用的vue,那么vue中的侦听器侦听器大家或许用过,

那就是:watch,具体的理论知识我就不说了,可以去看文档(其实我也不清楚)。

  1. var vm = new Vue({
  2.         el'#app',
  3.         datafunction ({
  4.             app = this;
  5.             return {
  6.                 searchundefined,  //搜索值
  7.                 resultList:[]       //返回结果
  8.             }
  9.         },
  10.         mounted: {
  11.             getData() {
  12.                 axios.post(url,{
  13.                     参数1:值1,
  14.                     ...
  15.                 }).then(function (response{
  16.                     //符合你结构的判断,我这里简单处理,直接赋值
  17.                     app.resultList= response.data.data;
  18.                 }).catch(function (error{
  19.                     console.log(error);
  20.                 });
  21.             }
  22.         },
  23.         watch: {
  24.             'search'function (value{
  25.                 if (!value) {
  26.                     //当值为空时
  27.                     app.resultList=[];
  28.                 } else {
  29.                     //请求接口,这里的app 是之前定义的,至于为什么要这样定义,是因为存在js闭包问题
  30.                     app.getData();
  31.                     //检查请求次数
  32.                     console.log('请求后台')
  33.                 };
  34.             }
  35.         }
  36.     });

好,搞了半天似乎和标题并没有任何关系。。。

下面进入正题,我们先看下这样写行不行。

可以看到,当我输入“17608”的时候,其实是求情了5次的,这么频繁的请求不说大家也懂,资源浪费嘛,试想一下,当数据量非常大的时候,这样写的话,嘿嘿嘿

好,然后你去和产品经理沟通,说了一推资源浪费等等的话,完全不鸟你,我就要这个亚子...(脑补中)

办法总比困难多,我们可以想一下在用户输入完条件后再去查找,在这个值没有变化的时候我们就可以去请求了。

  1. watch: {
  2.             'search'function (value{
  3.                 if (!value) {
  4.                     //当值为空时
  5.                     app.resultList=[];se
  6.                 } else {
  7.                     setTimeout(() => {
  8.                         app.getData();
  9.                         console.log('请求后台')
  10.                     }, 1000);
  11.                 };
  12.             }
  13.         }

这样一看就不行,都不用运行,结果和上面并没有什么区别,我也就不分析了,我们来修改一下

  1.      'search'function (value{
  2.           let timeout;
  3.           //当值变化的时候清除定时器
  4.           clearTimeout(timeout);
  5.           if (!value) {
  6.             //当值为空时
  7.             app.resultList=[];
  8.           } else {
  9.             timeout= setTimeout(() => {
  10.                   app.getData();
  11.                   console.log('请求后台')
  12.                  }, 1000);
  13.           };
  14.          }

没错,只要侦听到值在变化,我就把上一次的清除掉,想法是对的,但是还有问题,timeout的作用域问题,每进来一次,就会重新申明一次,所以你根本就清除不了。

  1. el:'#app',
  2.     datafunction(){
  3.           app = this;
  4.      return {
  5.          searchundefined,  //搜索值
  6.        resultList: [],       //返回结果
  7.        timeout: undefined  //防抖动 定时器变量
  8.          }
  9.      },

我们在这里定义,每次作用到的都是一个变量上

  1. 'search'function (value{
  2.                 //当值变化的时候清除定时器
  3.                 clearTimeout(app.timeout);
  4.                 if (!value) {
  5.                     //当值为空时
  6.                     app.resultList=[];
  7.                 } else {
  8.                     app.timeout= setTimeout(() => {
  9.                         app.getData();
  10.                         console.log('请求后台')
  11.                     }, 1000);
  12.                 };
  13.             }

ok,这样就完成了,先清除上一次的,在去重新请求。你要是问我怎么就知道要把之间间隔设成一秒,万一我就要两秒输入一个字符呢,大哥,要不要让你的手机壳

跟着你的心情变色啊

这个是就防抖动,节流与这个在我看来大同小异,他是根据时间的变化来判断,用户在多少多少秒之内输入去请求一次,聪明的人一说就懂。

代码格式不晓得咋回事,突然就乱了,我也懒得调了。。。。

最后放一波效果图



评价

vue.js+Layer实现表格数据绑定与更新

一:使用Vue.js绑定好数据与更新事件 使用v-on绑定好事件,在事件里边直接把该行数据传递进去,在更新方法里边就可以直接...

vue.js 实现省市联动

HTML代码&lt;divid=&quot;pro_citys&quot;&gt; 省:&lt;selectid=&quot;provice&quot;v-on:change=&quot;prochange()&quo...

vue.js常见问题

一:花括号当做字符串显示的问题1:检查下绑定到vue.js的id是否重复,如果id重复了,就有可能存在这种问题,因为有可能把数...

vue.js常用指令

v-html可以把字符串当成一个html来渲染,而不是原样输出Html类似.net mvc中的@Html.Raw()方法&lt;divv-html=&quot;item.tit...

干货!div滚动到一定位置就固定他。vue中实现一侧滚动到底部就固定

尊重原创:转载请注名出处div滚动到一定位置就固定他,例如左边的内容很多,右边的内容很少,如果不处理滚动到一定位置后右...

vue.js常用指令,事件绑定等,vue过滤器解析状态过滤器多个参数。vue表格状态解析。vue解析类型,element ui解析类型,状态,el-tag

按照html的编码显示:v-html&lt;div class=&quot;font_info&quot; v-html=&quot;item.Content&quot;&gt;{{item.Content}}&l...

vue.js if用法

vue.js if可以做一些判断例如我们要把下面这个输出varvm=newVue({ el:&quot;#content&quot;, data:{ titles:[&quot;小明...

vue.js 学习日记第一章-安装vue开发环境

官网:https://cn.vuejs.org/v2/guide/ 这是一篇学习性文章,不定时更新,用来记录我学习vue.js的过程。 首先,是v...

vue.js 学习日记第二章-在vue中编写function及一些简单指令

官网:https://cn.vuejs.org/v2/guide/ vue.js 学习日记第一章:http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第三章-vue中的简单事件及事件修饰符

官网:https://cn.vuejs.org/v2/guide/ vue.js 学习日记第二章:http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第四章-vue中文本框数据获取与绑定及computed计算属性

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第三章: http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第五章-v-if和v-for指令的使用方式

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第四章: http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第六章-vue组件初步学习

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第五章: http://www.tnblog.net/18323015640/article/details/2...

vue.js学习日记第七章-搭建脚手架

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第六章: http://www.tnblog.net/18323015640/article/details/2...

vue实现好友选中效果

逛过vue官网肯定会发现一个有趣的指令“v-for”,相比与以前拼接html代码确实要上档次一点,而且减少了工作量,先看一波效...

js时间格式化vue.js时间格式化,带T 时间格式化

也可以借助moment库, 参考:https://www.tnblog.net/aojiancc2/article/details/8079moment库有点大,推荐可以使用day.js...
世上本无事,庸人自扰之
排名
5
文章
229
粉丝
15
评论
7
vue脚手架搭建
庸人 : eslint不建议我们这样的新手安装,会严&#26684;要求测试等等
vue脚手架搭建
剑轩 : 加油加油,前后端通吃的全才
vue+element之表单验证
剑轩 : 这个还是比较方便,最近也有遇到这类问题
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术
寒夜客来茶当酒,竹炉汤沸火初红。