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实现读取txt文档的脚本
Jul 20 Javascript
菜鸟学习JavaScript小实验之函数引用
Nov 17 Javascript
jQuery.query.js 取参数的两点问题分析
Aug 06 Javascript
利用函数的惰性载入提高javascript代码执行效率
May 05 Javascript
实现placeholder效果的方案汇总
Jun 11 Javascript
浅谈javascript函数式编程
Sep 06 Javascript
Bootstrap如何激活导航状态
Mar 22 Javascript
JS给按钮添加跳转功能类似a标签
May 30 Javascript
vue.js加载新的内容(实例代码)
Jun 01 Javascript
详解如何从零开始搭建Express+Vue开发环境
Jul 17 Javascript
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
Apr 11 Vue.js
JS实现刷新网页后之前浏览位置保持不变示例详解
Aug 14 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
德劲1107的电路分析与打磨
2021/03/02 无线电
PHP开发中常用的字符串操作函数
2011/02/08 PHP
解析PHP 使用curl提交json格式数据
2013/06/29 PHP
PHP的消息通信机制测试实例
2016/11/10 PHP
PHP遍历目录文件的常用方法小结
2017/02/03 PHP
关于ThinkPHP中的异常处理详解
2018/05/11 PHP
制作高质量的JQuery Plugin 插件的方法
2010/04/20 Javascript
javascript 三种方法实现获得和设置以及移除元素属性
2013/03/20 Javascript
js判断生效时间不得大于失效时间的思路及代码
2013/04/23 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
2016/02/25 Javascript
基于javascript实现泡泡大冒险网页版小游戏
2016/03/23 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
JS常用字符串方法(推荐)
2021/01/15 Javascript
jQuery实现公告新闻自动滚屏效果实例代码
2016/07/14 Javascript
本地存储localStorage用法详解
2017/07/31 Javascript
Vue.js做select下拉列表的实例(ul-li标签仿select标签)
2018/03/02 Javascript
利用hasOwnProperty给数组去重的面试题分享
2018/11/05 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
使用jquery实现轮播图效果
2021/01/02 jQuery
JS+CSS实现动态时钟
2021/02/19 Javascript
[46:25]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第二局
2016/03/05 DOTA
[43:53]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.22
2019/09/05 DOTA
python 生成不重复的随机数的代码
2011/05/15 Python
python使用Tkinter显示网络图片的方法
2015/04/24 Python
在双python下设置python3为默认的方法
2018/10/31 Python
Python多线程模块Threading用法示例小结
2019/11/09 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
2020/08/07 Python
英国文具、办公用品和科技商店:Ryman
2018/09/27 全球购物
幼师自我鉴定范文
2013/10/01 职场文书
费用会计岗位职责
2014/01/01 职场文书
上帝也疯狂观后感
2015/06/09 职场文书
幼儿教师远程研修感悟
2015/11/18 职场文书
2016年安康杯竞赛活动总结
2016/04/05 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书
SQL中的三种去重方法小结
2021/11/01 SQL Server