React Query: ¡Es hora de romper con tu "Estado Global"!

Rate this content
Bookmark

Una cantidad creciente de datos en nuestras aplicaciones React proviene de fuentes remotas y asíncronas y, aún peor, continúa disfrazándose como "estado global". En esta charla, obtendrás información sobre por qué la mayoría de tu "estado global" en realidad no es un estado en absoluto y cómo React Query puede ayudarte a buscar, almacenar en caché y gestionar tus datos asíncronos con una fracción del esfuerzo y el código al que estás acostumbrado.

FAQ

React Query es una biblioteca NPM diseñada para manejar el estado del servidor asíncrono en aplicaciones React. Fue creada para simplificar la obtención, el almacenamiento en caché y la gestión del estado de los datos del servidor, ofreciendo una API pequeña y simple que ayuda a los desarrolladores a manejar estos estados con menos configuración y más eficiencia.

React Query ofrece manejo automático de almacenamiento en caché y refetching de datos, lo que mejora significativamente la performance y la experiencia del usuario. Permite que las mutaciones sean manejadas de manera más declarativa y facilita las actualizaciones optimistas, lo cual no es común en otras bibliotecas como SWR.

React Query simplifica la gestión del estado del servidor al manejar la carga, actualización y sincronización de datos de manera eficiente. Reduce la cantidad de código necesario para realizar estas operaciones y automatiza procesos como el almacenamiento en caché y la actualización de datos en segundo plano, lo que resulta en aplicaciones más rápidas y responsivas.

Sí, React Query puede trabajar con GraphQL, pero no a través de Apollo Client. React Query es agnóstico en cuanto a la forma en que se obtienen los datos; mientras la fuente de datos devuelva una promesa, React Query puede manejarlo, lo que permite su uso con clientes GraphQL simples.

Sí, es posible combinar React Query con Redux. React Query maneja específicamente el estado del servidor, mientras que Redux puede seguir utilizándose para gestionar otros aspectos del estado de la aplicación. Ambos pueden coexistir y complementarse para ofrecer una gestión de estado más robusta en aplicaciones React.

Aunque React Query y SWR buscan resolver problemas similares relacionados con la obtención de datos y la gestión del estado, difieren en sus APIs y en cómo manejan la caché y las mutaciones. React Query ofrece mayor flexibilidad en la estructura de claves para la caché y tiene un enfoque más robusto para las mutaciones, incluidas las actualizaciones optimistas, característica que SWR no posee en el mismo grado.

Tanner Linsley
Tanner Linsley
30 min
02 Aug, 2021

Comments

Sign in or register to post your comment.

Video Summary and Transcription

Se discute la gestión del estado global y los desafíos de colocar el estado del servidor en el estado global. Se introduce React Query como una solución para manejar el estado del servidor asíncrono. La charla demuestra el proceso de extraer la lógica en hooks personalizados y solucionar problemas con la lógica de estado y de búsqueda. Se muestran las actualizaciones optimistas con mutación, junto con los beneficios de usar React Query para la búsqueda de datos y las mutaciones. Se discute el futuro de la gestión del estado global, junto con los comentarios de los usuarios sobre React Query. La charla concluye con una invitación para explorar React Query para la gestión del estado del servidor.

1. Introducción a la Gestión del Estado Global

Short description:

Hola, soy Tanner Linsley, cofundador y vicepresidente de UI y UX en nozzle.io. Hoy, quiero hablar sobre la gestión del estado global y el error de colocar el estado del servidor en el estado global. El estado del servidor es diferente del estado del cliente en términos de almacenamiento, velocidad de acceso y propiedad. Vamos a explorar por qué y cómo podemos manejar el estado del servidor de manera más efectiva.

Hola a todos. Mi nombre es Tanner Linsley, y soy cofundador y vicepresidente de UI y UX en nozzle.io, donde construimos software de seguimiento de rango SEO para enterprise. Me encanta absolutamente React y JavaScript, y tengo un poco de obsesión por construir software de código abierto también.

