Cara terbaik adalah membandingkan React (deklaratif) dan JQuery (imperatif) untuk menunjukkan perbedaannya.
Di React, Anda hanya perlu mendeskripsikan status akhir UI Anda dalam render()
metode, tanpa mengkhawatirkan cara beralih dari status UI sebelumnya ke status UI baru. Misalnya,
render() {
const { price, volume } = this.state;
const totalPrice = price * volume;
return (
<div>
<Label value={price} className={price > 100 ? 'expensive' : 'cheap'} ... />
<Label value={volume} className={volume > 1000 ? 'high' : 'low'} ... />
<Label value={totalPrice} ... />
...
</div>
)
}
Di sisi lain, JQuery mengharuskan Anda untuk mentransisikan status UI Anda secara imperatif, misalnya, memilih elemen label dan memperbarui teks dan CSS-nya:
updatePrice(price) {
$("#price-label").val(price);
$("#price-label").toggleClass('expansive', price > 100);
$("#price-label").toggleClass('cheap', price < 100);
updateTotalPrice();
...
}
updateVolume(volume) {
$("#volume-label").val(volume);
$("#volume-label").toggleClass('high', volume > 1000);
$("#volume-label").toggleClass('low', volume < 1000);
updateTotalPrice();
...
}
updateTotalPrice() {
const totalPrice = price * volume;
$("#total-price-label").val(totalPrice);
...
}
Dalam skenario dunia nyata, akan ada lebih banyak elemen UI yang akan diperbarui, ditambah atributnya (misalnya, gaya CSS, dan pendengar acara), dll. Jika Anda melakukan ini secara imperatif dengan menggunakan JQuery, ini akan menjadi rumit dan membosankan; mudah untuk lupa memperbarui beberapa bagian UI, atau lupa menghapus penangan kejadian lama (menyebabkan kebocoran memori atau penangan aktif beberapa kali), dll. Di sinilah bug terjadi, yaitu, status UI dan status model tidak aktif sinkronisasi.
Status tidak sinkron tidak akan pernah terjadi pada pendekatan deklaratif React, karena kita hanya perlu mengupdate status model, dan React bertanggung jawab untuk menjaga agar UI dan status model tetap sinkron.
- Di bawah kendali, React akan memperbarui semua elemen DOM yang diubah menggunakan kode imperatif.
Anda juga dapat membaca jawaban saya untuk Apa perbedaan antara pemrograman deklaratif dan imperatif? .
PS: dari contoh jQuery di atas, Anda mungkin berpikir bagaimana jika kita meletakkan semua manipulasi DOM dalam sebuah updateAll()
metode, dan memanggilnya setiap kali ketika salah satu status model kita berubah, dan UI tidak akan pernah tidak sinkron. Anda benar, dan inilah yang secara efektif dilakukan React, satu-satunya perbedaan adalah bahwa jQuery updateAll()
akan menyebabkan banyak manipulasi DOM yang tidak perlu, tetapi React hanya akan memperbarui elemen DOM yang diubah menggunakan Virtual DOM Diffing Algorithm .
Imperative programming: telling the "machine" how to do something, and as a result what you want to happen will happen. Declarative programming: telling the "machine"1 what you would like to happen, and let the computer figure out how to do it.