Suspense para la Obtención de Datos: Cómo Obtener Durante el Renderizado

Rate this content
Bookmark

¿Qué es suspense para la obtención de datos en React? ¿Por qué el modelo de React hace que la creación de solicitudes de red durante el renderizado sea tan difícil? ¿Por qué (según el conocimiento del presentador) ninguna biblioteca además de Relay admite esto, a pesar de su gran conveniencia?


En esta charla, Robert discutirá cómo React renderiza componentes (especialmente con respecto a Suspense), y cómo construir una biblioteca de obtención de datos que funcione correctamente a la luz de esos comportamientos. Luego, con todas las piezas en su lugar, usaremos una biblioteca, @boulton/react-disposable-state, para crear nuestra propia obtención de datos compatible con suspense!

This talk has been presented at React Summit US 2023, check out the latest edition of this React Conference.

FAQ

Obtener datos durante el renderizado inicial es crucial porque permite mostrar al usuario la información que desea ver lo más pronto posible, mejorando así la experiencia de usuario.

Sí, obtener datos por adelantado puede ser más eficiente que durante el renderizado, especialmente si se anticipa que los datos serán necesarios inmediatamente, como en el caso de un modal que se activa con un clic.

Es aconsejable establecer un temporizador que limpie la caché y deseche los datos en la caché después de un tiempo, como 30 segundos, para evitar fugas de memoria si el componente nunca se monta.

Si un componente se monta, React ejecutará una función de limpieza, por lo que no es necesario confiar en un temporizador. Los datos no deben ser eliminados mientras el componente montado los referencia, sino cuando se desmonta.

La biblioteca 'react-disposable-state' proporciona APIs genéricas que permiten realizar efectos secundarios de forma segura durante el renderizado, ayudando a manejar la reutilización de solicitudes de red y la limpieza de datos.

Robert Balicki
Robert Balicki
5 min
15 Nov, 2023

Comments

Sign in or register to post your comment.
  • Robert Balicki
    Robert Balicki
    Ah, sorry about the confusion! See https://github.com/isographlabs/isograph/tree/main/libs/isograph-react-disposable-state for the URL of the repo. @isograph/react-disposable-state is the name on npm! You can find that here: https://www.npmjs.com/package/@isograph/react-disposable-state
  • Developer
    Developer
    -
    The repo @isograph/react-disposable-state doesn't exist.

Video Summary and Transcription

Esta charla discute las mejores prácticas para obtener datos durante el renderizado inicial de un componente en React. Enfatiza la importancia de obtener datos con anticipación y evitar obtenerlos dos veces. La charla también destaca la necesidad de una caché externa para almacenar información sobre las llamadas a la API y el uso de una función de limpieza para evitar fugas de memoria. Además, el orador menciona su biblioteca, react-disposable-state, que se puede utilizar para hacer efectos secundarios durante el renderizado.

1. Obtención de Datos Durante el Renderizado Inicial

Short description:

En esta charla, voy a discutir cómo obtener datos durante el renderizado inicial de un componente. Obtener durante el renderizado inicial es preferible a obtener en un efecto. Obtener por adelantado es mejor que obtener durante el renderizado. A veces, obtener durante el renderizado es la mejor opción. La obtención es solo un ejemplo de un efecto secundario que debe realizarse solo una vez y debe limpiarse. Queremos evitar obtener dos veces y en su lugar reutilizar la misma solicitud de red. Podríamos realizar otros efectos secundarios como disparar análisis o procesar números en el servidor.

♪♪ En esta charla, voy a discutir cómo obtener data durante el renderizado inicial de un componente. Pero antes de llegar a cómo obtener durante el renderizado, deberíamos discutir primero por qué. ¿Por qué queremos obtener data durante el renderizado? Bueno, obtenemos data porque la necesitamos para mostrar al usuario algo útil. Obvio. Pero, ¿por qué hacer la solicitud de red durante el renderizado? Bueno, cuanto antes obtengamos, antes podremos mostrar al usuario lo que quieren ver y mejor user experience podemos proporcionar. Así que obtener durante el renderizado inicial es preferible a obtener en un efecto, que necesariamente ocurre después de que un componente se renderiza inicialmente, a veces mucho después.

