Почему в следующем примере псевдокода Child не выполняет повторную визуализацию, когда Контейнер изменяет foo.bar?
Container {
handleEvent() {
this.props.foo.bar = 123
},
render() {
return <Child bar={this.props.foo.bar} />
}
Child {
render() {
return <div>{this.props.bar}</div>
}
}
Даже если я позвоню forceUpdate()
после изменения значения в контейнере, Child все равно покажет старое значение.
javascript
html
reactjs
Туомас Тойвонен
источник
источник
<Route exact path="/user/:email" component={ListUserMessagePage} />
, ссылка на той же странице обновит реквизиты без создания нового экземпляра и запуска обычных событий жизненного цикла.Ответы:
Обновите дочерний элемент, чтобы атрибут 'key' был равен имени. Компонент будет перерисовываться каждый раз при изменении ключа.
источник
[props.notRenderingArr, props.dummy]
. Если длина массива всегда изменяется, вы можете установить для массива зависимостей useEffect значение[props.notRenderingArr.length]
.key
обязательно, а когда простоsetState
? У меня есть дети, которые полагаются на состояние родителей, но не запускают повторную визуализацию ...Потому что потомки не перерисовываются, если свойства родителя меняются, но если изменяется его СОСТОЯНИЕ :)
Вы показываете следующее: https://facebook.github.io/react/tips/communicate-between-components.html
Он будет передавать данные от родителя к потомку через реквизиты, но здесь нет логики перерисовки.
Вам нужно установить какое-то состояние для родителя, а затем повторно отобразить дочерний элемент в состоянии изменения родителя. Это могло помочь. https://facebook.github.io/react/tips/expose-component-functions.html
источник
У меня такая же проблема. Это мое решение, я не уверен, что это хорошая практика, скажите мне, если нет:
UPD: Теперь то же самое можно делать с помощью React Hooks: (только если компонент - это функция)
источник
componentDidUpdate
этом случае идет в дочерний компонент.FunctionComponents
нем будут автоматически обновляться дочерние компоненты, если свойства изменятся.Согласно философии React, компонент не может менять свои свойства. они должны быть получены от родителя и должны быть неизменными. Только родитель может изменять свойства своих потомков.
красивое объяснение состояния и реквизита
также прочтите эту ветку Почему я не могу обновить реквизиты в react.js?
источник
Вам следует использовать
setState
функцию. В противном случае состояние не сохранит ваше изменение, независимо от того, как вы используете forceUpdate.Ваш код кажется недействительным. Я не могу протестировать этот код.
источник
<Child bar={this.state.foo.bar} />
?При создании компонентов React из
functions
иuseState
.Это не работает
Это работает (добавление ключа)
источник
Подтверждено, добавление ключа работает. Я просмотрел документацию, чтобы попытаться понять, почему.
React хочет быть эффективным при создании дочерних компонентов. Он не будет отображать новый компонент, если он такой же, как другой дочерний элемент, что ускоряет загрузку страницы.
Добавление ключа заставляет React отрисовывать новый компонент, таким образом сбрасывая состояние для этого нового компонента.
https://reactjs.org/docs/reconciliation.html#recursing-on-children
источник
Используйте функцию setState. Так ты мог бы сделать
внутри метода обработки события.
Как только состояние будет обновлено, оно вызовет изменения, и произойдет повторный рендеринг.
источник
Вероятно, вам следует сделать Child как функциональный компонент, если он не поддерживает какое-либо состояние и просто отображает реквизиты, а затем вызывает его из родителя. Альтернативой этому является то, что вы можете использовать хуки с функциональным компонентом (useState), что приведет к повторной визуализации компонента без состояния.
Также не следует изменять пропа, поскольку они неизменяемы. Поддерживать состояние компонента.
источник
Я столкнулся с той же проблемой. У меня есть
Tooltip
компонент, который получалshowTooltip
опору, которую я обновлял дляParent
компонента на основеif
условия, он обновлялся вParent
компоненте, ноTooltip
компонент не отображался.Ошибка, которую я сделал, - это объявление о сдаче
showTooltip
в аренду.Я понял, что делаю неправильно. Я нарушал принципы работы рендеринга. Замена хуков сработала.
источник
определить измененные свойства в mapStateToProps метода подключения дочернего компонента.
В моем случае канал channelList обновлен, поэтому я добавил chanelList в mapStateToProps
источник
в этом примере используется
useEffect
для изменения состояния приprops
изменении.источник