¡Así es cómo Solid Js lo hace!
Tags: webdev, react, solidjs, spanish
Published: 2023-04-24 18:46:55

Los que nos gusta y venimos de experiencias con React nos va a encantar Solid js.
En síntesis, podemos decir que la mayor ventaja de Solid sobre React radica en dos puntos principales: 
1. Tamaño del Bundler: En Solid es más ligero porque ya contiene módulos que en React se manejan como lib de terceros.
2. Signal por States: Lo que es completamente diferente al comportamiento del state en React de re-renderizar el componente cada que el estado cambie. Eso pasa por el algoritmo [Diffing & Reconciliation](https://legacy.reactjs.org/docs/reconciliation.html#the-diffing-algorithm). Si no estás familiarizado, te dejo el link para que entiendas el concepto detrás del algoritmo.

Solid, por su parte, crea señales (signals) directamente en elementos del DOM que inteligentemente percibe que podrían cambiar, previniendo así, re-renderizar el componente al actualizar el elemento.

Ya que hemos sacado del camino lo que todos sabemos de Solid Js, quiero enfocarme en algunas diferencias en la API de Solid con respecto a React para comparar como lo hace React y mostrarte cómo lo hace Solid js.

1. useState - createSignal.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cu1qukn2qilbngab1sg4.png)

Mientras que state crea un valor, signal crea una señal que es un método a cuyo valor se accede al ser invocado, por eso los paréntesis. La Función setCounter cumple la misma función para ambas herramientas.
La sintaxis puede variar un poco, sin embargo:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1y5gaab6pkp38pyft2fa.png)


2. Eventos
Si bien vimos en las imágenes anteriores que el evento onClick no cambia de React a Solid, sí el método para los inputs. En React lo llamamos onChange, y en Solid será onInput:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zbgvo3pxst4kd1xy1cpb.png)

3. useEffect - createResource
Si bien el useEffect es una de las herramientas más populares de React, también es requiere mucha atención para no terminar ejecutando código (típicamente asíncrono) más veces del que debería. Con frecuencia vemos algo así en nuestra consola con un solo fetch, contra lo que tenemos que juntar cabezas para crear una solución performante:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2th2ptv3m0mbwh1zgv1l.png)

Entonces, Comparemos:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jxpww10hcc7thja8n9z5.png)

Usando el hook createResource que viene directamente de solid-js sin la ayuda de effectos para ejecutar la función en montaje.

4. Ternarios y múltiples elementos.
Una de las prácticas más comunes en React es la del método .map() para renderizar varios elementos y dinamizar los valores del mismo. Esta práctica usualmente involucra un ternario (hay muchas otras opciones, es verdad) pero quedémonos con la más común, que es la crear un ternario para evaluar si el estado ya se ha populado y puede ser mappeado. Algo así:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jr96xfk2d6abtx6m94v0.png)

Este es un escenario bastante común en React. Estas mismas lineas de código pueden existir en Solid y funcionaría sin problemas, pero Solid tiene una solución más sofisticada:

A. Para el ternario, utiliza una etiqueta que se llama <Show/> que se importa de "solid-js" y recibe dos atributos, when={_// aquí se hace la evaluación de la condición_} fallback={_//aquí ponemos lo que queremos renderizar mientras el valor de la señal cambia_} Quedando de esta manera:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u2vhke6uo466esikcp47.png)

B. A pesar de <Show/> a estas alturas, aun estamos codeando muy "Reactive". Solid ofrece otra alternativa a los elementos que se quieren renderizar de forma dinámica. En esta ocasión es otra etiqueta que se llama <For /> que también se importa de "solid-js" y recibe un atributo each={_//Aquí depositamos el arreglo de valores_} de hecho, tuve que forzar un error sintáctico el la imagen anterior para evitar el error de eslint en el que Solid me recomienda usar esa etiqueta:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0cwdrstqzu2hxnpc8d9o.png)

5. Routes.
En React, el enrutamiento típicamente se trabaja con "react-router-dom". Durante este momento es bastante oportuno hacer code splitting usando lazy y Suspense... Estos dos elementos siguen presentes en Solid. Sin embargo, a lo que me refiero es a esto:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4pvxxgdiok4rv2mkskuz.png)

Esto es en React, que se importa de esta librería:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q41eq33abc1s7bpt7agf.png)

Ahora, "react-router-dom" también tiene otros elementos que son muy útiles, como: 
a. <Link />
b. useParams

Ahora, Solid ya tiene en sí un módulo de enrutamiento al que podemos importar de "@solidjs/router"

Este módulo contiene: 
a. <Routes/>
b. <Route/>
c. <A/> /=> que es la versión <Link /> de Solid
d. useParams

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9d0x3jlf0q6krkimi4ry.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dyd5rjfe97gjbyzbib2z.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5zf6ihnnq46jmrr2axem.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b7s8qtssydzyl0sglgiq.png)

Con esto termino mi blog de comparación de ambas herramientas. Venir desde React hace que aprender Solid sea muy fácil, y nos ayuda a apreciar las mejoras que ofrece.

Espero que este contenido haya sido útil.