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 相关文章推荐
prototype与jquery下Ajax实现的差别
Sep 13 Javascript
javaScript checkbox 全选/反选及批量删除
Apr 28 Javascript
Fastest way to build an HTML string(拼装html字符串的最快方法)
Aug 20 Javascript
巧用js提交表单轻松解决一个页面有多个提交按钮
Nov 17 Javascript
JavaScript输入邮箱自动提示实例代码
Jan 13 Javascript
node.js中的fs.symlinkSync方法使用说明
Dec 15 Javascript
Javascript类型系统之String字符串类型详解
Jun 21 Javascript
JS装饰器函数用法总结
Apr 21 Javascript
解决vue移动端适配问题
Dec 12 Javascript
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
Jun 07 Javascript
Ajax请求时无法重定向的问题解决代码详解
Jun 21 Javascript
vuex存值与取值的实例
Nov 06 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相关说明
2007/01/15 PHP
php实现的click captcha点击验证码类实例
2014/09/23 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
2016/04/04 PHP
最新最全PHP生成制作验证码代码详解(推荐)
2016/06/12 PHP
微信公众平台开发教程②微信端分享功能图文详解
2019/04/10 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
2021/03/09 PHP
详解CSS样式中的 !important * _ 符号
2021/03/09 HTML / CSS
动态加载js的几种方法
2006/10/23 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
探讨js中的双感叹号判断
2013/11/11 Javascript
js身份证判断方法支持15位和18位
2014/03/18 Javascript
深入理解JavaScript编程中的原型概念
2015/06/25 Javascript
JS实现兼容火狐及IE iframe onload属性的遮罩层隐藏及显示效果
2016/08/23 Javascript
通过BootStrap实现轮播图的实际应用
2016/09/26 Javascript
利用Node.JS实现邮件发送功能
2016/10/21 Javascript
Bootstrap select下拉联动(jQuery cxselect)
2017/01/04 Javascript
JavaScript表单验证实现代码
2017/05/22 Javascript
NodeJS链接MySql数据库的操作方法
2017/06/27 NodeJs
JS实现简单的星期格式转换功能示例
2018/07/23 Javascript
Flutter实现仿微信底部菜单栏功能
2019/09/18 Javascript
vue 组件之间事件触发($emit)与event Bus($on)的用法说明
2020/07/28 Javascript
[57:59]EG vs Secret 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
python 切片和range()用法说明
2013/03/24 Python
Python中模块与包有相同名字的处理方法
2017/05/05 Python
python中安装Scrapy模块依赖包汇总
2017/07/02 Python
简单了解python模块概念
2018/01/11 Python
Python中 传递值 和 传递引用 的区别解析
2018/02/22 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
WIn10+Anaconda环境下安装PyTorch(避坑指南)
2019/01/30 Python
Pyorch之numpy与torch之间相互转换方式
2019/12/31 Python
使用OpenCV实现人脸图像卡通化的示例代码
2021/01/15 Python
手工制作的豪华英式沙发和沙发床:Willow & Hall
2019/05/03 全球购物
淘宝活动策划方案
2014/02/06 职场文书
北京青年观后感
2015/06/15 职场文书
Python机器学习之逻辑回归
2021/05/11 Python
HTML5简单实现添加背景音乐的几种方法
2021/05/12 HTML / CSS