Ahora, para nuestro tercer tema, discutiremos cómo reducir la cantidad de componentes en un árbol que se renderizan. Si nuestro estado está muy arriba, toda la aplicación se volverá a renderizar. Los componentes de efecto nos permiten reducir la frecuencia con la que esto sucede, pero aún así debe suceder en algún momento.
¿Y qué pasa si tienes una lista grande o una parte de los datos solo se utiliza, por ejemplo, en algunos elementos de la lista? ¿Realmente necesitamos volver a renderizar toda la lista solo para actualizar algunas cadenas? Podríamos usar el contexto para pasar un valor desde el abuelo hasta su nieto, pero aún así se necesitarán rerenderizaciones porque estamos usando useState de React.
Pero, ¿qué pasa si usamos state sin useState? Necesitaríamos hacer lo que React hace por nosotros, almacenar una parte del estado, tener una forma de establecer ese estado e informar a todos los interesados que el estado ha cambiado. Bueno, React hace esto bastante bien, pero otras bibliotecas también pueden hacerlo. Así que sigamos adelante y comencemos a usar una segunda biblioteca de UI completamente competidora, Svelte.
El truco es que en realidad no estamos usando Svelte para su código de UI. En su lugar, desempaquetaremos el paquete y solo usaremos una API especial de tienda. Las tiendas de Svelte actúan como un useState portátil. Tienen un método set para actualizar el estado y los componentes que observan la tienda. Incluso puedes pasar una función de retorno de llamada para actualizar el estado en función del valor de estado anterior, al igual que en React. La API de la tienda es independiente del resto de Svelte, por lo que no necesitamos preocuparnos por importar nada más. Puedes usar eslint para deshabilitar las importaciones directas de Svelte en tu código y solo permite importar desde Svelte/store.
Ahora, en lugar de pasar un valor de estado sin procesar, podemos pasar una tienda de Svelte en su lugar. Puedes hacerlo usando props o contexto, como valores regulares. La tienda no cambia de identidad, por lo que cambiar los valores no afectará a React.memo. Sin embargo, en algún momento, todavía necesitamos convertir la tienda de Svelte de vuelta a estado de React. En lugar de colocar el hook dentro del componente de la rama ancestral, podemos colocar múltiples hooks dentro de cada componente hoja. Usaremos el hook externo usync incorporado de React. Toma dos funciones de retorno de llamada, una utilizada para suscribirse a la tienda y observar los cambios, y otra para obtener el valor actual de la tienda. Cada vez que la tienda cambia, React lo usará como una señal para actualizar el estado interno del hook utilizando el valor actual de la tienda, lo que hace que el componente se vuelva a renderizar.
Ahora los componentes intermedios no necesitan volver a renderizarse en absoluto. Solo los componentes hoja son notificados cuando la tienda cambia, por lo que ningún otro componente se vuelve a renderizar. Al pasar simplemente un objeto de tienda estática, hemos roto las limitaciones del useState de React manteniendo una API similar. Combinado con los componentes de efecto, podemos preparar el estado y luego pasarlo sin volver a renderizar a los ancestros en absoluto. Al pasar store.set a nuestro componente de efecto en lugar de la función de retorno de llamada setState de React, nunca necesitamos trabajar con useState en nuestro componente superior y, por lo tanto, nunca necesitamos volver a renderizarlo. Las tiendas de DataModel también se pueden usar fuera de React o cualquier biblioteca de UI, por lo que puedes gestionar el estado reactivo en clases de modelo de datos, en un worker o incluso en el servidor. Esto es en realidad muy similar a una optimización de rendimiento que Redux hace bajo el capó. Redux simplemente pasa una referencia estática de la tienda utilizando el contexto de React.
Comments