我在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)
}
然后在计算道具中使用过滤键。
我可以用很少的实现来使用debounce。
我使用Vue 2.6.14与boostrap-vue:
把这个pkg加到你的包裹里。json: https://www.npmjs.com/package/debounce
将此添加到main.js:
import { debounce } from "debounce";
Vue.use(debounce);
在我的组件中,有这样的输入:
<b-form-input
debounce="600"
@update="search()"
trim
id="username"
v-model="form.userName"
type="text"
placeholder="Enter username"
required
>
</b-form-input>
它所做的就是调用search()方法,而搜索方法使用表单。执行搜索的用户名。
下面是一个Vue 2组件示例,演示了如何使用debounce。
<template>
<div>
<v-btn @click="properDebounceMyMethod">Proper debounce</v-btn>
<v-btn @click="notWorkingDebounceMyMethod">!debounce</v-btn>
<v-btn @click="myMethod">normal call</v-btn>
</div>
</template>
<script lang="ts" >
import { defineComponent } from '@vue/composition-api';
import { debounce } from 'lodash';
export default defineComponent({
name: 'DebounceExample',
created() {
// debounce instance method dynamically on created hook
this.properDebounceMyMethod = debounce(this.properDebounceMyMethod, 500);
},
methods: {
properDebounceMyMethod(){
this.myMethod();
},
notWorkingDebounceMyMethod() {
debounce(this.myMethod, 500);
},
myMethod() {
console.log('hi from my method');
},
}
});
</script>
选项1:可重复使用,无deps
-如果在你的项目中需要不止一次,建议使用
/ helpers.js
export function debounce (fn, delay) {
var timeoutID = null
return function () {
clearTimeout(timeoutID)
var args = arguments
var that = this
timeoutID = setTimeout(function () {
fn.apply(that, args)
}, delay)
}
}
/ Component.vue
<script>
import {debounce} from './helpers'
export default {
data () {
return {
input: '',
debouncedInput: ''
}
},
watch: {
input: debounce(function (newVal) {
this.debouncedInput = newVal
}, 500)
}
}
</script>
Codepen
选项2:组件内,也没有deps
-建议一次性使用或用于小型项目
/ Component.vue
<template>
<input type="text" v-model="input" />
</template>
<script>
export default {
data: {
timeout: null,
debouncedInput: ''
},
computed: {
input: {
get() {
return this.debouncedInput
},
set(val) {
if (this.timeout) clearTimeout(this.timeout)
this.timeout = setTimeout(() => {
this.debouncedInput = val
}, 300)
}
}
}
}
</script>
Codepen
我也有同样的问题,这里有一个解决方案,没有插件。
因为<input v-model="xxxx">与
<input
v-bind:value="xxxx"
v-on:input="xxxx = $event.target.value"
>
(源)
我想我可以在xxxx = $event.target.value中为xxxx赋值时设置一个debounce函数
像这样
<input
v-bind:value="xxxx"
v-on:input="debounceSearch($event.target.value)"
>
方法:
debounceSearch(val){
if(search_timeout) clearTimeout(search_timeout);
var that=this;
search_timeout = setTimeout(function() {
that.xxxx = val;
}, 400);
},