84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
嗨,第一次在这里回答问题,所以请尽情纠正我的答案,我会非常感激。 我认为最漂亮、最轻量的解决方案是在全局创建一个指令,您可以在所有表单中随意使用。
首先创建带有指令的文件,例如。 debouncer.js
然后创建防抖函数
//debouncer.js /* 这是一个典型的防抖函数,它接收“callback”和等待发出事件的时间 */ function debouncer (fn, delay) { var timeoutID = null return function () { clearTimeout(timeoutID) var args = arguments var that = this timeoutID = setTimeout(function () { fn.apply(that, args) }, delay) } } /* 此函数接收指令将设置在其中的元素和设置在其中的值 如果值已更改,则重新绑定事件 它具有默认超时时间为500毫秒 */ module.exports = function debounce(el, binding) { if(binding.value !== binding.oldValue) { el.oninput = debouncer(function(){ el.dispatchEvent(new Event('change')) }, parseInt(binding.value) || 500) } }
在定义了这个文件之后,您可以转到您的main.js导入它并使用导出的函数。
//main.js import { createApp } from 'vue' import debounce from './directives/debounce' // 导入的文件 const app = createApp(App) //定义指令 app.directive('debounce', (el,binding) => debounce(el,binding)) app.mount('#app')
完成了,当您想要在输入框中使用指令时,只需像这样操作,无需导入或其他任何操作。
//Component.vue <input :placeholder="按名称筛选" v-model.lazy="filter.value" v-debounce="400" />
如果您选择以这种方式进行操作,v-model.lazy指令非常重要,因为默认情况下,它会在输入事件上更新绑定的属性,但设置这个指令会使其等待更改事件,而这是我们在防抖函数中发出的事件。这样做将停止v-model自动更新,直到您停止输入或超时时间到期(可以在指令的值中设置)。 希望这样清楚明了。
我没有找到满意的解决方案,因为我想在模板中看到我的绑定,所以我决定分享我的解决方案。我编写了一个简单的防抖函数,并使用以下语法绑定行为:
setup() { ... function createDebounce() { let timeout = null; return function (fnc, delayMs) { clearTimeout(timeout); timeout = setTimeout(() => { fnc(); }, delayMs || 500); }; } return { state, debounce: createDebounce(), }; },
而模板语法如下:
<input type="text" :value="state.filterText" @input="debounce(() => { state.filterText = $event.target.value })" />
嗨,第一次在这里回答问题,所以请尽情纠正我的答案,我会非常感激。 我认为最漂亮、最轻量的解决方案是在全局创建一个指令,您可以在所有表单中随意使用。
首先创建带有指令的文件,例如。 debouncer.js
然后创建防抖函数
在定义了这个文件之后,您可以转到您的main.js导入它并使用导出的函数。
完成了,当您想要在输入框中使用指令时,只需像这样操作,无需导入或其他任何操作。
如果您选择以这种方式进行操作,v-model.lazy指令非常重要,因为默认情况下,它会在输入事件上更新绑定的属性,但设置这个指令会使其等待更改事件,而这是我们在防抖函数中发出的事件。这样做将停止v-model自动更新,直到您停止输入或超时时间到期(可以在指令的值中设置)。 希望这样清楚明了。
我没有找到满意的解决方案,因为我想在模板中看到我的绑定,所以我决定分享我的解决方案。我编写了一个简单的防抖函数,并使用以下语法绑定行为:
而模板语法如下: