Это связано с тем, что условный рендеринг возвращает две разные древовидные структуры, в которых путь к A
отличается.
React.Fragment
> div
> div
> A
React.Fragment
> div
> A
Представьте, что если мы имитируем React с помощью простого JS, чтобы выполнить монтирование и размонтирование вручную, нам потребуется:
- Сохранить
<A/>
как переменную - Удалить внутренняя
<div/>
(<A/>
также будет автоматически удалена) - Затем добавьте ранее сохраненную
<A/>
во внешнюю <div/>
(что на самом деле также не является хорошим подходом, потому что это предполагает <A/>
никогда не потребуется обновлять себя после монтирования, даже если реквизиты меняются)
Пока есть удаление и добавление, это вполне равносильно тому, что компонент React был размонтирован и затем снова смонтирован.
Код немного расплывчатый, и я не могу сказать, чего он пытается достичь, имея 2 <div/>
s в первом условии и только 1 <div/>
во втором. Но, возможно, вы можете использовать троичные операторы для условного рендеринга именно того, что вам нужно, и оставить <A/>
в покое (и может быть немного CSS, чтобы внутренний <div/>
выглядел так, как будто он вложен в другой <div/>
). Таким образом, <A/>
не будет размонтирован, когда <App/>
изменит состояние.
return (
<>
<div>
<A />
{condition ? // where `condition` is a boolean
<div style={{
position: 'absolute'
// and may be other styles to achieve the visual trickery
}}>
{/* your content here */}
</div>
:
null
}
</div>
<button onClick={this.increment}>re-render</button>
</>
)
Кстати, говорят, 42 - это ответ на все вопросы, но я думаю, что не для этого случая. Установка ключа на 42 не поможет. ?