Найкраще порівняти React (декларативний) та JQuery (імперативний), щоб показати вам відмінності.
У React вам потрібно лише описати остаточний стан вашого інтерфейсу в render()
методі, не турбуючись про те, як перейти з попереднього стану інтерфейсу в новий стан інтерфейсу. Наприклад,
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>
)
}
З іншого боку, JQuery вимагає від вас імперативного переходу стану вашого інтерфейсу, наприклад, вибору елементів мітки та оновлення їх тексту та 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);
...
}
У реальному сценарії буде набагато більше елементів інтерфейсу, які потрібно оновити, а також їх атрибути (наприклад, стилі CSS та прослуховувачі подій) тощо. Якщо ви зробите це імперативно за допомогою JQuery, це стане складним та нудним; легко забути оновити деякі частини інтерфейсу користувача або забути видалити старі обробники подій (викликати витік пам'яті або обробник обробляється кілька разів) і т. д. Тут виникають помилки, тобто стан інтерфейсу та стан моделі поза синхронізація.
Синхронізовані стани ніколи не трапляться з декларативним підходом React, оскільки нам потрібно лише оновити стан моделі, а React відповідає за синхронізацію інтерфейсу користувача та стану моделі.
- Під гачком React оновить всі змінені елементи DOM, використовуючи імперативний код.
Ви також можете прочитати мою відповідь на тему: Яка різниця між декларативним та імперативним програмуванням? .
PS: зверху на прикладі jQuery, ви можете подумати, що, якщо ми покладемо всі маніпуляції з DOM у updateAll()
метод, і будемо викликати його кожного разу, коли будь-який стан нашої моделі змінюється, і інтерфейс користувача ніколи не буде несинхронізованим. Ви маєте рацію, і це фактично те, що робить React, єдина різниця полягає в тому, що jQuery updateAll()
спричинить багато непотрібних маніпуляцій DOM, але React буде оновлювати лише змінені елементи DOM, використовуючи свій віртуальний алгоритм 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.