Saya telah menggunakan Vue untuk sementara waktu, dan pengalaman saya selalu menjadi metode yang akan menghitung ulang jika data reaktif yang mendasarinya diperbarui. Saya mengalami informasi yang saling bertentangan pada SO:
- Saya mencoba menjawab pertanyaan ini , dan diberi tahu berulang kali bahwa ini bukan masalahnya.
- Jawaban yang diterima di sini menunjukkan bahwa "[metode] hanya akan dievaluasi ketika Anda secara eksplisit menyebutnya."
Saya mencari di dokumen dan saya tidak melihat sesuatu yang sangat jelas.
Jika mereka tidak reaktif, lalu mengapa contoh ini berfungsi?
<ul>
<li v-for="animal in animals" :key="animal.id">
<span v-if="isAwesome(animal)">{{ animal.name }}</span>
</li>
</ul>
export default {
data() {
return {
awesomeAnimalIds: [],
animals: [
{ id: 1, name: 'dog' },
{ id: 5, name: 'cat' },
{ id: 9, name: 'fish' },
],
};
},
created() {
setTimeout(() => {
this.awesomeAnimalIds.push(5);
}, 1000);
setTimeout(() => {
this.awesomeAnimalIds.push(9);
}, 2000);
},
methods: {
isAwesome(animal) {
return this.awesomeAnimalIds.includes(animal.id);
},
},
};
Saya benar - benar ingin memiliki jawaban yang pasti dan memuaskan yang dapat dirujuk oleh komunitas ini.
Jawaban:
Berdasarkan Bagaimana Perubahan Dilacak dari dokumen, inilah yang terjadi:
Watcher khusus dibuat untuk instance komponen untuk menentukan kapan re-render diperlukan.
Vue mengubah semua properti
data
menjadi getter dan setter.isAwesome
dibuat dari templat.isAwesome
, pengambil untukawesomeAnimalIds
dipanggil.awesomeAnimalIds
bidangdata
.awesomeAnimalIds
diperbarui, yang memanggilawesomeAnimalIds
setter.data
bidang yang menerima pemberitahuan, re-render dipicu.Dari contoh ini dan ini di atas, kita dapat menyimpulkan yang berikut:
Ada kesalahpahaman umum bahwa metode "dipanggil hanya sekali" atau "jalankan dan lupakan" ketika dipanggil dari templat. Ini jelas tidak selalu terjadi karena metode dapat membangun ketergantungan reaktif .
Jadi kapan kita harus menggunakan properti yang dikomputasi vs sebuah metode?
Lihat bagian panduan tentang Caching Terkomputasi vs Metode . Inilah pendapat saya:
fetch
dari mereka.sumber
Tidak, metode tidak reaktif. Hanya data yang dapat reaktif dalam Vue.
TAPI penting untuk memahami bagaimana Vue bekerja ...
data()
anggota (ia melakukan ini setiap saat, tidak hanya selama render pertama). Jika ada data yang diakses selama render, Vue tahu bahwa konten anggota data ini memengaruhi hasil rendering.Tidak masalah jika Anda mereferensikan anggota data secara langsung, menggunakannya dalam
computed
atau dalam amethod
. Jika data "disentuh" selama proses render, perubahan data akan memicu render ulang di masa mendatang ...sumber
Ini adalah kasus yang sangat menarik.
Dari apa yang telah saya baca dan pengalaman saya, saya dapat mengatakan bahwa: Tidak, metode pada dasarnya tidak reaktif. Suatu metode harus secara eksplisit dipanggil untuk dieksekusi.
Tapi, bagaimana saya bisa menjelaskan kasus Anda? Saya memasukkan kode Anda di kotak pasir dan tentu saja, ketika Anda mendorong id ke dalam array, template memperbarui untuk menampilkan nama hewan. Ini akan menunjukkan beberapa reaktivitas. Apa yang menyebabkannya?
Ya, saya menjalankan percobaan. Saya menambahkan sederhana
div
untuk setiap loop yang menghasilkan angka acak ketika dibuat.Dan yang saya lihat adalah bahwa setiap kali id baru didorong ke dalam array, semua angka acak akan berubah. Ini adalah kunci untuk memahami mengapa "tampaknya" seolah-olah metode
isAwesome
ini reaktif.Entah bagaimana, ketika ID baru didorong ke array, Vue membuat ulang loop secara keseluruhan, karenanya mengeksekusi metode lagi. Saya tidak dapat menjelaskan cara kerja bagian dalam mengapa vue mengubah seluruh loop, yang akan membutuhkan penelitian lebih lanjut.
Jadi, untuk menjawab pertanyaanmu.
isAwesome
tidak reaktif, itu hanya ilusi yang diciptakan oleh re-render loop.sumber
update
yang menyebabkanre-render
dan memicu metode apa pun yang terikat dalam template