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 class详解
Sep 07 Javascript
JavaScript中reduce()方法的使用详解
Jun 09 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
Sep 15 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
Jul 05 Javascript
最通俗易懂的javascript变量提升详解
Aug 05 Javascript
微信小程序实现横向增长表格的方法
Jul 24 Javascript
Nuxt.js SSR与权限验证的实现
Nov 21 Javascript
ES6知识点整理之Proxy的应用实例详解
Apr 16 Javascript
jQuery Ajax async=&gt;false异步改为同步时,解决导致浏览器假死的问题
Jul 22 jQuery
vue路由守卫及路由守卫无限循环问题详析
Sep 05 Javascript
基于JavaScript实现大文件上传后端代码实例
Aug 18 Javascript
Vue使用Ref跨层级获取组件的步骤
Jan 25 Vue.js
详解利用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
回首过去10年中最搞笑的10部动漫,哪一部让你节操尽碎?
2020/03/03 日漫
文件上传的实现
2006/10/09 PHP
两个开源的Php输出Excel文件类
2010/02/08 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
用js实现控制内容的向上向下滚动效果
2007/06/26 Javascript
csdn 批量接受好友邀请
2009/02/19 Javascript
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
2011/01/12 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
javascript手工制作悬浮菜单
2015/02/12 Javascript
js实现宇宙星空背景效果的方法
2015/03/03 Javascript
为什么JS中eval处理JSON数据要加括号
2015/04/13 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
JavaScript之json_动力节点Java学院整理
2017/06/29 Javascript
JS点击缩略图整屏居中放大图片效果
2017/07/04 Javascript
Angular 2.0+ 的数据绑定的实现示例
2017/08/09 Javascript
浅谈vue.js导入css库(elementUi)的方法
2018/03/09 Javascript
react 国际化的实现代码示例
2018/09/14 Javascript
angular4笔记系列之内置指令小结
2018/11/09 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
js canvas实现俄罗斯方块
2020/10/11 Javascript
python每次处理固定个数的字符的方法总结
2013/01/29 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
numpy的文件存储.npy .npz 文件详解
2018/07/09 Python
对PyTorch torch.stack的实例讲解
2018/07/30 Python
在python中只选取列表中某一纵列的方法
2018/11/28 Python
webapp字号大小跟随系统字号大小缩放的示例代码
2018/12/26 HTML / CSS
大学生村官工作感言
2014/01/10 职场文书
应届生求职信范文
2014/06/30 职场文书
2014年社区民政工作总结
2014/12/02 职场文书
护士医德考评自我评价
2015/03/03 职场文书
合作与交流自我评价
2015/03/09 职场文书
社区节水倡议书
2015/04/29 职场文书
车辆挂靠协议书
2016/03/23 职场文书
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技