Vue.js页面中有多个input搜索框如何实现防抖操作


Posted in Javascript onNovember 04, 2019

debounce简介

debounce是lodash工具库中的一个非常好用的函数。在实现搜索框对输入进行动态查询的时候,我们需要防止前端频繁的发送查询请求给后端,这个时候就需要用到debounce,它可以设置一个时间间隔,比如300ms,忽略300毫秒内的输入变化。debounce的详细介绍可以参考 这篇 文章。

debounce的高级用法

博主的页面中有3个搜索框,每个搜索框都需要动态响应用户的输入到后台去查询匹配的文章,如下图:

Vue.js页面中有多个input搜索框如何实现防抖操作 

在Vue.js中如何实现多搜索框的debounce绑定,下面博主就带大家一起来看一下:

1. 监听输入变量

上图,可以看到我有3个输入框,每个输入框都需要设置一个变量来保存用户的输入:

data () {
 return {
 // 可用的文章列表
 columnItems: [],
 // 是否正在加载
 isLoading: [false, false, false],
 // 选择框搜索输入的值
 searchColumn1: '',
 searchColumn2: '',
 searchColumn3: ''
 }
 },

接下来,我们把输入变量绑定到输入框上面。博主这里使用的是vuetify的combobox,如果使用html原生的input框或者其他框架的input元素,此处请稍作修改:

<label>推荐专栏1</label>
 <v-combobox :items="columnItems"
 :loading="isLoading[0]"
 :search-input.sync="searchColumn1"
 ...
 >
 ...
 </v-combobox>
 <label>推荐专栏2</label>
 <v-combobox
 :items="columnItems"
 :loading="isLoading[1]"
 :search-input.sync="searchColumn2"
 ...
 >
 ...
 </v-combobox>
 <label>推荐专栏3</label>
 <v-combobox
 :items="columnItems"
 :loading="isLoading[2]"
 :search-input.sync="searchColumn3"
 ...
 >
 ...
 </v-combobox>

然后,我还需要监听这几个变量,如果发生改变则调用ajax进行后台查询:

watch: {
 searchColumn1 (val) {
 this.getColumns(val, 0)
 },
 searchColumn2 (val) {
 this.getColumns(val, 1)
 },
 searchColumn3 (val) {
 this.getColumns(val, 2)
 }
 },
 ...
 methods: {
 getColumns: function (searchValue, index) {
 // Items have already been requested
 if (this.isLoading[index]) return
 this.isLoading[index] = true
 let vm = this
 let options = {
 page: 1
 }
 if (searchValue) {
 options.title = searchValue.trim()
 } else {
 vm.columnItems = []
 vm.isLoading[index] = false
 return
 }
 // console.log(options)
 vm.$store.dispatch('getAllColumns', options).then(function (columns) {
 if (columns && columns.length) {
 vm.columnItems = columns
 }
 vm.isLoading[index] = false
 })
 }
 }

2. 添加debounce绑定

到目前为止,我们都还没有添加debounce,上面的逻辑也完全走的通,但是运行后你会发现输入操作运行的不流畅,如果打开dev-tools查看后台调用,你会发现用户输入后出发了一长串的ajax调用。因此我们引入debounce。此处,我们只需把含有ajax调用的函数提交给debounce,告诉它对getColumns()函数进行防抖操作。而在何处调用debounce则是非常有讲究的,错误的引入位置会使得debounce不起作用。请记住,debounce需要在created()钩子中引入。

import _ from 'lodash'
 ...
 created: function () {
 this.getColumns = _.debounce(this.getColumns, 500)
 },

最后,博主想抛出一个小问题:“为什么一定要在created()钩子中调用debounce呢,mounted()或者其他的地方为什么不可以呢?”,请知道的同学留言或者发评论给我吧!

 转自:https://www.bloghome.com.cn/user/xionghaizi

作者: 熊孩子

Javascript 相关文章推荐
JSQL SQLProxy 的 php 版本代码
May 05 Javascript
使用jQuery清空file文件域的解决方案
Apr 12 Javascript
jquery实现相册一下滑动两次的方法
Feb 09 Javascript
12行javascript代码绘制一个八卦图
Apr 02 Javascript
javascript基于DOM实现省市级联下拉框的方法
May 14 Javascript
js实现具有高亮显示效果的多级菜单代码
Sep 01 Javascript
用Vue.js实现监听属性的变化
Nov 17 Javascript
利用jquery去掉时光轴头尾部线条的方法实例
Jun 16 jQuery
Node.js 的模块知识汇总
Aug 16 Javascript
Angular2.0实现modal对话框的方法示例
Feb 18 Javascript
Array数组对象中的forEach、map、filter及reduce详析
Aug 02 Javascript
深入理解js A*寻路算法原理与具体实现过程
Dec 13 Javascript
详解利用eventemitter2实现Vue组件通信
Nov 04 #Javascript
jQuery实现form表单基于ajax无刷新提交方法实例代码
Nov 04 #jQuery
JS立即执行的匿名函数用法分析
Nov 04 #Javascript
小程序如何自主实现拦截器的示例代码
Nov 04 #Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
Nov 04 #Javascript
JavaScript判断浏览器版本的方法
Nov 03 #Javascript
JavaScript算法学习之冒泡排序和选择排序
Nov 02 #Javascript
You might like
基于mysql的论坛(4)
2006/10/09 PHP
PHP程序员编程注意事项
2008/04/10 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
2019/10/22 PHP
JQuery的一些小应用收集
2010/03/27 Javascript
JSChart轻量级图形报表工具(内置函数中文参考)
2010/10/11 Javascript
jquery遍历数组与筛选数组的方法
2013/11/05 Javascript
jQuery选择器源码解读(四):tokenize方法的Expr.preFilter
2015/03/31 Javascript
js结合正则实现国内手机号段校验
2015/06/19 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
js实现数字递增特效【仿支付宝我的财富】
2017/05/05 Javascript
vue刷新和tab切换实例
2018/02/11 Javascript
深入理解ES6中let和闭包
2018/02/22 Javascript
jquery 给动态生成的标签绑定事件的几种方法总结
2018/02/24 jQuery
web3.js增加eth.getRawTransactionByHash(txhash)方法步骤
2018/03/15 Javascript
详解在Node.js中发起HTTP请求的5种方法
2019/01/10 Javascript
[03:49]2016完美“圣”典风云人物:AMS专访
2016/12/06 DOTA
详解Python命令行解析工具Argparse
2016/04/20 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
python将.ppm格式图片转换成.jpg格式文件的方法
2018/10/27 Python
python中强大的format函数实例详解
2018/12/05 Python
python读取目录下最新的文件夹方法
2018/12/24 Python
python字符串中匹配数字的正则表达式
2019/07/03 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
2020/05/20 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
2020/07/09 Python
python复合条件下的字典排序
2020/12/18 Python
HTML5 File API改善网页上传功能
2009/08/19 HTML / CSS
explicit和implicit的含义
2012/11/15 面试题
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
信息管理专业学生自荐信格式
2013/09/22 职场文书
采购主管的岗位职责
2013/12/17 职场文书
小组口号大全
2014/06/09 职场文书
2015年挂职锻炼工作总结
2014/12/12 职场文书
重阳节活动主持词
2015/07/04 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
Java中多线程下载图片并压缩能提高效率吗
2021/07/01 Java/Android
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL