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 相关文章推荐
用Javscript实现表单复选框的全选功能
May 25 Javascript
js loading加载效果实现代码
Nov 24 Javascript
javascript 处理事件绑定的一些兼容写法
Dec 24 Javascript
ExtJs事件机制基本代码模型和流程解析
Oct 24 Javascript
一个js控制的导航菜单实例代码
Dec 03 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
Feb 21 Javascript
字符串反转_JavaScript
Apr 28 Javascript
bootstrap导航条实现代码
Dec 28 Javascript
基于Swiper实现移动端页面图片轮播效果
Dec 28 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
Aug 31 Javascript
微信小程序事件对象中e.target和e.currentTarget的区别详解
May 08 Javascript
vue实现购物车功能(商品分类)
Apr 20 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
用header 发送cookie的php代码
2007/03/16 PHP
php中变量及部分适用方法
2008/03/27 PHP
解析PHP跨站刷票的实现代码
2013/06/18 PHP
php字符串替换函数substr_replace()用法实例
2015/03/17 PHP
php随机生成数字字母组合的方法
2015/03/18 PHP
PHP自定义函数格式化json数据示例
2016/09/14 PHP
JSON 学习之完全手册 图文
2007/05/29 Javascript
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
2011/04/24 Javascript
JS对img进行操作(换图片/切图/轮换/停止)
2013/04/17 Javascript
利用JS延迟加载百度分享代码,提高网页速度
2013/07/01 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
jQuery表格插件ParamQuery简单使用方法示例
2013/12/05 Javascript
JS动态修改iframe内嵌网页地址的方法
2015/04/01 Javascript
Javascript 是你的高阶函数(高级应用)
2015/06/15 Javascript
jquery ztree实现模糊搜索功能
2016/02/25 Javascript
JavaScript的ExtJS框架中表格的编写教程
2016/05/21 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
jQuery+Ajax请求本地数据加载商品列表页并跳转详情页的实现方法
2017/07/12 jQuery
20个必会的JavaScript面试题(小结)
2019/07/02 Javascript
VScode格式化ESlint方法(最全最好用方法)
2019/09/10 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
python制作一个桌面便签软件
2015/08/09 Python
深入理解python try异常处理机制
2016/06/01 Python
Python3并发写文件与Python对比
2019/11/20 Python
opencv3/C++实现视频读取、视频写入
2019/12/11 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
通过实例了解Python异常处理机制底层实现
2020/07/23 Python
外贸学院会计专业应届生求职信
2013/11/14 职场文书
安全月活动总结
2014/05/05 职场文书
春游踏青活动方案
2014/08/14 职场文书
技术股份合作协议书
2014/10/05 职场文书
工作保证书
2015/01/17 职场文书
大学生暑假实习总结
2015/07/13 职场文书
SpringBoot 集成Redis 过程
2021/06/02 Redis
python实现双链表
2022/05/25 Python