Por Qué React No Debería Adoptar Signals

Rate this content
Bookmark

Knockout lo tuvo primero, Vue siempre lo estuvo ocultando, Solid lo hizo popular, y ahora Svelte y Angular también lo están integrando: reactividad basada en signals. Si todos estos otros frameworks se apoyan en este primitivo especial, ¿debería React hacer lo mismo?

En esta charla, examinaremos los inconvenientes menos discutidos de los signals y explicaremos por qué creo que React debería apegarse a su enfoque actual de valores y funciones simples.

This talk has been presented at React Advanced 2024, check out the latest edition of this React Conference.

Andreas Roth
Andreas Roth
10 min
28 Oct, 2024

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Hoy quiero hablar sobre por qué React no debería adoptar signals. Al adoptar signals en React, podemos rastrear automáticamente las dependencias para efectos y memos, lo que lleva a una representación de componentes más eficiente. Acceder a partes específicas del JSX que leen signals permite una reactividad más detallada a través de los límites de los componentes. Adoptar signals en React requiere migrar a componentes de ejecución única, que solo actualizan partes específicas de la aplicación. Esto puede volverse complejo cuando se trata de componentes que leen de diferentes signals. En contraste, React asume que todo puede cambiar y refuerza esta suposición a través de linters y compiladores, lo que lleva a un código más robusto y actualizaciones más fáciles. Si estás interesado en signals en React o necesitas mejoras de rendimiento, ¡hablemos!

1. React and signals

Short description:

Hoy quiero hablar sobre por qué React no debería adoptar señales. Una señal es un contenedor estático con funciones para establecer y recuperar valores. Diferentes frameworks usan señales internamente con sintaxis variables. Al adoptar señales en React, podemos rastrear automáticamente las dependencias para efectos y memos, lo que lleva a una representación de componentes más eficiente.

Hola a todos desde Dresde en Alemania. Espero que estén teniendo una conferencia increíble hasta ahora. Solo tengo 10 minutos, así que vamos directo al tema.

Hoy quiero hablar sobre por qué, en mi opinión, React no debería adoptar señales. Para entrar en esto, primero tenemos que discutir el elefante en la habitación, la señal. ¿Qué es exactamente una señal? Como pueden ver aquí, una señal se crea con una función o un constructor con una nueva señal o lo que sea. Obtienes un contenedor de vuelta, y este contenedor generalmente tiene dos funciones, una para establecer el valor y otra para recuperar el valor. Eso significa que es un contenedor estático que defines una vez y luego puedes seguir leyendo y escribiendo valores desde este único contenedor estático. Siempre tienes una función para escribir y para leer el valor, ya sea que eso sea una llamada directa a la función o si es solo acceder a una propiedad que tiene una función getter detrás de escena. Por supuesto, la sintaxis varía entre frameworks. Frameworks como Solid, Angular o Vue.js usan algo como señales internamente con sintaxis variable. Al final, siempre es lo mismo, un contenedor estático con dos funciones, una para establecer y otra para obtener para recuperar el valor. Si eso es un conjunto de propiedades o un getter, no importa al final, son llamadas a funciones.

Ahora, la pregunta es ¿por qué querríamos adoptar señales en algo como React? Ya tenemos estados. El primer beneficio es que podríamos rastrear automáticamente las dependencias para efectos o para memos. Aquí, como pueden ver, esta es la sintaxis de Solid.js, pero se parece mucho a React, así que podemos echarle un vistazo. Pueden ver que estamos creando la señal en la primera línea y luego estamos usando un efecto para siempre registrar el número cada vez que el número cambia. Además, tenemos este número doble donde tenemos un memo, donde solo accedes al número, llamas a la función para recuperar el valor y lo multiplicas por dos. Al llamar a la función, las dependencias pueden registrarse automáticamente. Cada vez que el número cambia, está totalmente claro que el efecto necesita volver a ejecutarse y nuestro memo necesita volver a ejecutarse. Esto funciona automáticamente sin que tengamos que especificar las dependencias como en React actualmente. Esto también puede llevar a una representación de componentes más eficiente. Si observas este ejemplo, tenemos un componente superior, un componente medio y el componente inferior. El superior renderiza el medio, renderiza el inferior. Como pueden ver en la parte superior, estamos definiendo y creando la señal, un contenedor estático. Lo estamos pasando al componente medio y este solo toma este contenedor y lo reenvía al componente inferior, donde se usa el valor. Como pueden ver en el componente medio, la señal nunca se lee. Solo se reenvía a alguien más. Ahora, si pudieras imaginar un futuro donde el framework solo volvería a renderizar los componentes donde la señal es realmente leída, no necesitaríamos cosas como React.Memo o un shouldComponentUpdate o algo así. Podríamos simplemente actualizar siempre esos componentes que leen una señal solo si la señal cambia.

2. Reactivity and component boundaries

Short description:

Esto no cambiaría nuestro modelo mental, pero podría rastrear actualizaciones de componentes sin renderizar de arriba a abajo. Acceder a partes específicas del JSX que leen señales permite una reactividad detallada a través de los límites de los componentes.

Esto realmente no cambiaría nada sobre nuestro modelo mental, porque todavía podría volver a ejecutar todo el componente, pero podría rastrear automáticamente qué componente necesita actualizaciones sin tener que renderizar desde la parte superior hasta la inferior.

