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的执行顺序 之实战篇
Mar 03 Javascript
另一个javascript小测验(代码集合)
Jul 27 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战二)
Aug 21 Javascript
javascript date格式化示例
Sep 25 Javascript
coffeescript使用的方式汇总
Aug 05 Javascript
JQuery控制图片由中心点逐渐放大效果
Jun 26 Javascript
简单的js表格操作
Sep 24 Javascript
jQuery插件FusionCharts实现的Marimekko图效果示例【附demo源码】
Mar 24 jQuery
详解Node.js中exports和module.exports的区别
Apr 19 Javascript
获取url中用&amp;隔开的参数实例(分享)
May 28 Javascript
ionic中的$ionicPlatform.ready事件中的通用设置
Jun 11 Javascript
js实现canvas保存图片为png格式并下载到本地的方法
Aug 31 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中对于浮点型的数据需要用不同的方法解决
2014/03/11 PHP
php检测文件编码的方法示例
2014/04/25 PHP
PHP生成不重复随机数的方法汇总
2014/11/19 PHP
浅谈Laravel中的一个后期静态绑定
2017/08/11 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
2018/05/31 PHP
JS中style属性
2006/10/11 Javascript
js中reverse函数的用法详解
2013/12/26 Javascript
基于jquery ui的alert,confirm方案(支持换肤)
2015/04/03 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
2015/09/01 Javascript
JS常用字符串方法(推荐)
2021/01/15 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
使用JavaScript获取Request中参数的值方法
2016/09/27 Javascript
基于node.js依赖express解析post请求四种数据格式
2017/02/13 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
2017/02/20 Javascript
基于Vuejs的搜索匹配功能实现方法
2018/03/03 Javascript
Vue常用指令详解分析
2018/08/19 Javascript
解决vue 引入子组件报错的问题
2018/09/06 Javascript
详解vue路由篇(动态路由、路由嵌套)
2019/01/27 Javascript
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
2019/01/29 Javascript
微信小程序基于movable-view实现滑动删除效果
2020/01/08 Javascript
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
2020/01/12 Javascript
js页面加载后执行的几种方式小结
2020/01/30 Javascript
js基于canvas实现时钟组件
2021/02/07 Javascript
python sqlobject(mysql)中文乱码解决方法
2008/11/14 Python
Python制作词云的方法
2018/01/03 Python
PyTorch中常用的激活函数的方法示例
2019/08/20 Python
使用PyOpenGL绘制三维坐标系实例
2019/12/24 Python
Python多线程正确用法实例解析
2020/05/30 Python
Python正则表达式高级使用方法汇总
2020/06/18 Python
使用CSS3设计地图上的雷达定位提示效果
2016/04/05 HTML / CSS
加拿大最大的书店:Indigo
2017/01/01 全球购物
高三自我评价
2014/02/01 职场文书
教师工作表现自我评价
2015/03/05 职场文书
环境卫生整治简报
2015/07/20 职场文书
Python 数据可视化之Seaborn详解
2021/11/02 Python
python blinker 信号库
2022/05/04 Python