johnymkp
@johnymkp

Как react различает компоненты, находящиеся в одной позиции UI-дерева?

В документации по реакту написано, что он сопоставляет состояние и компонент, основываясь на позиции компонента в итоговом UI-дереве. Т.е. если некий компонент оказывается в одном и том же месте, то стало быть это считается один и тот же компонент и вот его состояние. Подчеркивается, что важна именно позиция в итоговом дереве, а JSX как бы и не важен (хотя как он может быть не важен, если именно на основе него строится дерево).

Я написал пару примеров на основе этой информации. Пример 1. Тут счетчик оказывается на одном и тот же месте и при его переименовании состояние сохраняется.

Но вот Пример 2. Написан по аналогии с этим примером из документации. Здесь счетчик при переименовании сбрасывается.

Не очень понимаю почему? В обоих случаях счетчик оказывается на первом месте в дереве и завернут в . Есть смутные подозрения, что дело в том, что в первом примере один блок, а втором два блока и поэтому там счетчики считаются разными компонентами. Но тогда это не вяжется с утверждением, что значение имеет только позиция в итоговом дереве.
  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
Alexandroppolus
@Alexandroppolus
кодир
пример 1:
<>
      {
        rename ? (
          <div><Counter title='Щелкунчик' /></div>
        ) : (
          <div><Counter title='Counter' /></div>
        )
      }
      <button onClick={() => setRename(!rename)}>Переименовать</button>
    </>


здесь у тебя первым чилдом в реактФрагменте всегда будут одни и те же фигурные скобки (да, это как бы отдельная нода в дереве реакта). В них всегда первый чилд - div (реакт определяет, что это один и тот же тип элемента), а в нем - Counter (снова определяемый как один и тот же). Потому для div и Counter не происходит перемонтирования, а только обновление пропсов.

пример 2:
<>
      { rename && <div><Counter title='Щелкунчик' /></div> }
      { !rename && <div><Counter title='Counter' /></div> }
      <button onClick={() => setRename(!rename)}>Переименовать</button>
    </>

здесь у Фрагмента первый и второй чилды - фигурные скобки (т.е. это два разных независимых чилда). Ну и соответственно, в них то появляются, то исчезают свои чилды (элементы div с чилдом Counter), тут никаких связей между оными элементами из разных фигурных скобок не устанавливается.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы