XState: el futuro visual de la gestión de estados

Rate this content
Bookmark

Aprende cómo la modelización de estados con máquinas de estado y gráficos de estado puede mejorar la forma en que desarrollas tus aplicaciones React, y obtén un adelanto de herramientas visuales nunca antes vistas que llevarán la gestión de estados al siguiente nivel.

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

FAQ

XState es una biblioteca diseñada para representar máquinas de estado y gráficos de estado de una manera que pueda ser codificada de manera limpia y visualizada automáticamente. Fue creada para ayudar a los desarrolladores a manejar la lógica de la aplicación de forma más organizada y predecible, separando los comportamientos en estados finitos y especificando transiciones basadas en eventos.

XState ayuda en la gestión de estado al proporcionar un formalismo visual que organiza la lógica de la aplicación en estados y eventos de manera clara. Esto simplifica el modelo mental y previene estados imposibles, asegurando que las transiciones entre estados sean explícitas y evitando comportamientos inesperados.

Los gráficos de estado jerárquicos, o HIGRAPHs, son una extensión de las máquinas de estado que permite agrupar estados relacionados para manejar complejidades mayores sin sufrir de explosión combinatoria de estados y transiciones. Facilita la representación de transiciones comunes y la organización de la lógica de manera más eficiente.

XState ofrece varias utilidades para integrarse fácilmente con React, como los hooks 'useMachine' y 'useInterpret', que permiten manejar estados de manera más declarativa y modular. Estas herramientas facilitan la implementación de lógicas complejas y permiten un mejor manejo del estado global y local en aplicaciones React.

Sí, XState es agnóstico al framework, lo que significa que puede utilizarse con cualquier framework de JavaScript como Vue, Angular, Svelte, entre otros, además de React. Está diseñado para ser fácilmente integrable con cualquier tecnología que acepte la gestión de estado basada en máquinas de estado.

Las máquinas de estado finito en XState son estructuras que representan distintos estados de un 'actor' y cómo este responde a eventos específicos. Cada estado puede realizar acciones o cambiar a otro estado en respuesta a un evento, lo que permite modelar el comportamiento de aplicaciones de manera precisa y predecible.

David Khourshid
David Khourshid
35 min
14 May, 2021

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Esta charla introduce el futuro visual de la gestión de estados y cómo XState lo está convirtiendo en realidad. Explica el papel de los reductores en la contención de la lógica de la aplicación y cómo las máquinas de estado y los gráficos de estado proporcionan una forma visual y matemáticamente rigurosa de representar comportamientos. XState se integra fácilmente con React y otros marcos, permitiendo la gestión de estados locales, globales y semi-locales. La charla también destaca las nuevas características de XState, como el uso de TypeScript para una tipificación más fuerte y la introducción del gancho useSelector para mejorar el rendimiento. La visión futura incluye la combinación de diagramas y código, con herramientas como Stately.ai, y la importancia de la modelización explícita de la lógica de la aplicación utilizando máquinas de estado.

1. Introducción al Futuro Visual de la Gestión de Estado

Short description:

Hola a todos. Mi nombre es David Courchide. Hoy quiero hablarles sobre el futuro visual de la gestión de estado y cómo XState va a hacer realidad esa visión futura. Las máquinas de estado y los gráficos de estado son diagramas visualmente exactos que transmiten relaciones de una manera visualmente inequívoca. Tienen sus propias notaciones especiales y son lenguajes matemáticamente rigurosos. Recomiendo leer el artículo de David Harrell sobre formalismos visuales para obtener más información.

Hola a todos. Mi nombre es David Courchide. En línea en Twitter, GitHub, lo que sea, me conocen como David K. Piano. Y hoy quiero hablarles sobre el futuro visual de la gestión de estado y cómo XState va a hacer realidad esa visión futura.

Entonces, hablando de visuales, probablemente sepan lo que es un diagrama de Venn. Es una forma visual y exacta de representar las similitudes entre dos o más cosas diferentes. Y también es posible que hayan usado un diagrama de secuencia antes para describir cómo las diferentes partes de un sistema se comunican entre sí. Entonces, también existen las máquinas de estado y los gráficos de estado, por supuesto, de los que he estado hablando durante un tiempo.

Y las máquinas de estado y los gráficos de estado caen en esta categoría de diagramas visualmente exactos. Porque diagramas como estos son realmente útiles para transmitir relaciones de una manera visualmente inequívoca, y cada uno tiene sus propias notaciones especiales para denotar cosas específicas. Y entonces, con los gráficos de estado, tenemos el mismo tipo de cosa. Tenemos flechas y cajas que describen cómo los estados y la lógica pueden fluir con el tiempo. David Harrell, quien es el inventor de los gráficos de estado, llama a esto un formalismo visual. Y así, él describe que los formalismos visuales son diagramáticos e intuitivos, pero a la vez lenguajes matemáticamente rigurosos. Por lo tanto, a pesar de su clara apariencia visual, vienen completos con una sintaxis que determina lo que está permitido y la semántica que determina lo que pueden ser las cosas permitidas. Y entonces, recomiendo leer su artículo sobre formalismos visuales para obtener más información sobre esta idea realmente, realmente interesante de básicamente estos diagramas que son matemáticamente rigurosos y también ejecutables.

