Farklılıkları göstermek için React (bildirimsel) ve JQuery'yi (zorunlu) karşılaştırmak en iyisidir.
React'te, render()
önceki UI durumundan yeni UI durumuna nasıl geçeceğiniz konusunda endişelenmeden, yalnızca yöntemdeki UI'nizin son durumunu tanımlamanız gerekir . Örneğin,
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>
)
}
Öte yandan, JQuery, kullanıcı arayüzü durumunuzu zorunlu olarak değiştirmenizi gerektirir, örneğin, etiket öğelerini seçip metin ve CSS'yi güncellemenizi:
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);
...
}
Gerçek dünya senaryosunda, güncellenecek çok daha fazla UI öğesi ve bunların özellikleri (örneğin, CSS stilleri ve olay dinleyicileri) vb. Olacaktır. Bunu zorunlu olarak JQuery kullanarak yaparsanız, karmaşık ve sıkıcı hale gelecektir; kullanıcı arayüzünün bazı kısımlarını güncellemeyi unutmak veya eski olay işleyicilerini kaldırmayı unutmak kolaydır (bellek sızıntısına veya işleyicinin birden çok kez ateşlenmesine neden olur) vb. sync.
Senkronize olmayan durumlar, React'in bildirimsel yaklaşımına asla gelmeyecektir, çünkü yalnızca model durumunu güncellememiz gerekir ve React, UI ve model durumlarını senkronize tutmaktan sorumludur.
- Kancanın altında, React, zorunlu kodu kullanarak tüm değiştirilmiş DOM öğelerini güncelleyecektir.
Bildirime dayalı ve zorunlu programlama arasındaki fark nedir? İçin cevabımı da okuyabilirsiniz. .
Not: Yukarıdaki jQuery örneğinden, tüm DOM manipülasyonlarını bir updateAll()
yönteme koyarsak ve model durumumuzdan herhangi biri değiştiğinde her seferinde çağırırsak ve kullanıcı arabirimi hiçbir zaman uyumsuz olmayacak diye düşünebilirsiniz . Haklısınız ve React'in yaptığı etkili bir şekilde bu, tek fark jQuery'nin updateAll()
birçok gereksiz DOM manipülasyonuna neden olacağı, ancak React yalnızca Sanal DOM Ayırma Algoritmasını kullanarak değiştirilen DOM öğelerini güncelleyecektir .
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.