Я основний автор модуля віртуального дому , тому я можу відповісти на ваші запитання. Насправді є дві проблеми, які тут потрібно вирішити
- Коли я повторно візуалізую? Відповідь: Коли я помічаю, що дані брудні.
- Як я можу ефективно відреагувати? Відповідь: Використання віртуального DOM для генерації реального патчу DOM
У React кожен ваш компонент має стан. Цей стан схожий на спостереження, яке ви можете знайти в нокауті або інших бібліотеках стилів MVVM. По суті, React знає, коли потрібно відредагувати сцену, оскільки він може спостерігати, коли ці дані змінюються. Брудна перевірка відбувається повільніше, ніж спостерігається, оскільки ви повинні регулярно опитувати дані та рекурсивно перевіряти всі значення в структурі даних. Для порівняння, встановлення значення стану сигналізуватиме слухачеві про те, що деякий стан змінився, тому React може просто прослухати події зміни у стані та встановити чергу до повторного відтворення.
Віртуальний DOM використовується для ефективного відтворення DOM. Це насправді не пов’язано з брудною перевіркою даних. Ви можете повторно відтворити, використовуючи віртуальний DOM з брудною перевіркою або без неї. Ви маєте рацію в тому, що в обчисленні різниці між двома віртуальними деревами існує деяка накладні витрати, але віртуальна DOM-різниця полягає в розумінні того, що потребує оновлення в DOM, а не в тому, змінилися чи не ваші дані. Насправді алгоритм diff - це сама брудна перевірка, але вона використовується, щоб перевірити, чи замість цього DOM брудний.
Ми прагнемо відновити віртуальне дерево лише тоді, коли стан зміниться. Тож використання спостережуваної для перевірки, чи змінився стан, є ефективним способом запобігання непотрібних повторних проявів, що може спричинити багато непотрібних дерев. Якщо нічого не змінилося, ми нічого не робимо.
Віртуальний DOM приємний тим, що дозволяє нам писати наш код так, ніби ми рендерируем всю сцену. За лаштунками ми хочемо обчислити патч-операцію, яка оновлює DOM так, щоб ми очікували. Тож хоча алгоритм віртуального DOM diff / patch, мабуть, не є оптимальним рішенням , він дає нам дуже приємний спосіб виразити наші програми. Ми просто заявляємо, що саме хочемо, і React / virtual-dom розробить, як зробити так, щоб ваша сцена виглядала так. Нам не потрібно робити ручні маніпуляції з DOM або плутатись з попереднім станом DOM. Нам також не доведеться відтворювати всю сцену, що може бути набагато менш ефективно, ніж її виправлення.