Así que desde que aprendí React, he estado súper obsesionado con temas como la generación de sitios estáticos, data visualization, y animation. Pero hoy me gustaría hablarles sobre lo que posiblemente es mi favorito de todos, la gestión del estado global.

Hoy en día, una tonelada de code en nuestras aplicaciones está dedicada a consumir y manipular datos asíncronos. Ya sea que esos datos provengan de nuestros usuarios o servidores o APIs de terceros, es absolutamente crítico para nuestras aplicaciones proporcionar valor a nuestros usuarios. De hecho, para muchos de nosotros, nuestras aplicaciones son simplemente interfaces de usuario con opiniones para consumir y gestionar estos datos.

A lo largo de los años, he notado que los patrones alrededor del acceso y manipulación de nuestros datos en nuestras aplicaciones han tomado rápidamente residencia con lo que todos conocemos como estado global. El estado global es súper conveniente. Nos ayuda a evitar la perforación de propiedades, y nos permite acceder a los datos a través de nuestra aplicación sin copiarlos o duplicarlos. E incluso nos ayuda a comunicarnos entre componentes y hooks aislados que de otra manera no podrían hacerlo. Al final, simplemente nos ayuda a hacer más con menos code. Es extremadamente accesible y poderoso, por lo que es natural que querríamos que todos nuestros importantes datos del lado del servidor fueran tan accesibles como nuestro estado global. Y con esa expectativa, no es sorprendente que nosotros, como desarrolladores de React, hayamos elegido co-ubicar nuestros datos del lado del servidor con el resto de nuestro estado global.

Es relativamente fácil hacer esto usando algo como el estado del componente local con el contexto de React, o incluso usando cualquiera de las numerosas bibliotecas de la siempre creciente lista de herramientas de gestión del estado global. Pero al final, la expectativa suele ser la misma. Esperamos que nuestro estado global no sólo sea capaz de manejar cosas triviales como el estado del menú, temas, cosas como toasts y alertas, sino que también esperamos que sea responsable de los ciclos de vida complejos alrededor de la obtención y provisión de nuestros datos del lado del servidor y asíncronos a nuestros usuarios.

Así que hoy, estoy aquí para decirles que a pesar de la conveniencia efímera que nos da el estado global al trabajar con datos del lado del servidor, creo que hemos cometido un gran error al colocarlo allí. Nos hemos engañado a nosotros mismos y a nuestro code pensando que todo el estado es creado igual, cuando creo que nuestros datos asíncronos y el estado global no podrían ser más diferentes, especialmente cuando se trata de dónde se almacenan, la velocidad a la que los accedemos, y cómo los accedemos y actualizamos, y finalmente quién puede hacer cambios en ellos.

Para hacer todo esto más fácil de entender, quiero dejar de usar el término estado global y en su lugar llamar a estos dos tipos diferentes de estado estado del cliente y estado del servidor. El estado del cliente es relativamente simple y debería ser familiar para la mayoría de los desarrolladores. Es temporal y local, y generalmente no se persiste entre sesiones. Se accede a él con APIs sincrónicas que no tienen latencia, y la mayoría de él es propiedad de la instancia de nuestra aplicación cliente. Así que por todas esas razones, podemos confiar bastante en que nuestro estado del cliente siempre estará al día en cualquier momento en nuestra aplicación.

Sin embargo, el estado del servidor es bastante diferente. El estado del servidor se persiste de forma remota, por lo que la fuente de la verdad de nuestro estado del servidor es potencialmente desconocida, o al menos fuera de nuestro control. Es asíncrono, por lo que tenemos que acceder a él con APIs asíncronas, y también tiene una propiedad compartida implícita, lo que significa que no sólo es propiedad de nuestro cliente. Puede ser leído y manipulado tanto por el servidor como por cualquier otro cliente potencial que interactúe con él. Debido a todas estas cosas, se pueden hacer muy pocas garantías sobre nuestro estado del servidor siempre estando al día en nuestras aplicaciones, y en su lugar generalmente terminamos confiando en simples instantáneas de nuestros datos asíncronos.

