El contexto, sin embargo, nos permite hacer trampa un poco y evitar ese árbol de componentes. Si simplemente extraemos estos datos que queremos pasar al contexto y los usamos directamente en el componente rosa, solo el componente con los propios datos y el componente que realmente los utiliza se volverán a renderizar. El resto de la aplicación simplemente se quedará allí en silencio y no hará absolutamente nada.
De acuerdo, los gatitos son divertidos, pero echemos un vistazo más de cerca a la vida normal y a los componentes normales. Digamos que quiero implementar una página que se vea así. Diseño de dos páginas con navegación a la izquierda, área de contenido principal a la derecha. En la navegación quiero tener un botón que expanda y colapse la navegación. Y quiero renderizar un número diferente de bloques en la parte inferior del área de contenido dependiendo de si la navegación está expandida o colapsada. Si comienzo a implementarlo con props normales, se vería algo así. Tendríamos una página que mantiene el estado de la navegación, pasa ese estado al botón que lo expande a través del componente de navegación y escucha la devolución de llamada en él. Y luego tendríamos que pasar estos datos al componente de la página a través de todas las capas, hasta el nivel donde necesito renderizar esos bloques. Y nuevamente, desde la perspectiva de los re-renders, no es genial. Cada expansión o colapso de la navegación resultará en re-renders de absolutamente todo.
Lo que puedo hacer en su lugar es extraer esta lógica de expansión y colapso en el contexto, solo la lógica, nada más. Esto se vería algo así, el mismo estado que controla la navegación, tendríamos un valor al que pasaríamos el propio estado y la función de alternancia, y luego pasaríamos este valor al proveedor de contexto. De repente, nuestra página, en lugar de toneladas de código y props por todas partes, se convierte en algo tan limpio como esto. Contexto en la parte superior, navegación y contenido pasado como hijos. Y luego, en algún lugar de la navegación, tendríamos el botón que simplemente usa la función de alternancia directamente desde el contexto. Y en algún lugar del área de contenido, tendríamos el bloque con los elementos que usan el estado de la navegación directamente desde el contexto.
Pero aunque este ejemplo parece genial en teoría, en la vida real, por supuesto, es un poco más complicado, como siempre. En la vida real, todavía tenemos el problema de que el contexto tiene mala reputación en cuanto a los re-renders. Principalmente, esta reputación proviene de dos hechos. El primero es que los re-renders relacionados con el contexto se desencadenarán en cada hijo que use este gancho de contexto, independientemente de si utiliza los datos reales o no. Entonces, en nuestro caso, el componente de la izquierda que solo usa la función de alternancia, en teoría, no debería preocuparse por el estado en absoluto, pero en la práctica, ambos componentes se volverán a renderizar cuando cambie el contexto. Y el segundo problema aquí es que estos re-renders son inevitables. No hay una forma sensata de evitarlos. Los ganchos de memoización o de devolución de llamada no ayudarán. Sin embargo, hay otro truco que puede ayudar aquí si este comportamiento realmente causa problemas de rendimiento. Podemos dividir esos proveedores de contexto en dos. En lugar de un solo valor que contenga tanto la alternancia como el estado, podemos tener dos valores separados.
Comments