Компонент React размонтируется при рендеринге с тем же ключом

В соответствии с этим связь вы можете избежать размонтирования компонента, используя тот же ключ. В этом примере я использую один и тот же ключ, но компонент каждый раз отключается. Что я делаю неправильно?

class Component1 extends React.Component{

  componentDidMount(){console.info('componentDidMount');}
  componentWillUnmount(){console.info('componentWillUnmount');}


  render(){

      console.info('render component1');
      return <div></div>;
  }


}

class App extends Component {

  flag = true;

  action1 = ()=>{
      this.forceUpdate();
  }

  render() {
    console.info('render App');
      if (this.flag){
        this.flag = false;
          return (<div>
            <Component1 key = "kaka"/>
            <button onClick = {this.action1}>Click me</button>
          </div>);
      }
      else{
        this.flag = true;
        return (<span>
            <Component1 key = "kaka"/>
            <button onClick = {this.action1}>Click me</button>
          </span>);
      }

  }
}

Что делает forceUpdate()?

AlexZvl 24.03.2019 01:46

Каковы ваши реальные намерения или вариант использования? У вас очень банальный пример. Пожалуйста, помогите понять обзор проблемы, иначе это может привести к проблеме XY. Использование свойства экземпляра this.flag слишком подозрительно, и в большинстве случаев вы не хотите устанавливать его в методе рендеринга.

Tyro Hunter 24.03.2019 01:53
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
2
869
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш key не имеет значения, потому что родитель меняется внутри вашего renderdiv на span или наоборот).

По Документация по примирению React:

The algorithm will not try to match subtrees of different component types. If you see yourself alternating between two component types with very similar output, you may want to make it the same type. In practice, we haven’t found this to be an issue.

Автор сообщения на Medium, кажется, предполагает обратное. Я не верю, что это правильно. Использование key предполагает стабильность при изменении дерева, но, как отмечалось выше, React не беспокоится о согласовании поддеревьев при изменении типа компонента.

В ссылке говорится: если есть какой-либо компонент, который будет одинаковым (или согласованным), даже если родительский узел будет изменен. Мы можем намекнуть реакции на сохранение существующего экземпляра компонента, предоставив «ключевые» реквизиты, чтобы его можно было спасти от размонтирования, как показано во фрагменте ниже на рисунке.

user10803328 24.03.2019 12:19

Насколько мне известно, изменение родительского узла не равнозначно замене его другим типом.

coreyward 24.03.2019 17:45

Да, но если вы видите изображение, оно говорит, что при изменении родительского узла и предоставлении ключа дочернему элементу дочерний элемент не отображается. Статья неверна?

user10803328 24.03.2019 18:07

@Dolby Похоже, он неправильно понял документацию React, да. Я предоставил дополнительную информацию и ссылку на документы сверки.

coreyward 24.03.2019 20:08

Другие вопросы по теме