2. Estado del Servidor y Estado del Cliente

Short description:

Cuando el estado del servidor y el estado del cliente se almacenan en el mismo sistema, se hacen concesiones. El estado del servidor tiene desafíos únicos que requieren herramientas dedicadas. React Query es una biblioteca NPM que resuelve el estado del servidor asíncrono con una API pequeña y simple. Para demostrar sus capacidades, construí una aplicación de blog con React y Next.js. La aplicación permite ver, editar y agregar publicaciones. Inicialmente, la aplicación tenía cuatro componentes principales, cada uno utilizando useEffect y React State para la obtención de datos y los estados de carga. Sin embargo, quería hacer el código más portátil.

Entonces, cuando tomamos estos dos tipos muy diferentes de estado, el estado del servidor y el estado del cliente, y intentamos almacenarlos en el mismo sistema, eventualmente haremos concesiones que favorecen a uno o al otro. Un buen ejemplo de esto es que el estado del servidor tiene sus propios desafíos únicos que nunca enfrentamos con el estado del cliente. Por ejemplo, algunos de estos podrían ser cosas como el almacenamiento en caché, la desduplicación de solicitudes, la actualización de data en segundo plano, lidiar con solicitudes obsoletas, lidiar con mutaciones, paginación y obtención incremental, o incluso la recolección de basura, la gestión de errores de memoria y todo lo demás que viene con el almacenamiento en caché en general. Muchos patterns de estado global no ofrecen soluciones para este tipo de desafíos, o al menos intentan resolverlos con APIs complicadas o sistemas de plugins sobreingenierados, y a veces incluso APIs sobre potenciadas que son básicamente armas de fuego para el desarrollador promedio de React.

El estado del servidor y el estado del cliente claramente necesitan mucho amor, pero cada uno lo necesita a su manera. Y aunque creo que tienen algunas cosas en común en cuanto a cómo los accedemos en nuestras aplicaciones, creo que es hora de que el estado del servidor y el estado del cliente se separen. Hay mucho más en el estado del servidor que simplemente ser accesible globalmente, y creo que se merece nuevas herramientas dedicadas que no solo resuelvan estos desafíos, sino que los manejen automáticamente de una manera elegante. Esta es exactamente la razón por la que decidí construir React Query. React Query es una biblioteca NPM compuesta por un par de hooks y utilidades que buscan resolver el estado del servidor asíncrono. Es una API pequeña, es simple, y está diseñada para ayudar tanto a los desarrolladores novatos como a los advanced de React a tener éxito mientras requiere poca o ninguna configuración.

Para realmente saber cómo React Query puede transformar drásticamente la forma en que manejas el estado del servidor, decidí construir una pequeña aplicación de blog interactiva usando React y una pequeña API alimentada por Next.js. Entonces, el propósito de esta aplicación es bastante simple. Es mostrar una lista de publicaciones, nos permite ver una vista detallada de una publicación individual, y luego nos permite editar publicaciones existentes o agregar nuevas. Voy a navegar a través de algunas etapas o commits que hice en este proyecto de cómo evolucionó la gestión del estado de esta aplicación en la naturaleza y cómo, al final, finalmente llegué a usar React Query para salvar el día.

