¿Por qué en el siguiente ejemplo de pseudocódigo Child no se vuelve a procesar cuando Container cambia 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>
}
}
Incluso si llamo forceUpdate()
después de modificar el valor en Contenedor, Child aún muestra el valor anterior.
javascript
html
reactjs
Tuomas Toivonen
fuente
fuente
<Route exact path="/user/:email" component={ListUserMessagePage} />
, un enlace en la misma página actualizará los accesorios sin crear una nueva instancia y ejecutar los eventos habituales del ciclo de vida.Respuestas:
Actualice el hijo para que tenga el atributo 'clave' igual al nombre. El componente se volverá a procesar cada vez que cambie la clave.
fuente
[props.notRenderingArr, props.dummy]
. Si la longitud de la matriz siempre cambia, puede establecer la matriz de dependencia useEffect en[props.notRenderingArr.length]
.key
requisito, frente a solosetState
. Tengo algunos hijos que confían en el estado de los padres, pero no están activando una nueva representación ...Porque los niños no vuelven a rendirse si los accesorios del padre cambian, pero si su ESTADO cambia :)
Lo que está mostrando es esto: https://facebook.github.io/react/tips/communicate-between-components.html
Pasará datos de padre a hijo a través de accesorios, pero no hay lógica de reenvío allí.
Debe establecer algún estado para el padre y luego volver a entregar el niño en el estado de cambio de padre. Esto podria ayudar. https://facebook.github.io/react/tips/expose-component-functions.html
fuente
Yo tuve el mismo problema. Esta es mi solución, no estoy seguro de que sea una buena práctica, dime si no:
UPD: ahora puede hacer lo mismo con React Hooks: (solo si el componente es una función)
fuente
componentDidUpdate
en este caso va en el componente Child.FunctionComponents
él, se actualizarán automáticamente los componentes secundarios si cambian los accesorios.Según la filosofía React, el componente no puede cambiar sus accesorios. deben recibirse de los padres y deben ser inmutables. Solo los padres pueden cambiar los accesorios de sus hijos.
buena explicación sobre estado vs accesorios
también, lea este hilo ¿Por qué no puedo actualizar los accesorios en react.js?
fuente
Deberías usar la
setState
función. De lo contrario, el estado no guardará su cambio, sin importar cómo use forceUpdate.Tu código parece no válido. No puedo probar este código.
fuente
<Child bar={this.state.foo.bar} />
?Cuando cree componentes React de
functions
yuseState
.Esto no funciona
Esto funciona (agregando clave)
fuente
Confirmado, agregar una clave funciona. Revisé los documentos para tratar de entender por qué.
React quiere ser eficiente al crear componentes secundarios. No representará un nuevo componente si es igual a otro elemento secundario, lo que hace que la página se cargue más rápido.
Agregar una clave obliga a React a representar un nuevo componente, restableciendo así el estado para ese nuevo componente.
https://reactjs.org/docs/reconciliation.html#recursing-on-children
fuente
Use la función setState. Entonces podrías hacer
dentro del método de evento de manejo.
Una vez que se actualiza el estado, se activarán los cambios y se volverá a procesar.
fuente
Probablemente debería hacer que el Child sea un componente funcional si no mantiene ningún estado y simplemente presenta los accesorios y luego lo llama desde el padre. Una alternativa a esto es que puede usar ganchos con el componente funcional (useState) que hará que el componente sin estado se vuelva a representar.
Además, no debe alterar los propas ya que son inmutables. Mantener el estado del componente.
fuente
Me encontraba con el mismo problema. Tenía un
Tooltip
componente que estaba recibiendoshowTooltip
apoyo, que estaba actualizando elParent
componente en función de unaif
condición, se estaba actualizando en elParent
componente pero elTooltip
componente no se estaba procesando.El error que estaba haciendo es declarar
showTooltip
como un let.Me di cuenta de lo que estaba haciendo mal. Estaba violando los principios de cómo funciona el renderizado. Reemplazarlo con ganchos hizo el trabajo.
fuente
definir accesorios modificados en mapStateToProps del método de conexión en el componente hijo.
En mi caso, el canal de channelList se actualiza, así que agregué chanelList en mapStateToProps
fuente
este ejemplo se usa
useEffect
para cambiar el estado cuando seprops
cambia.fuente