Aby pokazać różnice, najlepiej porównać React (deklaratywny) i JQuery (imperatyw).
W Reakcie wystarczy opisać końcowy stan interfejsu użytkownika w render()metodzie, nie martwiąc się o przejście z poprzedniego stanu interfejsu użytkownika do nowego stanu interfejsu użytkownika. Na przykład,
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>
)
}
Z drugiej strony, JQuery wymaga, abyś koniecznie zmienił stan interfejsu użytkownika, np. Wybierając elementy etykiety i aktualizując ich tekst i CSS:
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);
...
}
W prawdziwym scenariuszu będzie o wiele więcej elementów interfejsu użytkownika do zaktualizowania, a także ich atrybuty (np. Style CSS i nasłuchiwanie zdarzeń) itp. Jeśli zrobisz to bezwzględnie za pomocą JQuery, stanie się to skomplikowane i żmudne; łatwo zapomnieć o zaktualizowaniu niektórych części interfejsu użytkownika lub zapomnieć o usunięciu starych programów obsługi zdarzeń (powoduje to wyciek pamięci lub wielokrotne uruchamianie procedury obsługi) itd. To jest miejsce, w którym pojawiają się błędy, np. stan UI i stan modelu są poza synchronizacja.
Stany niezsynchronizowane nigdy nie zdarzają się w deklaratywnym podejściu Reacta, ponieważ musimy tylko zaktualizować stan modelu, a React jest odpowiedzialny za utrzymanie synchronizacji interfejsu użytkownika i stanu modelu.
- Pod hakiem, React zaktualizuje wszystkie zmienione elementy DOM za pomocą bezwzględnego kodu.
Możesz również przeczytać moją odpowiedź na pytanie Jaka jest różnica między programowaniem deklaratywnym i imperatywnym? .
PS: z powyższego przykładu jQuery, możesz pomyśleć, co by było, gdybyśmy umieścili wszystkie manipulacje DOM w updateAll()metodzie i wywołali ją za każdym razem, gdy zmieni się którykolwiek z naszych stanów modelu, a interfejs użytkownika nigdy nie będzie zsynchronizowany. Masz rację i to właśnie robi React, jedyną różnicą jest to, że jQuery updateAll()spowoduje wiele niepotrzebnych manipulacji DOM, ale React zaktualizuje tylko zmienione elementy DOM, używając swojego algorytmu Virtual DOM Diffing .
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.