Вы подходите хорошо, устанавливаете таймаут, а затем очищаете его, это хорошо известный подход к устранению неполадок.Этот ответ описывает его и использует тот же метод.
Проблема заключается в том, что вы создаете новую отлаженную функцию при каждом вызове searchKeayword
, а затем выполняете ее сразу.
Вместо этого вам нужно напрямую передать дебагованную функцию.
const debounce = (fn, delay) => {
let timeout;
return function() {
const context = this;
const args = arguments;
clearTimeout(timeout);
timeout = setTimeout(_ => fn.apply(context, args), delay);
};
};
new Vue({
el: '#root',
name: "App",
data: _ => ({ called: 0 }),
methods: {
doSomething: debounce(function() {
this.called += 1;
}, 2000)
},
template: `
<div>
<button v-on:click='doSomething'>Do Something</button>
I've been called {{ called }} times
</div>
`
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id='root'></div>
Также обратите внимание, что debounce не обязательно должен быть методом вашего компонента.