Entonces, comencemos preguntando, ¿qué es el renderizado? El renderizado es el proceso de React pidiendo a tus componentes que describan cómo quieren que se vea la UI ahora, basado en sus props y estado actuales. Y luego tomando eso y aplicando las actualizaciones necesarias al DOM.
Ahora voy a hablar en términos de React, DOM, y la web, pero los mismos principios se aplican para cualquier otro renderizado de React, como React Native o React 3 Fiber. Cuando escribimos componentes, los hacemos devolver etiquetas JSX como ángulos de soporte, mi componente. En tiempo de compilación, estos se convierten en llamadas a funciones a React.createElement, que a su vez devuelve objetos que tienen el tipo, props, y niños. Y estos forman un árbol de objetos que describen cómo deberían verse los componentes ahora.
React llamará a tus componentes, recogerá este árbol de objetos, y luego hará la diferencia entre el actual árbol de elementos contra el último árbol de elementos que renderizó la última vez. Y este proceso se llama reconciliación. Cada pase de renderizado se puede dividir en dos fases diferentes. La primera fase es la fase de renderizado. Y aquí es donde React recorre el árbol de componentes, pregunta a todos los componentes, ¿cómo quieres que se vea la UI ahora, y luego recoge todo eso para formar el árbol final.
Ahora la fase de renderizado se puede dividir en varios pasos. Y de hecho, a partir de React 18, React podría renderizar algunos componentes, pausar, dejar que el navegador se actualice, renderizar algunos más, tal vez manejar algunos datos entrantes como una acción de tecla presionada y una entrada de texto. Y luego, una vez que todos los componentes han sido renderizados, pasa a la fase de commit. Durante la fase de commit, React ha descubierto qué cambios necesitan ser aplicados al DOM y ejecuta todos esos cambios sincrónicamente en una secuencia. También ejecuta ciclos de vida de la fase de commit como el UseLayoutEffectHook o ComponentDidMount y DidUpdate en componentes de clase. Luego, después de un breve retraso, ejecutará los UseEffectHooks más tarde. Y esto le da al navegador la oportunidad de pintar entre las actualizaciones del DOM y los UseEffects en ejecución.
Cada pase de renderizado de React comienza con alguna forma de set state siendo llamado. Para los componentes de función, son los setters del hook UseState y el método dispatch del UseReducer. Para los componentes de clase, es this.setState o this.forceUpdate. También puedes desencadenar renders volviendo a ejecutar el método ReactDom.Render de nivel superior. O también está el nuevo hook UseSyncExternalStore, que escucha las actualizaciones de las bibliotecas externas como Redux. Antes de UseSyncExternalStore, las bibliotecas como React Redux todavía tenían que llamar a setState de alguna forma por dentro. Los componentes de función en realidad no tienen un método de actualización forzada, pero puedes hacer básicamente lo mismo creando un hook UseReducer que simplemente incrementa un contador cada vez.
Ahora es muy importante entender que el comportamiento predeterminado de React es que cada vez que un componente padre se renderiza, React renderizará recursivamente a todos los hijos dentro de este componente. Y creo que aquí es donde mucha gente se confunde. Así que digamos que tenemos un árbol de cuatro componentes, A, B, C, y D. Y llamamos a setState dentro del componente B. React pone en cola un nuevo renderizado.
Comments