Descargo de responsabilidad : cuando respondí esta pregunta, estaba aprendiendo / tratando de implementar Vanilla Flux y estaba un poco escéptico al respecto. Más tarde, migré todo a Redux. Entonces, un consejo: simplemente elija Redux o MobX. Lo más probable es que ya no necesite la respuesta a esta pregunta (a excepción de la ciencia).
Pasar el estado inicial a un componente como a prop
es un anti-patrón porque el getInitialState
método solo se llama la primera vez que se procesa el componente. Lo que significa que, si vuelve a renderizar ese componente pasando un valor diferente como a prop
, el componente no reaccionará en consecuencia, porque el componente mantendrá el estado de la primera vez que se renderizó. Es muy propenso a errores.
Y esto es lo que debe hacer:
Intente hacer que sus componentes sean lo más apátridas posible. Los componentes sin estado son más fáciles de probar porque generan una salida basada en una entrada . Tan simple como eso.
Pero bueno ... los datos de mis componentes cambian ... no puedo convertirlos en apátridas
Sí, puede, para la mayoría de ellos. Para hacer eso, seleccione un componente externo para que sea el titular del estado. Usando su ejemplo, podría crear un Dashboard
componente que contenga los datos y un Widget
componente que sea completamente sin estado. El Dashboard
es responsable de obtener todos los datos y luego renderizar múltiples Widgets
que reciben todo lo que necesitan props
.
Pero mis widgets tienen algún estado ... el usuario puede configurarlos. ¿Cómo puedo convertirlos en apátridas?
Su Widget
puede exponer a eventos que, cuando se maneja, hacen que el estado contenida en Dashboard
el cambio, haciendo que todos los Widget
que se rerendered. Creas "eventos" en tu Widget
al hacer props
que reciban una función.
Bien, ahora Dashboard mantiene el estado, pero ¿cómo le paso el estado inicial?
Tienes dos opciones. La más recomendada es que hagas una llamada Ajax en el Dashboard
getInitialState
método para obtener el estado inicial del servidor. También puede usar Flux , que es una forma más sofisticada de administrar datos. Flux es más un patrón que una implementación. Puede usar Flux puro con la implementación de Facebook del Dispatcher
, pero puede usar implementaciones de terceros como Redux , Alt o Fluxxor .
Alternativamente, puede pasar este estado inicial como prop
a al Dashboard
, declarando explícitamente que este es solo el estado inicial ... como initialData
, por ejemplo. Sin embargo, si elige esta ruta, no puede pasarle un estado inicial diferente hacia adelante, porque "recordará" el estado después del primer renderizado.
OBS
No tiene mucha razón en sus definiciones.
El estado se usa para almacenar datos mutables, es decir, datos que van a cambiar durante el ciclo de vida del componente. Los cambios en el estado deben realizarse a través del setState
método y harán que el componente vuelva a renderizarse.
Los accesorios se utilizan para pasar datos imutables a los componentes. No deben cambiar durante el ciclo de vida del componente. Los componentes que solo usan accesorios no tienen estado.
Esta es una fuente relevante sobre "cómo pasar el estado inicial a los componentes".