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 相关文章推荐
客户端限制只能上传jpg格式图片的js代码
Dec 09 Javascript
JS自动缩小超出大小的图片
Oct 12 Javascript
js绑定事件this指向发生改变的问题解决方法
Apr 23 Javascript
微信浏览器内置JavaScript对象WeixinJSBridge使用实例
May 25 Javascript
jQuery实现文字自动横移
Jan 08 Javascript
微信小程序 扎金花简单实例
Feb 21 Javascript
ES6中Iterator与for..of..遍历用法分析
Mar 31 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
Sep 25 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
Dec 08 Javascript
JavaScript选择排序算法原理与实现方法示例
Aug 06 Javascript
实例分析vue循环列表动态数据的处理方法
Sep 28 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
Jul 16 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
PHP下MAIL的另一解决方案
2006/10/09 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
2016/02/15 PHP
PHP实现的同步推荐操作API接口案例分析
2016/11/30 PHP
PHP count()函数讲解
2019/02/03 PHP
Laravel框架实现简单的学生信息管理平台案例
2019/05/07 PHP
accesskey 提交
2006/06/26 Javascript
jQuery动态设置form表单的enctype值(实现代码)
2013/07/04 Javascript
jquery阻止冒泡事件使用模拟事件
2013/09/06 Javascript
采用自执行的匿名函数解决for循环使用闭包的问题
2014/09/11 Javascript
深入分析Cookie的安全性问题
2015/03/01 Javascript
JavaScript中几种排序算法的简单实现
2015/07/29 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
js实现纯前端的图片预览
2016/04/27 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
2016/06/14 Javascript
jQuery读取XML文件的方法示例
2017/02/03 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
关于Google发布的JavaScript代码规范你要知道哪些
2018/04/04 Javascript
详解vue-router数据加载与缓存使用总结
2018/10/29 Javascript
js指定日期增加指定月份的实现方法
2018/12/19 Javascript
Node.js之readline模块的使用详解
2019/03/25 Javascript
Python中利用函数装饰器实现备忘功能
2015/03/30 Python
正确理解Python中if __name__ == '__main__'
2019/01/24 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
2019/08/01 Python
开启Django博客的RSS功能的实现方法
2020/02/17 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
HTML5中indexedDB 数据库的使用实例
2017/05/11 HTML / CSS
使用canvas对多图片拼合并导出图片的方法
2018/08/28 HTML / CSS
做一个有道德的人演讲稿
2014/05/14 职场文书
物理分数没达标检讨书
2014/09/13 职场文书
自我查摆剖析材料
2014/10/11 职场文书
幼儿园教师节感谢信
2015/01/23 职场文书
2016年春节慰问信息
2015/03/25 职场文书
给下属加薪申请报告
2015/05/15 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书
Python+Appium新手教程
2021/04/17 Python