Задать вопрос
MrGobus
@MrGobus
Иван

Как сделать принудительно обновление компонента при вызове setState()?

История какая, для отображения вложенных страниц я использую следующую конструкцию.
class Screen extends Componen {
  constructor(props) { 
    super(props)

    this.state = {
      screen: undefined
    }
  }

  render() {
    return this.state.screen ? this.state.screen : <div className="content">
    </div>
  }
}


Далее вызовом
this.setState({screen: <MyMyComponenr/>})
можно менять страницу, она удобно перерисовывается, и все было бы хорошо если бы не одно маленькое но. Если screen ранее был установлен в такой же компонент, то он не перерисовывается при казалось бы присвоении нового компонента.
Нашел выход в виде следующего костыля:
this.setState({screen: undefined}, ()=>{
    this.setState({
      screen: <ShowScreen />
    })
  })
}}

Но, что-то мне подсказывает, что я в чем то неправ.
Если ли какой то способ указать реакту, что это новый компонент, и что его надо рендерить заново.
  • Вопрос задан
  • 4920 просмотров
Подписаться 1 Средний 5 комментариев
Пригласить эксперта
Ответы на вопрос 2
@davidnum95
this.setState({ screen: <Random key={Math.random()} /> });

Не благодари.
Ответ написан
miraage
@miraage
Старый прогер
Что происходит. Реакт понимает, что надо отрендерить один и тот же компонент, поэтому он его не пересоздаёт. Если Вы добавите метод componentDidUpdate, то увидите, что он вызывается – Реакт переиспользует существующий инстанс компонента.
Проблема в том, что это так себе подход в React. Чтобы, на мой взгляд, более лаконично написать этот пример в React way – надо немного исправить отвественность каждого компонента.
https://codesandbox.io/s/2vl0801r6r
Ответ написан
Ваш ответ на вопрос

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

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