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 相关文章推荐
javascript 构建一个xmlhttp对象池合理创建和使用xmlhttp对象
Jan 15 Javascript
jquery之empty()与remove()区别说明
Sep 10 Javascript
关于javascript中this关键字(翻译+自我理解)
Oct 20 Javascript
javascript 中that的含义示例介绍
May 14 Javascript
javascript基于DOM实现权限选择实例分析
May 14 Javascript
js实现跨域的方法实例详解
Jun 24 Javascript
jQuery实现图片文字淡入淡出效果
Dec 21 Javascript
jQuery中ajax的load()与post()方法实例详解
Jan 05 Javascript
BootStrap表单宽度设置方法
Mar 10 Javascript
微信小程序里引入SVG矢量图标的方法
Sep 20 Javascript
关于layui导航栏不展示下拉列表的解决方法
Sep 25 Javascript
基于JavaScript实现猜数字游戏代码实例
Jul 30 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
《星际争霸2》终章已出 RTS时代宣告终结
2017/02/07 星际争霸
在IIS7.0下面配置PHP 5.3.2运行环境的方法
2010/04/13 PHP
php权重计算方法代码分享
2014/01/09 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
2014/05/28 PHP
php变量与JS变量实现不通过跳转直接交互的方法
2017/08/25 PHP
laravel配置Redis多个库的实现方法
2019/04/10 PHP
laravel实现于语言包的完美切换方法
2019/09/29 PHP
Node.js实现简单聊天服务器
2014/06/20 Javascript
nodejs的10个性能优化技巧
2014/07/15 NodeJs
JavaScript极简入门教程(二):对象和函数
2014/10/25 Javascript
jQuery中的each()详细介绍(推荐)
2016/05/25 Javascript
JS判断字符串变量是否含有某个字串的实现方法
2016/06/03 Javascript
利用JS提交表单的几种方法和验证(必看篇)
2016/09/17 Javascript
javascript常用经典算法详解
2017/01/11 Javascript
微信小程序侧边栏滑动特效(左右滑动)
2017/01/23 Javascript
用jQuery实现圆点图片轮播效果
2017/03/19 Javascript
微信小程序学习之数据处理详解
2017/07/05 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
2018/08/07 Javascript
JS实现的类似微信聊天效果示例
2019/01/29 Javascript
electron-vue利用webpack打包实现多页面的入口文件问题
2019/05/12 Javascript
Vue监听页面刷新和关闭功能
2019/06/20 Javascript
jQuery是用来干什么的 jquery其实就是一个js框架
2021/02/04 jQuery
[01:42]TI4西雅图DOTA2前线报道 第一顿早饭哦
2014/07/08 DOTA
在CentOS6上安装Python2.7的解决方法
2018/01/09 Python
Python requests发送post请求的一些疑点
2018/05/20 Python
基于Python实现定时自动给微信好友发送天气预报
2018/10/25 Python
快速查找Python安装路径方法
2020/02/06 Python
HTML5输入框下拉菜单功能的示例代码
2020/09/08 HTML / CSS
英国排名第一的在线宠物用品商店:Monster Pet Supplies
2018/05/20 全球购物
智能钱包:Ekster
2019/11/21 全球购物
远程教育心得体会
2014/01/03 职场文书
料理师求职信
2014/01/30 职场文书
公司承诺书格式范文
2015/04/28 职场文书
2016大学迎新欢迎词
2015/09/29 职场文书
再谈python_tkinter弹出对话框创建
2022/03/20 Python