Tengo un cuadro de entrada simple en una plantilla Vue y me gustaría usar debounce más o menos así:
<input type="text" v-model="filterKey" debounce="500">
Sin embargo, la debounce
propiedad ha quedado en desuso en Vue 2 . La recomendación solo dice: "use v-on: input + función de rebote de terceros".
¿Cómo lo implementas correctamente?
Intenté implementarlo usando lodash , v-on: input y v-model , pero me pregunto si es posible prescindir de la variable adicional.
En plantilla:
<input type="text" v-on:input="debounceInput" v-model="searchInput">
En script:
data: function () {
return {
searchInput: '',
filterKey: ''
}
},
methods: {
debounceInput: _.debounce(function () {
this.filterKey = this.searchInput;
}, 500)
}
La clave de filtro se usa luego en computed
accesorios.
vue.js
vuejs2
debouncing
MartinTeeVarga
fuente
fuente
Respuestas:
Estoy usando el paquete NPM debounce e implementado así:
Usando lodash y el ejemplo en la pregunta, la implementación se ve así:
fuente
v-model=your_input_variable
a la entrada y en su vuedata
. Por lo tanto, no confíae.target
sino que usa Vue para poder acceder enthis.your_input_variable
lugar dee.target.value
this
dentro de la función.Asignar un rebote
methods
puede ser un problema. Entonces, en lugar de esto:Puedes probar:
Se convierte en un problema si tiene varias instancias de un componente, de forma similar a como
data
debería ser una función que devuelve un objeto. Cada instancia necesita su propia función antirrebote si se supone que debe actuar de forma independiente.Aquí hay un ejemplo del problema:
fuente
data()
entonces.actualizado en 2020
Opción 1: reutilizable, sin profundidad
(Recomendado si es necesario más de una vez en su proyecto)
helpers.js
Componente.vue
Codepen
Opción 2: en componentes, sin profundidad
(Recomendado si se usa una vez o en un proyecto pequeño)
Componente.vue
Codepen
fuente
Muy simple sin lodash
fuente
destroyed() { clearInterval(this.timeout) }
para no tener un tiempo de espera después de la destrucción.Tuve el mismo problema y aquí hay una solución que funciona sin complementos.
Dado que
<input v-model="xxxx">
es exactamente lo mismo que(fuente)
Pensé que podría establecer una función antirrebote en la asignación de xxxx en
xxxx = $event.target.value
Me gusta esto
métodos:
fuente
@input="update_something"
acción a continuación, llamar a esto despuésthat.xxx = val
that.update_something();
debounceSearch: function(val) { if (this.search_timeout) clearTimeout(this.search_timeout); var that=this; this.search_timeout = setTimeout(function() { that.thread_count = val; that.update_something(); }, 500); },
Según los comentarios y el documento de migración vinculado , he realizado algunos cambios en el código:
En plantilla:
En script:
Y el método que establece la clave de filtro permanece igual:
Parece que hay una llamada menos (solo la
v-model
y no lav-on:input
).fuente
debounceInput()
dos veces por cada cambio?v-on:
detectará los cambios de entrada y llamará a rebote, Y debido a que el modelo está vinculado, la función de observación de searchInput TAMBIÉN llamarádebounceInput
... ¿verdad?Si necesita un enfoque muy minimalista para esto, hice uno (originalmente bifurcado de vuejs-tips para que también sea compatible con IE) que está disponible aquí: https://www.npmjs.com/package/v-debounce
Uso:
Luego en su componente:
fuente
En caso de que necesite aplicar un retraso dinámico con la
debounce
función lodash :Y la plantilla:
NOTA: en el ejemplo anterior, hice un ejemplo de entrada de búsqueda que puede llamar a la API con un retraso personalizado que se proporciona en
props
fuente
Aunque casi todas las respuestas aquí ya son correctas, si alguien está buscando una solución rápida, tengo una directiva para esto. https://www.npmjs.com/package/vue-lazy-input
Se aplica a @input y v-model, admite componentes personalizados y elementos DOM, antirrebote y acelerador.
fuente
Si está usando Vue, también puede usarlo en
v.model.lazy
lugar dedebounce
pero recuerdev.model.lazy
que no siempre funcionará, ya que Vue lo limita para componentes personalizados.Para componentes personalizados debe usar
:value
junto con@change.native
<b-input :value="data" @change.native="data = $event.target.value" ></b-input>
fuente
Si pudieras mover la ejecución de la función antirrebote a algún método de clase, podrías usar un decorador de utils-decorators lib (
npm install --save utils-decorators
):fuente
Podemos hacerlo usando pocas líneas de código JS:
¡Solución simple! Trabajo perfecto! Espero que sea útil para ustedes.
fuente
decorador de propiedades vue
fuente