我在Vue模板中有一个简单的输入框,我想使用debounce或多或少像这样:
<input type="text" v-model="filterKey" debounce="500">
然而,在Vue 2中debounce属性已被弃用。建议只说:“使用v-on:输入+第三方反弹功能”。
如何正确地实现它?
我尝试使用lodash, v-on:input和v-model来实现它,但我想知道是否有可能没有额外的变量。
在模板:
<input type="text" v-on:input="debounceInput" v-model="searchInput">
在脚本:
data: function () {
return {
searchInput: '',
filterKey: ''
}
},
methods: {
debounceInput: _.debounce(function () {
this.filterKey = this.searchInput;
}, 500)
}
然后在计算道具中使用过滤键。
如果你需要使用lodash的debounce函数来应用动态延迟:
props: {
delay: String
},
data: () => ({
search: null
}),
created () {
this.valueChanged = debounce(function (event) {
// Here you have access to `this`
this.makeAPIrequest(event.target.value)
}.bind(this), this.delay)
},
methods: {
makeAPIrequest (newVal) {
// ...
}
}
模板:
<template>
//...
<input type="text" v-model="search" @input="valueChanged" />
//...
</template>
注意:在上面的例子中,我做了一个搜索输入的例子,它可以用props中提供的自定义延迟调用API
我使用debounce NPM包并像这样实现:
<input @input="debounceInput">
methods: {
debounceInput: debounce(function (e) {
this.$store.dispatch('updateInput', e.target.value)
}, config.debouncers.default)
}
使用lodash和问题中的示例,实现如下所示:
<input v-on:input="debounceInput">
methods: {
debounceInput: _.debounce(function (e) {
this.filterKey = e.target.value;
}, 500)
}
如果你需要一个非常简约的方法,我做了一个(最初从vuejs-tips分叉也支持IE),可在这里:https://www.npmjs.com/package/v-debounce
用法:
<input v-model.lazy="term" v-debounce="delay" placeholder="Search for something" />
然后在你的组件中:
<script>
export default {
name: 'example',
data () {
return {
delay: 1000,
term: '',
}
},
watch: {
term () {
// Do something with search term after it debounced
console.log(`Search term changed to ${this.term}`)
}
},
directives: {
debounce
}
}
</script>