Voy a simplificarlo aún más aquí con fines de demostración, pero todo comienza con signals como vimos. Y en su núcleo, simplemente ves una signal como un par de funciones getter y setter que cierran sobre un valor. Por supuesto, hay un poco más que eso. Y para eso, vamos a necesitar suscripción.
Así que actualicemos nuestras signals, hagamos un poco más. Ahora al leer lo que queremos hacer es verificar si hay un observador actual. Y si lo hay, vamos a agregarlo a un nuevo conjunto de suscriptores que creamos cuando creamos nuestra signal. A la derecha, todavía actualizamos nuestro valor, pero ahora en realidad iteramos sobre esos suscriptores y los llamamos para básicamente notificarlos de que algo ha cambiado. Y eso que necesita ser notificado son nuestros effects, que son el otro lado de nuestra ecuación.
Aquí puedes ver la implementación para get current observer. Lo que tenemos es una pila. Este contexto es solo un array, contexto global. Y simplemente tomamos lo que está en la parte superior del array para ver qué se está ejecutando actualmente. Para nuestro effect en sí, cuando se crea, se ejecuta inmediatamente. Y luego pasa por el ciclo de limpiar dependencias o suscripciones, empujarse a sí mismo en esa pila, para que cuando ejecutemos la función proporcionada, esté allí y pueda ser agregado a las suscripciones. Y finalmente, se sale de la pila. Voy a poner el código lado a lado, para que puedas ver esto mejor mientras revisamos nuestro ejemplo. Esencialmente, creamos nuestra signal, como nuestra signal de name, y devuelve nuestras funciones de lectura y escritura. Luego creamos nuestro effect. Se ejecuta, empujándose a sí mismo en esa pila. Luego ejecuta la función y lee de nuestra signal de name, en cuyo punto ve el observador actual, que es ese effect, y lo agrega a sus suscriptores. Luego lo registra en la consola y el effect termina de ejecutarse, saliéndose de la pila. Algún tiempo después, nuestra signal se actualiza, lo que establece el nuevo valor y luego ejecuta nuestra lista de suscriptores. En este caso, es ese effect, que lo ejecuta de nuevo, limpiando las dependencias y simplemente comenzamos todo el ciclo de nuevo. Y eso es realmente todo. A partir de ahí, podemos construir una base para otras primitivas. Muchas de ellas no son esenciales. Pueden ser utilizadas según sea necesario, pero un ejemplo de algunas importantes que se envían con Solid son createMemo, que puede ser utilizado para almacenar en caché cálculos costosos, createStore, que es un proxy que permite reactividad profundamente anidada, y createResource, que es nuestra primitiva de primera mano para la obtención de datos y suspense. Pero suficiente sobre reactividad por ahora. Volvamos a nuestro ejemplo.
Comments