Pero, ¿es eso lo mejor que podemos hacer? ¿Qué tal obtener por adelantado? Considera un botón que, cuando se hace clic, muestra un modal, que necesita data. Podríamos iniciar la solicitud de red cuando el usuario hace clic en ese botón, lo que significa que la solicitud de red comenzará antes del renderizado inicial y podremos mostrar el contenido relevante al usuario incluso antes. Eso es genial. Vale, así que obtener por adelantado es mejor que obtener durante el renderizado. Entonces, ¿por qué obtener durante el renderizado en absoluto? Bueno, en algunos casos, es lo mejor que puedes hacer. Considera un modal que se muestra en función de alguna función opaca de algún estado de redox difícil de razonar. Básicamente, realmente no sabemos por qué se muestra este modal o bajo qué condiciones. Y en situaciones como esa, podría ser difícil determinar un momento apropiado para iniciar esa solicitud de red. Así que lo mejor que podemos hacer es obtener durante el renderizado. Como una nota al margen, nada en mi presentación es realmente sobre la obtención per se. La obtención es solo un ejemplo de un efecto secundario que debe realizarse solo una vez y debe limpiarse.

Ahora, la limpieza que queremos hacer para obtener es recoger la basura de los data que recibimos de la red si la UI ya no lo necesita para que en dispositivos de gama baja, evitemos quedarnos sin memoria. Pero más genéricamente, si un componente se renderiza dos veces, queremos evitar obtener dos veces y en su lugar reutilizar esa misma solicitud de red. Así que otro efecto secundario que debemos realizar es saber en algún lugar que ya hemos hecho una solicitud de red idéntica. Y la limpieza que queremos hacer es, después, digamos, 30 segundos, eliminar el elemento de la caché porque la próxima vez que renderizamos ese componente, realmente queremos hacer una solicitud de red. Entonces, ¿cuáles son algunos de los otros ejemplos de efectos secundarios que podríamos realizar de esta manera? Bueno, podríamos disparar algunos análisis. Podríamos hacer que el servidor comience a procesar algunos números que vamos a necesitar más tarde. Eso es prácticamente todo lo que voy a decir sobre la obtención durante el renderizado se aplica a esos también.

Vale, así que ahora finalmente podemos llegar a cómo obtener durante el renderizado. Mantengámoslo simple. ¿Podemos simplemente hacer la maldita llamada a la API durante la función de renderizado? Bueno, desafortunadamente, React y Cloud Components render function multiple times. Y en el segundo renderizado, realmente nos gustaría reutilizar esa solicitud de red anterior. Entonces, ¿podemos usar hooks? Bueno, desafortunadamente no. Si tu componente se renderiza, se suspende, y se renderiza una segunda vez, todos los hooks se crearán de nuevo para el segundo renderizado.

2. Realizando Efectos Secundarios Durante el Renderizado

Short description:

No podemos usar el estado o las referencias para almacenar información sobre la llamada a la API. El hecho de que exista una solicitud de red y deba reutilizarse debe almacenarse en algo que sobreviva a la función de renderizado. Hacer efectos secundarios solo durante el renderizado inicial requiere una caché externa. La caché debe comportarse de manera que borre y deseche el elemento después de un tiempo para evitar fugas de memoria. Si un componente se renderiza y monta, no debe ser recogido como basura, y React ejecutará una función de limpieza cuando el componente se desmonte. Con estos tres principios, puedes hacer efectos secundarios de manera segura durante el renderizado. Echa un vistazo a mi biblioteca, react-disposable-state, en el repositorio de github de Isograph.

Entonces, no podemos usar el estado o las referencias para almacenar información sobre la llamada a la API. Así que el hecho de que exista una solicitud de red y deba reutilizarse tiene que almacenarse en algo que sobreviva a la función de renderizado. Lo cual podría ser props, contexto, o un objeto global. Esto nos lleva a nuestro primer principio. Hacer efectos secundarios solo durante el renderizado inicial requiere una caché externa.

Vale. Entonces, hablemos de cómo debería comportarse esta caché. Considera ese modal. Lo renderizamos. Se suspende, lo que significa que React llama a su función de renderizado, pero no modifica el DOM para mostrar el componente al usuario. Luego, antes de que el componente se confirme, todo el árbol se desmonta porque el usuario navega a otra pantalla. En esta situación, React no nos dará ninguna indicación de que el componente nunca se montará. Así que cuando inicialmente colocamos el elemento en la caché, sería mejor también establecer un temporizador que limpie la caché y deseche el elemento, quizás, después de 30 segundos. De lo contrario, en situaciones como esa, tendremos fugas de memoria.

