Entonces, continuemos. Como mencioné en la introducción, la primera parte, en realidad vamos a comenzar con React 17 y cómo podemos usar suspense dentro de React 17 y qué beneficio aporta, y luego construiremos sobre eso cuando lleguemos a React 18. Ahora, veamos qué está pasando.
Entonces, esta es la base que necesitamos cubrir para asegurarnos de que podemos trabajar con suspense de React 18 y suspense list y este tipo de cosas. Ahora, con React 17, obtuvimos el componente suspense y el componente suspense nos permitirá suspender algún trabajo que está en curso. ¿Qué significa realmente este trabajo en términos de React? Bueno, suspendes la renderización de un componente o un subárbol de componentes lanzando una promesa dentro del renderizado, lo cual es un poco extraño. Si piensas en la palabra clave throw en JavaScript o TypeScript, piensas en errores. Lanzas un error. Pero JavaScript te permite lanzar cualquier cosa. Puedes lanzar un número o una cadena. React en realidad usa eso diciendo, bueno, vamos a lanzar una promesa cuando algo suceda donde no podamos terminar de renderizar. Y ese algo podría ser cualquier cosa, pero típicamente eso significa que estás haciendo una solicitud AJAX para obtener algo del servidor. Pero de nuevo, podría ser algo completamente diferente, pero ese va a ser el caso más común.
Y ese algo del servidor típicamente es una de dos cosas. O bien estás haciendo una solicitud AJAX donde estás obteniendo data que quieres renderizar. O lo otro es que estás cargando componentes de forma perezosa y estás haciendo una solicitud AJAX para cargar de forma perezosa algunos códigos para que puedas renderizar ese componente. Pero aún no ha sido cargado, por lo que aún no está disponible. Y luego, cuando se lanza esa promesa, React básicamente dice, está bien, vamos a suspender este componente o ese subárbol de componentes, y vamos a esperar a que esa promesa esté terminada. Y una promesa puede terminar de una de dos maneras. Puede simplemente rechazar, en cuyo caso hay un error, o puede resolver, en cuyo caso hay éxito. Y si el subárbol de componentes está suspendido y la promesa que lo suspendió se resuelve, entonces React dice está bien, vamos a renderizar ese subárbol de nuevo y presumiblemente lo que lo hizo suspender ya está hecho, por lo que se renderizará y producirá lo que sea, bueno, marcado elementos DOM que queremos. Potencialmente podría suspenderse de nuevo para obtener más data. Y en caso de error, React va a decir está bien, en ese caso hay un error, vamos a llamar a un límite de error o vamos a buscar un límite de error y vamos a dejar que haga su cosa y si no hay un límite de error, en realidad vamos a matar la aplicación.
Ahora la aplicación que estoy usando obtiene data. Y si vamos a los componentes de origen, y por ejemplo, en usuarios, hay estos detalles de cuenta. Podemos ver aquí que utiliza el hook use SWR. Así que es un hook de obtención de data de Vercel llamado Stale While Revalidate. Así que obtiene data y vuelve a obtener data, etc. Y eso es una solicitud AJAX. Tenemos el code tradicional aquí, manejar errores, si hubo algún error, si no tenemos ninguna data todavía, mostraremos algún tipo de indicador de carga que estamos cargando y eso es lo que realmente muestra ese spinner. Cuando refresco, ya tenía alguna data en caché. El spinner que aparece aquí, eso es la carga. Y si la data está ahí, entonces ninguno de estos va a renderizar y en realidad va a ir justo aquí. Y por supuesto si hay un error, permíteme rápidamente introducir un error haciendo esa URL inválida. Así que ahora si hago clic en el usuario, vemos un spinner y luego vemos no encontrado porque esa URL era en realidad inválida. Pero hagámosla válida de nuevo. Resulta que SWR, la biblioteca de obtención de data no funciona con suspense de serie, pero es realmente fácil hacer que lo haga. En el index.js hay esta configuración de SWR, y tiene react-context debajo del capó. Y proporcionamos algún contexto sobre cómo debería funcionar SWR. Y tiene una opción allí, suspense, que por defecto es falso, pero podemos establecer eso en verdadero. Y ahora empezará a usar suspense automáticamente, a menos que sea anulado por algún otro, podríamos anular esto en un caso individual, pero no lo estamos haciendo. De repente, todas nuestras solicitudes Ajax han cambiado a suspense. Ahora esto es específico de la forma en que funciona SWR, pero si estás usando React query, por ejemplo, tiene prácticamente la misma configuración y muchas bibliotecas de React para obtener data harán lo mismo. Si estás usando React lazy para cargar componentes de forma perezosa, se enganchará automáticamente a suspense. No puedes ni siquiera apagarlo, siempre lo hará. Sin embargo, ahora mi aplicación está rota. Si me aseguro de que mis cachés están limpias presionando un 5, voy a usuarios, obtenemos un error. Oops, algo salió mal. La lista de usuarios, que era esa lista de usuarios que aparecía antes, está siendo obtenida ahora, pero empezó a usar suspense. Y eso significa que necesitamos tener este mecanismo de fallback de suspense. Así que en algún lugar necesito añadir un límite de suspense. Y normalmente los añado en varios lugares. Pero empezaré en la raíz misma. Y añadiremos más más tarde. Y queremos algún fallback así que tengo un componente de carga. Y eso no se resuelve del todo hasta que tengo el insuspense. Ahora eso debería resolver la importación. Así que tengo un objeto suspense. Y ahora si vuelvo a la raíz, y ahora hago las mismas aventuras de renderizado concurrente, vemos que en realidad obtiene su data y utiliza suspense allí. Y si hago clic en el usuario, carga la data. Ahora podrías haber notado que hay una diferencia de comportamiento porque originalmente cuando hacía clic en el usuario, veríamos dos spinners aquí, uno para los detalles del usuario y otro para los usuarios favoritos. Ahora, de repente, toda la UI es reemplazada por un solo spinner, así que no muy agradable, diría yo. En realidad lo arreglaremos en un minuto porque podemos hacer bastante con suspense. Pero si miramos esos detalles de la cuenta ahora, es como, bueno, ¿vamos a tener errores? No, porque con suspense, los errores son manejados de una manera diferente, así que podemos deshacernos de ese error. Si aún no tenemos data, ¿necesitamos mostrar un indicador de carga? No, porque con suspense, todo ese mecanismo de lanzar una promesa entra en juego. Así que nunca deberíamos llegar aquí sin ninguna data, así que deberíamos poder deshacernos de eso. Ahora estoy usando TypeScript, y espero que todos sean fans de TypeScript. Soy un fan de TypeScript y este trabajo de serie de React o trabajo de front-end lo hago con TypeScript o bastante trabajo de backend también. Así que en realidad se queja aquí diciendo, bueno, la cuenta es una cuenta o indefinida. Eso es porque la API aquí debajo del capó está usando suspense así que de alguna manera sabemos que esta cuenta realmente es una cuenta o se va a lanzar una promesa.
Comments