Ответ 1
Составьте примерный код, ваш component2
не будет уничтожен и снова заново установлен.
React будет запускать любые render
и, возможно, другие методы жизненного цикла, но
React будет Обновить компонент в DOM на месте.
Возможно, ваш код более сложный. Который вызывает реакцию на мысль, что вы не перерисовываете component2
, а вместо этого пытаетесь отобразить совершенно новый компонент. Но опять же, из вашего примера кода это неясно.
Вы можете найти доказательство концепции codepen здесь, которая делает следующее:
- Он отображает 2 экземпляра
component2
с зеленым фоном. - Кнопка может (незаконно) менять цвет фона первого компонента на красный, за пределами реагировать на знания.
- Нажав кнопку, реакция будет повторно отображать 2 компонента.
- Цвет фона остается красным, что является доказательством того, что реагирует только на компонент обновления и не уничтожает.
React будет не reset цвет фона зеленым, потому что реакция думает (из своего виртуального DOM), что цвет фона неизменен и все еще зеленый.
UPDATE: теперь код содержит дополнительные доказательства того, как это может произойти:
- если вы измените тип возвращаемого HTML (от элемента
<p>
до элемента<h1>
в доказательстве концепции) - response НЕ распознает его как один и тот же элемент и уничтожает оригинал и вставляет новый элемент.
PS: потому что ваш примерный код создает компонент через вызов метода, любые методы жизненного цикла (например, shouldComponentUpdate
) НЕ должны применяться. Рендеринг компонентов с помощью методов должен выполняться только для простых компонентов, то есть для элементов реакции. См. официальные документы здесь:
A ReactElement - это легкий, безстоящий, неизменный, виртуальный представление элемента DOM.