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.

This talk has been presented at React Summit Remote Edition 2020, check out the latest edition of this React Conference.

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.

Read also

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
State management is not limited to complex applications and transitioning to a store offers significant benefits. Pinia is a centralized state management solution compatible with Vue 2 and Vue 3, providing advanced devtools support and extensibility with plugins. The core API of Pinia is similar to Vuex, but with a less verbose version of stores and powerful plugins. Pinia allows for easy state inspection, error handling, and testing. It is recommended to create one file per store for better organization and Pinia offers a more efficient performance compared to V-rex.
Uso efectivo de useEffect
React Advanced 2022React Advanced 2022
30 min
Uso efectivo de useEffect
Top Content
Today's Talk explores the use of the useEffect hook in React development, covering topics such as fetching data, handling race conditions and cleanup, and optimizing performance. It also discusses the correct use of useEffect in React 18, the distinction between Activity Effects and Action Effects, and the potential misuse of useEffect. The Talk highlights the benefits of using useQuery or SWR for data fetching, the problems with using useEffect for initializing global singletons, and the use of state machines for handling effects. The speaker also recommends exploring the beta React docs and using tools like the stately.ai editor for visualizing state machines.
Gestión del Estado de React: 10 Años de Lecciones Aprendidas
React Day Berlin 2023React Day Berlin 2023
16 min
Gestión del Estado de React: 10 Años de Lecciones Aprendidas
Top Content
This Talk focuses on effective React state management and lessons learned over the past 10 years. Key points include separating related state, utilizing UseReducer for protecting state and updating multiple pieces of state simultaneously, avoiding unnecessary state syncing with useEffect, using abstractions like React Query or SWR for fetching data, simplifying state management with custom hooks, and leveraging refs and third-party libraries for managing state. Additional resources and services are also provided for further learning and support.
SolidJS: ¿Por qué tanto Suspense?
JSNation 2023JSNation 2023
28 min
SolidJS: ¿Por qué tanto Suspense?
Top Content
Suspense is a mechanism for orchestrating asynchronous state changes in JavaScript frameworks. It ensures async consistency in UIs and helps avoid trust erosion and inconsistencies. Suspense boundaries are used to hoist data fetching and create consistency zones based on the user interface. They can handle loading states of multiple resources and control state loading in applications. Suspense can be used for transitions, providing a smoother user experience and allowing prioritization of important content.
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
State management in React is a highly discussed topic with many libraries and solutions. Jotai is a new library based on atoms, which represent pieces of state. Atoms in Jotai are used to define state without holding values and can be used for global, semi-global, or local states. Jotai atoms are reusable definitions that are independent from React and can be used without React in an experimental library called Jotajsx.
Una Guía Práctica para Migrar a Componentes de Servidor
React Advanced 2023React Advanced 2023
28 min
Una Guía Práctica para Migrar a Componentes de Servidor
Top Content
React query version five is live and we'll be discussing the migration process to server components using Next.js and React Query. The process involves planning, preparing, and setting up server components, migrating pages, adding layouts, and moving components to the server. We'll also explore the benefits of server components such as reducing JavaScript shipping, enabling powerful caching, and leveraging the features of the app router. Additionally, we'll cover topics like handling authentication, rendering in server components, and the impact on server load and costs.

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.
Fetch, useEffect, React Query, SWR, ¿qué más?
React Advanced 2023React Advanced 2023
102 min
Fetch, useEffect, React Query, SWR, ¿qué más?
Top Content
WorkshopFree
Ondrej Polesny
Ondrej Polesny
En esta masterclass, primero, repasaremos las diferentes formas en que puedes consumir APIs en React. Luego, probaremos cada una obteniendo contenido de un CMS sin cabeza (tanto con REST como con GraphQL) y verificando en detalle cómo funcionan.
Aunque no se requiere un conocimiento avanzado de React, esta será una sesión práctica, por lo que necesitarás clonar un repositorio de GitHub preconfigurado y utilizar tu editor de programación React preferido, como VS Code.
Aprenderás:- Qué diversas opciones de obtención de datos hay en React- Cuáles son las ventajas y desventajas de cada una- Cuáles son los casos de uso típicos y cuándo cada estrategia es más beneficiosa que otras
Crea un sitio web editable visualmente con Next.js utilizando React Bricks, con blog y comercio electrónico
React Summit 2023React Summit 2023
139 min
Crea un sitio web editable visualmente con Next.js utilizando React Bricks, con blog y comercio electrónico
Top Content
WorkshopFree
Matteo Frana
Matteo Frana
- React Bricks: por qué lo construimos, qué es y cómo funciona- Crea una cuenta gratuita- Crea un nuevo proyecto con Next.js y Tailwind- Explora la estructura del directorio- Anatomía de un Brick- Crea un nuevo Brick (Texto-Imagen)- Añade un título y descripción con edición visual RichText- Añade una imagen con edición visual- Añade controles de barra lateral para editar props (relleno y lado de la imagen)- Anidación de Bricks utilizando el componente Repeater- Crea un brick de galería de imágenes- Publica en Netlify o Vercel- Tipos de página y campos personalizados- Acceso a los valores meta de la página- Internacionalización- Cómo reutilizar contenido en varias páginas: Historias y incrustaciones- Cómo crear un comercio electrónico con datos de productos de una base de datos externa y páginas de aterrizaje creadas visualmente en React Bricks- Características empresariales avanzadas: permisos flexibles, estructura bloqueada, componentes visuales personalizados
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.