input 框中debounce_Vue.js页面中有多个input搜索框如何实现防抖操作

debounce简介

debounce是lodash工具库中的一个非常好用的函数。在实现搜索框对输入进行动态查询的时候,我们需要防止前端频繁的发送查询请求给后端,这个时候就需要用到debounce,它可以设置一个时间间隔,比如300ms,忽略300毫秒内的输入变化。debounce的详细介绍可以参考 这篇 文章。

debounce的高级用法

博主的页面中有3个搜索框,每个搜索框都需要动态响应用户的输入到后台去查询匹配的文章,如下图:

在Vue.js中如何实现多搜索框的debounce绑定,下面博主就带大家一起来看一下:

1. 监听输入变量

上图,可以看到我有3个输入框,每个输入框都需要设置一个变量来保存用户的输入:

data () {

return {

// 可用的文章列表

columnItems: [],

// 是否正在加载

isLoading: [false, false, false],

// 选择框搜索输入的值

searchColumn1: '',

searchColumn2: '',

searchColumn3: ''

}

},

接下来,我们把输入变量绑定到输入框上面。博主这里使用的是vuetify的combobox,如果使用html原生的input框或者其他框架的input元素,此处请稍作修改:

推荐专栏1

:loading="isLoading[0]"

:search-input.sync="searchColumn1"

...

>

...

推荐专栏2

:items="columnItems"

:loading="isLoading[1]"

:search-input.sync="searchColumn2"

...

>

...

推荐专栏3

:items="columnItems"

:loading="isLoading[2]"

:search-input.sync="searchColumn3"

...

>

...

然后,我还需要监听这几个变量,如果发生改变则调用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()或者其他的地方为什么不可以呢?”,请知道的同学留言或者发评论给我吧!

作者: 熊孩子

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值