我在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)
}
然后在计算道具中使用过滤键。
要创建debpublished方法,你可以使用computed,这样它们就不会在组件的多个实例之间共享:
<template>
<input @input="handleInputDebounced">
<template>
<script>
import debounce from 'lodash.debouce';
export default {
props: {
timeout: {
type: Number,
default: 200,
},
},
methods: {
handleInput(event) {
// input handling logic
},
},
computed: {
handleInputDebounced() {
return debounce(this.handleInput, this.timeout);
},
},
}
</script>
你也可以让它与不受控制的v-model一起工作:
<template>
<input v-model="debouncedModel">
<template>
<script>
import debounce from 'lodash.debouce';
export default {
props: {
value: String,
timeout: {
type: Number,
default: 200,
},
},
methods: {
updateValue(value) {
this.$emit('input', value);
},
},
computed: {
updateValueDebounced() {
return debounce(this.updateValue, this.timeout);
},
debouncedModel: {
get() { return this.value; },
set(value) { this.updateValueDebounced(value); }
},
},
}
</script>
请注意,我在接受的答案之前发布了这个答案。这不是
正确的。这只是从解决方案向前迈进了一步
的问题。我编辑了已接受的问题,以显示作者的实现和我使用的最终实现。
基于注释和链接迁移文档,我对代码做了一些更改:
在模板:
<input type="text" v-on:input="debounceInput" v-model="searchInput">
在脚本:
watch: {
searchInput: function () {
this.debounceInput();
}
},
设置过滤器键的方法保持不变:
methods: {
debounceInput: _.debounce(function () {
this.filterKey = this.searchInput;
}, 500)
}
这看起来好像少了一个调用(只是v-model,而不是v-on:input)。
我使用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)
}
虽然这里几乎所有的答案都是正确的,如果有人正在寻找一个快速的解决方案,我有一个指令。
https://www.npmjs.com/package/vue-lazy-input
它适用于@input和v-model,支持自定义组件和DOM元素,debounce和throttle。
Vue.use(VueLazyInput)
new Vue({
el: '#app',
data() {
return {
val: 42
}
},
methods:{
onLazyInput(e){
console.log(e.target.value)
}
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<script src="https://unpkg.com/lodash/lodash.min.js"></script><!-- dependency -->
<script src="https://unpkg.com/vue-lazy-input@latest"></script>
<div id="app">
<input type="range" v-model="val" @input="onLazyInput" v-lazy-input /> {{val}}
</div>