Por que no exemplo de pseudo-código a seguir o Child não é renderizado novamente quando o Container altera 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>
}
}
Mesmo se eu ligar forceUpdate()
depois de modificar o valor em Container, Child ainda mostra o valor antigo.
javascript
html
reactjs
Tuomas Toivonen
fonte
fonte
<Route exact path="/user/:email" component={ListUserMessagePage} />
, um link na mesma página atualizará os objetos sem criar uma nova instância e executar os eventos usuais do ciclo de vida.Respostas:
Atualize filho para ter o atributo 'chave' igual ao nome. O componente será renderizado novamente sempre que a chave for alterada.
fonte
[props.notRenderingArr, props.dummy]
. Se o comprimento da matriz sempre mudar, você poderá definir a matriz de dependência useEffect como[props.notRenderingArr.length]
.key
necessário, vs apenassetState
? Eu tenho algumas crianças que dependem de estado pais, mas eles não estão provocando uma re-render ...Porque os filhos não são renderizados novamente se os objetos do pai mudarem, mas se o seu ESTADO mudar :)
O que você está mostrando é o seguinte: https://facebook.github.io/react/tips/communicate-between-components.html
Ele transmitirá dados de pai para filho através de adereços, mas não há lógica de renderização lá.
Você precisa definir algum estado para o pai e renderizar novamente o filho no estado de mudança pai. Isso poderia ajudar. https://facebook.github.io/react/tips/expose-component-functions.html
fonte
Eu tive o mesmo problema. Esta é a minha solução, não tenho certeza de que seja uma boa prática, diga-me se não:
UPD: Agora você pode fazer o mesmo usando React Hooks: (somente se o componente for uma função)
fonte
componentDidUpdate
Neste caso, o componente Child.FunctionComponents
ele irá atualizar automaticamente os componentes criança, se a mudança adereços.De acordo com a filosofia React, o componente não pode mudar seus props. eles devem ser recebidos dos pais e devem ser imutáveis. Somente os pais podem mudar os adereços de seus filhos.
boa explicação sobre estado vs adereços
Além disso, leia este tópico Por que não consigo atualizar os adereços no react.js?
fonte
Você deve usar a
setState
função Caso contrário, o estado não salvará sua alteração, não importa como você use o forceUpdate.Seu código parece inválido. Não consigo testar esse código.
fonte
<Child bar={this.state.foo.bar} />
?Quando criar componentes do React a partir de
functions
euseState
.Isso não funciona
Isso funciona (adicionando chave)
fonte
Confirmado, adicionar uma chave funciona. Analisei os documentos para tentar entender o porquê.
O React quer ser eficiente ao criar componentes filhos. Ele não renderizará um novo componente se for igual a outro filho, o que torna a página carregada mais rapidamente.
A adição de uma chave força o React para renderizar um novo componente, redefinindo o estado desse novo componente.
https://reactjs.org/docs/reconciliation.html#recursing-on-children
fonte
Use a função setState. Então você poderia fazer
dentro do método de evento handle.
Uma vez atualizado, o estado acionará as alterações e a re-renderização ocorrerá.
fonte
Você provavelmente deve tornar o Child como componente funcional se ele não mantiver nenhum estado e simplesmente renderizar os objetos e depois chamá-lo do pai. Uma alternativa para isso é que você pode usar ganchos com o componente funcional (useState), que fará com que o componente sem estado seja renderizado novamente.
Além disso, você não deve alterar os propas, pois eles são imutáveis. Mantenha o estado do componente.
fonte
Eu estava encontrando o mesmo problema. Eu tinha um
Tooltip
componente que estava recebendoshowTooltip
prop, que estava atualizando noParent
componente com base em umaif
condição, estava sendo atualizado noParent
componente, mas oTooltip
componente não estava sendo renderizado.O erro que eu estava cometendo é declarar
showTooltip
uma permissão.Percebi que o que estava fazendo de errado estava violando os princípios de como a renderização funciona. Substituí-la por ganchos fez o trabalho.
fonte
defina adereços alterados em mapStateToProps do método connect no componente filho.
No meu caso, o canal de channelList é atualizado, então eu adicionei chanelList em mapStateToProps
fonte