Vale entonces. ¿Qué pasa si el componente se renderiza y monta? Bueno, puede continuar renderizándose después, incluso después de que hayan pasado más de 30 segundos, y el componente aún necesitará acceso a esos data. Así que realmente no debería ser recogido como basura. Pero afortunadamente para nosotros, si un componente se monta, React necesariamente ejecutará una función de limpieza por lo que no necesitamos confiar en un temporizador para limpiar el elemento, lo que significa que un elemento no debería ser limpiado mientras un componente montado lo referencia, sino cuando ese componente se desmonta. Vale. Así que con estos tres principios, puedes hacer efectos secundarios de manera segura durante el renderizado. Tengo una biblioteca, react-disposable-state, en el repositorio de github de Isograph, donde expongo APIs extremadamente genéricas para hacer efectos secundarios durante el renderizado, y así sucesivamente. Espero que lo revises. Gracias. Que tengas un buen día.

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 Conference 2022React Advanced Conference 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.
React Query: ¡Es hora de romper con tu "Estado Global"!
React Summit Remote Edition 2020React Summit Remote Edition 2020
30 min
React Query: ¡Es hora de romper con tu "Estado Global"!
Top Content
Global state management and the challenges of placing server state in global state are discussed. React Query is introduced as a solution for handling asynchronous server state. The Talk demonstrates the process of extracting logic into custom hooks and fixing issues with state and fetching logic. Optimistic updates with mutation are showcased, along with the benefits of using React Query for data fetching and mutations. The future of global state management is discussed, along with user feedback on React Query. The Talk concludes with an invitation to explore React Query for server state management.
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.
Anunciando Starbeam: Reactividad Universal
JSNation 2022JSNation 2022
27 min
Anunciando Starbeam: Reactividad Universal
Starbeam is a library for building reactive user interfaces with JavaScript, similar to Svelte, Vue, and Ember. It provides a data structure and query feature for filtering and sorting. The useStarBeam function ensures JSX reconciliation only occurs when reactive dependencies change. Starbeam tracks every read and write operation to update the component accordingly. It can be used with React and other frameworks, and offers debugging tools and locale integration.
Pensando en React Query
React Summit 2023React Summit 2023
22 min
Pensando en React Query
Top Content
React Query is not a data fetching library, but an Asian state manager. It helps keep data up to date and manage agent life cycles efficiently. React Query provides fine-grained subscriptions and allows for adjusting stale time to control data fetching behavior. Defining stale time and managing dependencies are important aspects of working with React Query. Using the URL as a state manager and Zustand for managing filters in React Query can be powerful.

Workshops on related topic

Aventuras de Renderizado Concurrente en React 18
React Advanced Conference 2021React Advanced Conference 2021
132 min
Aventuras de Renderizado Concurrente en React 18
Top Content
Featured WorkshopFree
Maurice de Beijer
Maurice de Beijer
Con el lanzamiento de React 18 finalmente obtenemos el tan esperado renderizado concurrente. Pero, ¿cómo va a afectar eso a tu aplicación? ¿Cuáles son los beneficios del renderizado concurrente en React? ¿Qué necesitas hacer para cambiar al renderizado concurrente cuando actualices a React 18? ¿Y qué pasa si no quieres o no puedes usar el renderizado concurrente todavía?

¡Hay algunos cambios de comportamiento de los que debes estar al tanto! En esta masterclass cubriremos todos esos temas y más.

Acompáñame con tu portátil en esta masterclass interactiva. Verás lo fácil que es cambiar al renderizado concurrente en tu aplicación React. Aprenderás todo sobre el renderizado concurrente, SuspenseList, la API startTransition y más.
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.
Comenzando con Suspense y Renderizado Concurrente en React
React Summit 2020React Summit 2020
125 min
Comenzando con Suspense y Renderizado Concurrente en React
Featured Workshop
Maurice de Beijer
Maurice de Beijer
React sigue evolucionando y haciendo que las cosas difíciles sean más fáciles para el desarrollador promedio.
Un caso en el que React no era particularmente difícil pero muy repetitivo, es trabajar con solicitudes AJAX. Siempre hay una trinidad de estados de carga, éxito y posibles errores que deben manejarse cada vez. Pero ya no, ya que el componente `<Suspense />` facilita mucho la vida.
Otro caso es el rendimiento de aplicaciones más grandes y complejas. Por lo general, React es lo suficientemente rápido, pero con una aplicación grande, la renderización de componentes puede entrar en conflicto con las interacciones del usuario. El renderizado concurrente se encargará de esto, en su mayoría de forma automática.
Aprenderás todo sobre cómo usar <Suspense />, mostrar indicadores de carga y manejar errores. Verás lo fácil que es comenzar con el renderizado concurrente. Harás que el suspense sea aún más capaz combinándolo con el renderizado concurrente, el gancho `useTransition()` y el componente <SuspenseList />.
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.