Si observamos este último ejemplo, el componente inferior, y tal vez si hacemos esto un poco más complicado, entonces podemos ver un hecho aún más interesante. Aquí creamos otra señal y estamos registrando la señal y luego estamos leyendo las props, el número en el JSX. Pero solo estamos accediendo a la señal en esta pequeña parte del JSX, en estas llaves. También debería ser posible solo actualizar esta parte específica en el Rome, porque nadie más en toda la aplicación está siquiera leyendo la señal. Esto luego lleva al santo grial, reactividad detallada a través de los límites de los componentes.

Cada vez que actualizamos una señal, solo esas partes específicas que leen la señal, no importa si es un efecto, un memo o una parte en el JSX, solo esos componentes que realmente consumen la señal deberían actualizarse cada vez que la señal cambia.

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

SolidJS: Reactivity Unchained
JSNation 2022JSNation 2022
20 min
SolidJS: Reactivity Unchained
Solid.js is a declarative JavaScript library for building user interfaces that addresses performance optimization. It introduces fine-grained reactivity and avoids using a virtual DOM. The Talk explores rethinking performance and reactivity in web applications, understanding reactivity and primitives, and creating DOM elements and using JSX in Solid.js. It also covers rendering components, sharing state, and the advantages of fine-grained rendering and the reactive approach in Solid.js.
5 Años de Construir React Table
React Summit 2022React Summit 2022
24 min
5 Años de Construir React Table
Top Content
React Table is a popular table library that started with HTML5 tables and transitioned to React. It faced challenges with integration and user requests, leading to the development of React Table. The introduction of the Headless UI pattern and TypeScript support improved the library's capabilities and quality. Generics and TypeScript played a significant role in reducing the code size and improving development. React Table is now going framework agnostic and partnering with AG Grid.
Gestión de Estado Moderna con Vue 3
Vue.js London Live 2021Vue.js London Live 2021
22 min
Gestión de Estado Moderna con Vue 3
Top Content
Vanessa introduces Vue Free and discusses the benefits of using the Composition API. The order of execution and grouping logical units using the Composition API is explained. The Composition API is used for state management and refactoring components. The speaker shares their initial experience with state management using Vuex. Composables are explored as an alternative for state management in Vue 3.
Llevando Vue.js al Backend
Vue.js London Live 2021Vue.js London Live 2021
23 min
Llevando Vue.js al Backend
This talk explores using Vue.js in the backend, specifically focusing on Vue 3 Reactivity. It discusses how Vue 3 Reactivity leverages ES6 proxies to update changes and intercept hooks. The talk also covers implementing Vue.js backend with live demos, showcasing the modification of proxies and the use of reactive functions. It demonstrates the creation of a reactive array and the implementation of join, leave, and message functionalities. The talk concludes by mentioning the possibility of using computed properties and inviting further questions.
Reactividad de Grano Fino Sin Ningún Compilador
React Day Berlin 2024React Day Berlin 2024
29 min
Reactividad de Grano Fino Sin Ningún Compilador
My name is Nicolas, and today, I'm going to talk about Fine-Grain Reactivity without the compiler this time. React is reactive, but it re-renders unnecessary components. Fine-grained reactivity is achieved by updating specific elements instead of whole components. Pigment encountered reactivity problems while building real-time financial data boards. They created their own reactive system on top of React to achieve fine-grained reactivity. They used custom hooks like useShell, useComputed, and useWatch to integrate React with their reactive system. They also considered using native JavaScript for optimization but chose to preserve React. They use external libraries like Zestand for flexibility, and maintaining reactivity during React updates has not been a problem.

Workshops on related topic

Construye una Biblioteca Universal de Datos Reactiva con Starbeam
JSNation 2023JSNation 2023
66 min
Construye una Biblioteca Universal de Datos Reactiva con Starbeam
WorkshopFree
Yehuda Katz
Yehuda Katz
Esta sesión se centrará en los bloques de construcción universales de Starbeam. Usaremos Starbeam para construir una biblioteca de datos que funcione en múltiples frameworks.Escribiremos una biblioteca que almacene en caché y actualice datos, y admita relaciones, ordenación y filtrado.En lugar de obtener datos directamente, funcionará con datos obtenidos de forma asíncrona, incluidos los datos obtenidos después de la representación inicial. Los datos obtenidos y actualizados a través de web sockets también funcionarán bien.Todas estas características serán reactivas, por supuesto.Imagina que filtras tus datos por su título y luego actualizas el título de un registro para que coincida con el filtro: cualquier resultado que dependa de los datos filtrados se actualizará para reflejar el filtro actualizado.En 90 minutos, construirás una increíble biblioteca de datos reactiva y aprenderás una nueva herramienta poderosa para construir sistemas reactivos. La mejor parte: la biblioteca funciona en cualquier framework, incluso si no piensas en (o dependes de) ningún framework al construirla.
Tabla de contenidos- Almacenar un registro obtenido en una celda- Almacenar múltiples registros en un Mapa reactivo- La iteración reactiva es una iteración normal- El filtrado reactivo es un filtrado normal- Obtener más registros y actualizar el Mapa- La ordenación reactiva es una ordenación normal (¿se está volviendo un poco repetitivo?)- Modelar la invalidación de la caché como datos- Bonus: relaciones reactivas