Entonces, primero, familiaricémonos con la aplicación. Tenemos una barra lateral confiable con un solo enlace a nuestra página de publicaciones. Tenemos una página de publicaciones que obtiene todas nuestras publicaciones de nuestra API y las muestra en una lista. Podemos hacer clic en una publicación y cargar la vista detallada con el contenido completo. Podemos usar el formulario de edición en la parte inferior para editar la publicación. Y luego, de vuelta en nuestra lista de publicaciones, podemos usar ese mismo formulario para agregar una nueva publicación a la lista. Entonces, para hacer todo esto, nuestra aplicación comenzó con cuatro componentes principales. Un componente de aplicación, que maneja todas nuestras rutas y el estado de las rutas. Un componente de publicación, que obtiene nuestras publicaciones de la API y luego las muestra con el formulario para agregar nuevas publicaciones debajo de ellas. Un componente de publicación individual que obtiene el contenido completo de una publicación y lo renderiza y luego nos da el formulario de edición en la parte inferior. Y finalmente, tenemos un componente de formulario de publicación reutilizable que simplemente es para editar los campos de la publicación. Entonces, en cada uno de estos componentes de publicación, ahora mismo estamos usando una estrategia de use effect para llamar a una función asíncrona y obtener nuestros data. Y luego usamos el Estado de React para seguir el estado de carga de esas solicitudes. De esta manera, cuando montamos cada uno de esos componentes, los data se solicitan y eventualmente se renderizan en nuestra UI. Y todo esto está bien y funciona, pero personalmente no me gusta tener mucha lógica de negocio en mis componentes. Así que quiero ver si podemos hacer esto un poco más portátil.

QnA

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Todo Más Allá de la Gestión de Estado en Tiendas con Pinia
Vue.js London Live 2021Vue.js London Live 2021
34 min
Todo Más Allá de la Gestión de Estado en Tiendas con Pinia
Top Content
Cuando pensamos en Vuex, Pinia, o tiendas en general, a menudo pensamos en la gestión de estado y los patrones Flux, pero no solo las tiendas no siempre siguen el patrón Flux, ¡hay mucho más en las tiendas que las hace valer la pena usar! Plugins, Devtools, renderizado en el lado del servidor, integraciones TypeScript... Vamos a sumergirnos en todo más allá de la gestión de estado con Pinia con ejemplos prácticos sobre plugins y Devtools para sacar el máximo provecho de tus tiendas.
Uso efectivo de useEffect
React Advanced Conference 2022React Advanced Conference 2022
30 min
Uso efectivo de useEffect
Top Content
¿Puede useEffect afectar negativamente a tu base de código? Desde la obtención de datos hasta la lucha con las APIs imperativas, los efectos secundarios son una de las mayores fuentes de frustración en el desarrollo de aplicaciones web. Y seamos honestos, poner todo en ganchos useEffect no ayuda mucho. En esta charla, desmitificaremos el gancho useEffect y obtendremos una mejor comprensión de cuándo (y cuándo no) usarlo, así como descubriremos cómo los efectos declarativos pueden hacer que la gestión de efectos sea más mantenible incluso en las aplicaciones React más complejas.
Los Átomos de Jotai Son Simplemente Funciones
React Day Berlin 2022React Day Berlin 2022
22 min
Los Átomos de Jotai Son Simplemente Funciones
Top Content
Jotai es una biblioteca de gestión de estado. La hemos estado desarrollando principalmente para React, pero conceptualmente no está vinculada a React. En esta charla, veremos cómo funcionan los átomos de Jotai y aprenderemos sobre el modelo mental que deberíamos tener. Los átomos son una abstracción agnóstica del marco para representar estados, y básicamente son solo funciones. Comprender la abstracción de átomo ayudará a diseñar e implementar estados en sus aplicaciones con Jotai
Una Guía Práctica para Migrar a Componentes de Servidor
React Advanced Conference 2023React Advanced Conference 2023
28 min
Una Guía Práctica para Migrar a Componentes de Servidor
Los Componentes de Servidor son la nueva gran cosa, pero hasta ahora gran parte del discurso a su alrededor ha sido abstracto. Cambiemos eso. Esta charla se centrará en el lado práctico de las cosas, proporcionando un mapa de ruta para navegar el viaje de migración. Comenzando desde una aplicación que utiliza el antiguo enrutador de páginas de Next.js y React Query, desglosaremos este viaje en un conjunto de pasos accionables e incrementales, deteniéndonos solo cuando tengamos algo que se pueda enviar y que sea claramente superior a lo que comenzamos. También discutiremos los próximos pasos y estrategias para adoptar gradualmente más aspectos de este paradigma transformador.
Anunciando Starbeam: Reactividad Universal
JSNation 2022JSNation 2022
27 min
Anunciando Starbeam: Reactividad Universal
Starbeam es una biblioteca para construir sistemas de datos reactivos que se integran nativamente con frameworks de UI como React, Vue, Svelte o Ember. En esta charla, Yehuda anunciará Starbeam. Cubrirá la motivación para la biblioteca, y luego entrará en los detalles de cómo funciona la reactividad en Starbeam, y lo más importante, cómo puedes usarlo para construir bibliotecas reactivas hoy que funcionarán nativamente en cualquier framework de UI. Si eres realmente aventurero, también hablará sobre cómo podrías usar Starbeam en una aplicación existente utilizando el framework de tu elección y hablará sobre los beneficios de usar Starbeam como el sistema de gestión de estado en tu aplicación.
React Query y Auth: ¿Quién es responsable de qué?
React Advanced Conference 2021React Advanced Conference 2021
19 min
React Query y Auth: ¿Quién es responsable de qué?
Top Content
React Query gestiona el estado del servidor en el cliente, y auth gestiona el inicio de sesión/registro/cierre de sesión del usuario. ¿Dónde se superponen estos dos, y cómo separas las preocupaciones? Esta charla propone un flujo de datos con hooks personalizados tanto para auth como para React Query para gestionar el estado de autenticación y las actualizaciones del perfil del usuario.