2. Lógica de Codificación y el Papel de los Reductores

Short description:

La forma en que normalmente codificamos la lógica de la aplicación no se presta a un formalismo visual. La lógica es difícil de entender y centralizar. Los reductores proporcionan una forma de contener la lógica en un lugar centralizado, forzando la interacción a través de eventos. Las máquinas de estado separan los comportamientos en estados finitos, representando los estados actuales y las respuestas a los eventos.

Entonces, la forma en que normalmente code la lógica de la aplicación, ya sea en React o en cualquier otra cosa, realmente no se presta a un formalismo visual o a cualquier otra cosa. Tendemos a co-ubicar data y lógica cerca de la fuente donde se utiliza, como en los manejadores de eventos o a veces en los hooks personalizados de React si queremos un poco más de organización.

Entonces, aunque esto puede ser conveniente para code, el problema es que la lógica es difícil de entender, especialmente a medida que cambia con el tiempo debido a eventos o cualquier cosa que pueda suceder dentro de la aplicación. El problema es que no puedes discernir qué puede suceder o cómo una aplicación puede responder a cualquier evento o señal en cualquier momento. Y entonces, esa lógica de conexión reside en la cabeza del desarrollador que añadió la lógica, lo cual realmente no es útil, y así terminas con cosas como lógica ad hoc también, ya sabes, que obviamente debería ser secada.

Pero el problema es que cuando añades esa lógica ad hoc, la lógica, cuando la secas, podrías ponerla en una función o algo así, y esa función puede terminar, ya sabes, siendo ella misma lógica ad hoc, simplemente viviendo en otro lugar. Así que todavía no estás centralizando todo, lo cual, ya sabes, definitivamente se convierte en un poco de un problema.

Y entonces entra el reductor, popularizado por Flux y las bibliotecas de gestión de estado como Redux, los reductores proporcionan una forma de contener esta lógica en un lugar centralizado y conveniente. Así que una restricción enormemente beneficiosa de los reductores es que te obliga a interactuar con la lógica enviando eventos o acciones, como se les llama en React y Redux. Por cierto, la denominación de acciones fue algo así como un error, al menos en mi opinión. Así que vamos a utilizar el término eventos en esta presentación. Pero aquí está por qué despachar eventos es realmente algo bueno. Te obliga a reificar lo que puede suceder en tu aplicación en cualquier momento dado. Así que el usuario puede hacer clic en un botón, una búsqueda puede resolver o rechazar, un temporizador puede apagarse. Todos esos son eventos. Y pensar en tu aplicación en términos de estado y eventos realmente simplifica el modelo mental, al menos en mi opinión.

Sin embargo, esto tampoco se visualiza fácilmente. Los reductores normalmente contienen declaraciones de cambio o declaraciones de si para discernir qué debería suceder cuando se recibe un evento, distinguiendo así cómo puede cambiar el comportamiento de tu aplicación. Y esto se vuelve mucho más difícil. Mezcla esas declaraciones de cambio y esas declaraciones de si. Y entonces tienes que juntar la lógica navegando a través de un montón de estas declaraciones y lógica defensiva sólo para discernir cuál puede ser el comportamiento de tu aplicación en cualquier momento dado en el tiempo. Todo está en una sola función. Y es difícil de desmontar.

Así que las máquinas de estado son como los reductores. E incluso pueden ser escritas como reductores. Pero en lugar de mezclar toda la lógica, separa limpiamente los comportamientos en lo que se conoce como estados finitos. Un estado finito representa un comportamiento, que es cuál es el estado actual de algún actor y cómo puede responder a los eventos. Así que podría responder a un evento realizando una acción o cambiando su comportamiento o cualquier cosa así. Y eso está representado por estas flechas de transición que van de estado a estado. O un evento podría no ser manejado, en cuyo caso el comportamiento por defecto es ignorar ese evento.

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.
Compilador React Forget - Entendiendo React Idiomático
React Advanced 2023React Advanced 2023
33 min
Compilador React Forget - Entendiendo React Idiomático
Top Content
Joe Savona
Mofei Zhang
2 authors
The Talk discusses React Forget, a compiler built at Meta that aims to optimize client-side React development. It explores the use of memoization to improve performance and the vision of Forget to automatically determine dependencies at build time. Forget is named with an F-word pun and has the potential to optimize server builds and enable dead code elimination. The team plans to make Forget open-source and is focused on ensuring its quality before release.
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.
Acelerando tu aplicación React con menos JavaScript
React Summit 2023React Summit 2023
32 min
Acelerando tu aplicación React con menos JavaScript
Top Content
Mishko, the creator of Angular and AngularJS, discusses the challenges of website performance and JavaScript hydration. He explains the differences between client-side and server-side rendering and introduces Quik as a solution for efficient component hydration. Mishko demonstrates examples of state management and intercommunication using Quik. He highlights the performance benefits of using Quik with React and emphasizes the importance of reducing JavaScript size for better performance. Finally, he mentions the use of QUIC in both MPA and SPA applications for improved startup performance.
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.
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.

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.