Saya memiliki kotak input sederhana di template Vue dan saya ingin menggunakan debounce lebih atau kurang seperti ini:
<input type="text" v-model="filterKey" debounce="500">
Namun debounce
properti telah ditinggalkan dalam Vue 2 . Rekomendasi hanya mengatakan: "gunakan v-on: input + fungsi debounce pihak ketiga".
Bagaimana Anda menerapkannya dengan benar?
Saya sudah mencoba mengimplementasikannya menggunakan lodash , v-on: input dan v-model , tetapi saya bertanya-tanya apakah mungkin dilakukan tanpa variabel tambahan.
Dalam template:
<input type="text" v-on:input="debounceInput" v-model="searchInput">
Dalam skrip:
data: function () {
return {
searchInput: '',
filterKey: ''
}
},
methods: {
debounceInput: _.debounce(function () {
this.filterKey = this.searchInput;
}, 500)
}
Filterkey kemudian digunakan kemudian dalam computed
alat peraga.
vue.js
vuejs2
debouncing
MartinTeeVarga
sumber
sumber
Jawaban:
Saya menggunakan paket NPM debounce dan diimplementasikan seperti ini:
Menggunakan lodash dan contoh dalam pertanyaan, implementasinya terlihat seperti ini:
sumber
v-model=your_input_variable
input dan di vue Andadata
. Jadi Anda tidak bergantung padae.target
tetapi gunakan Vue sehingga Anda dapat mengaksesthis.your_input_variable
alih-alihe.target.value
this
dalam fungsi.Menugaskan debounce
methods
bisa menjadi masalah. Jadi alih-alih ini:Anda dapat mencoba:
Ini menjadi masalah jika Anda memiliki beberapa instance komponen - mirip dengan cara
data
seharusnya fungsi yang mengembalikan objek. Setiap instance membutuhkan fungsi debounce sendiri jika mereka harus bertindak secara independen.Berikut ini contoh masalahnya:
sumber
data()
kemudian.diperbarui pada tahun 2020
Opsi 1: Dapat digunakan kembali, tanpa deps
(Disarankan jika diperlukan lebih dari sekali dalam proyek Anda)
helpers.js
Component.vue
Codepen
Opsi 2: Dalam komponen, tanpa deps
(Disarankan jika menggunakan sekali atau dalam proyek kecil)
Component.vue
Codepen
sumber
Sangat sederhana tanpa lodash
sumber
destroyed() { clearInterval(this.timeout) }
agar tidak memiliki batas waktu setelah dihancurkan.Saya memiliki masalah yang sama dan ini adalah solusi yang berfungsi tanpa plugin.
Karena
<input v-model="xxxx">
persis sama dengan(sumber)
Saya pikir saya bisa mengatur fungsi debounce pada penugasan xxxx di
xxxx = $event.target.value
seperti ini
metode:
sumber
@input="update_something"
tindakan, panggil ini setelahthat.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); },
Berdasarkan komentar dan dokumen migrasi yang ditautkan , saya telah membuat beberapa perubahan pada kode:
Dalam template:
Dalam skrip:
Dan metode yang menetapkan kunci filter tetap sama:
Sepertinya ada satu panggilan kurang (hanya
v-model
, dan bukanv-on:input
).sumber
debounceInput()
dua kali untuk setiap perubahan?v-on:
akan mendeteksi perubahan input dan memanggil debounce, DAN karena modelnya terikat, fungsi arloji searchInput juga akan memanggildebounceInput
... benar?Jika Anda memerlukan pendekatan yang sangat minimalis untuk ini, saya membuat satu (awalnya bercabang dari vuejs-tips untuk juga mendukung IE) yang tersedia di sini: https://www.npmjs.com/package/v-debounce
Pemakaian:
Kemudian di komponen Anda:
sumber
Jika Anda perlu menerapkan penundaan dinamis dengan fungsi lodash
debounce
:Dan templat:
CATATAN: pada contoh di atas saya membuat contoh input pencarian yang dapat memanggil API dengan penundaan khusus yang disediakan di
props
sumber
Meskipun hampir semua jawaban di sini sudah benar, jika ada yang mencari solusi cepat saya punya petunjuk untuk ini. https://www.npmjs.com/package/vue-lazy-input
Ini berlaku untuk @input dan v-model, mendukung komponen khusus dan elemen DOM, debounce dan throttle.
sumber
Jika Anda menggunakan Vue, Anda juga bisa menggunakan
v.model.lazy
alih-alihdebounce
mengingatv.model.lazy
tidak akan selalu berfungsi karena Vue membatasinya untuk komponen khusus.Untuk komponen khusus yang harus Anda gunakan
:value
bersama@change.native
<b-input :value="data" @change.native="data = $event.target.value" ></b-input>
sumber
Jika Anda bisa memindahkan eksekusi fungsi debounce ke beberapa metode kelas Anda bisa menggunakan dekorator dari utils-decorators lib (
npm install --save utils-decorators
):sumber
Kita dapat melakukannya dengan menggunakan beberapa baris kode JS:
Solusi sederhana! Bekerja Sempurna! Semoga bermanfaat buat kalian.
sumber
vue-properti-dekorator
sumber