Workshops on related topic

Repensando el Estado del Servidor con React Query
React Summit 2020React Summit 2020
96 min
Repensando el Estado del Servidor con React Query
Top Content
Featured Workshop
Tanner Linsley
Tanner Linsley
La distinción entre el estado del servidor y el estado del cliente en nuestras aplicaciones puede ser un concepto nuevo para algunos, pero es muy importante entenderlo cuando se entrega una experiencia de usuario de primera calidad. El estado del servidor viene con problemas únicos que a menudo se cuelan en nuestras aplicaciones sorpresa como:
- Compartir datos entre aplicaciones- Caché y Persistencia- Deduplicación de Solicitudes- Actualizaciones en segundo plano- Gestión de Datos "Obsoletos"- Paginación y Recuperación Incremental- Memoria y Recolección de Basura- Actualizaciones Optimistas
Los gestores tradicionales de "Estado Global" pretenden que estos desafíos no existen y esto finalmente resulta en que los desarrolladores construyan sus propios intentos sobre la marcha para mitigarlos.
En esta masterclass, construiremos una aplicación que expone estos problemas, nos permite entenderlos mejor, y finalmente los convierte de desafíos a características usando una biblioteca diseñada para gestionar el estado del servidor llamada React Query.
Al final de la masterclass, tendrás una mejor comprensión del estado del servidor, el estado del cliente, la sincronización de datos asíncronos (un bocado, lo sé), y React Query.
Gestión del estado en React con Context y Hooks
React Summit Remote Edition 2021React Summit Remote Edition 2021
71 min
Gestión del estado en React con Context y Hooks
WorkshopFree
Roy Derks
Roy Derks
Mucho ha cambiado en el mundo de la gestión del estado en React en los últimos años. Donde Redux solía ser la principal biblioteca para esto, la introducción de las API de Contexto y Hooks de React ha revolucionado las cosas. Ya no necesitas bibliotecas externas para manejar tanto el estado del componente como el estado global en tus aplicaciones. En este masterclass aprenderás los diferentes enfoques para la gestión del estado en la era post-Redux de React, ¡todos basados en Hooks! Y como bonificación, exploraremos dos próximas bibliotecas de gestión del estado en el ecosistema de React.