Elevando el estado
Hay veces que necesitamos "compartir" el estado de un componente, ya sea los mismo valores o los métodos que lo modifican. Cuando pasa esto, tenemos que hacer algo que en React se conoce como "elevar el estado". La idea básica es sacar el estado y los métodos de un componente, y "subirlos" a un componente superior o padre. De esta forma, este componente padre puede ahora "compartir" el estado con otros componentes hijos. Esto respeta dos filosofías muy importantes de React:
- Una única fuente de la verdad: Significa que el estado de una cierta sección de una aplicación debería estar guardado en único lugar (un componente), y esa "verdad" sólo puede ser modificada desde la fuente. De esta forma, se evitan conflictos de discrepancias que pueden darse al tener distintas fuentes para una única "verdad".
- Flujo de datos de arriba a hacia abajo: Implica que la información (el estado) se distribuye de los componentes hacia sus hijos. Es decir, tiene una única dirección. Esto facilita mucho a la hora de pensar en la estructura de la aplicación.
Entonces, un estado se encuentra en un componente. Cualquier cambio de ese estado sólo puede afectar a sus componentes hijos. Modificar el estado de ese componente nunca afectará a sus componentes padres o hermanos, únicamente a sus hijos.
Por eso, cuando necesitamos que el estado de un componente afecte a un componente hermano, tenemos que subirlo al componente padre. Ese componente puede luego pasar el estado a sus componentes hijos, por más que no haga uso propio del mismo.
Supongamos que tenemos una aplicación con los siguientes componentes
.--A--.| |.--B--. C| |D E
Componente A es el componente raíz, y tiene dos hijos, B y C. B a su vez tiene dos hijos más, D y E.
Sigamos suponiendo que tenemos un cierto estado X en el componente E, del cual el componente D necesita también saber del mismo. Deberíamos elevar el estado X al componente B, porque es el ancestro común más inmediato entre D y E. Subirlo a A sería innecesario, por C no tiene que saber al respecto.
.--A--.| || C.--B--. <------- X debería estar acá, si| |D E .-- sólo D y E tienen que saber de este^ ^ ||_____|______|
No es necesario que B use el estado X, sólo necesita poder compartirlo a sus componentes hijos.
Si en cambio el componente C y el componente D necesitan saber de dicho estado, tendríamos que elevarlo al componente A.
.--A--. <---- X debería estar acá, si| || C <---- sólo C y D necesitan saber de este.--B--. || | |D E |^ ||____________|
En este caso, A sólo derivaría el estado a sus componentes hijos, y si bien B lo recibiría, sólo se encargaría de pasarlo a el componente D.