This graph shows how many times the word ______ has been mentioned throughout the history of the program.
¿Qué es lo último que hicimos en nuestra aplicación?
Es una acción que era del tipo ToggleImportant,
de forma que podÃamos cambiarle la importancia a una nota.
Pero esto todavÃa no lo hemos implementado en nuestra aplicación, ni siquiera.
Hicimos TDD para implementar este reducer para gestionar este nuevo estado,
para decirle, vale, ten, aquà tienes una nueva nota y le tienes que cambiar la importancia.
Vamos a hacer un formulario para crear notas.
Las estábamos haciendo en el punto de entrada de nuestra aplicación aquÃ
y las estábamos añadiendo, ves, manualmente.
HacÃamos un StoreDispatch y estábamos añadiendo esto.
Voy a eliminarlo, voy a comentarlo por ahora.
Y al guardar los cambios, volver aquÃ, pues, ves, ahora no hay notas.
Asà que vamos a ir aquà abajo, vamos a añadir un div.
Esta lista desordenada, ¿vale? La vamos a poner por aquÃ.
Y aquà vamos a poner nuestro formulario.
Un formulario que va a tener un onSubmit, un método que vamos a ejecutar,
le vamos a poner un input, le vamos a poner aquà que esto es la nota
y le vamos a poner un botón que sea para añadir la nota.
El botón, cuando es el último botón de un formulario, por defecto es de typeSubmit.
Y aquà tendrÃamos nuestro método para crear la nota.
CreateNote o AddNote, ¿no? Mejor.
Este método lo vamos a poner por aquÃ.
En clases anteriores vimos cómo podÃamos manejar un formulario en React,
pero aquà no lo vamos a controlar.
Que no esté controlado, lo que quiere decir, básicamente,
es que no estamos guardando en el estado
en qué estado se encuentran justamente los valores de los inputs de dentro.
Taja de no hacerlo controlado es un tema de rendimiento.
La desventaja es que pierdes un poquito del control
y estás fiándote más de las cosas que hace el don por ti.
Y lo que vamos a hacer es recuperar lo que hayamos puesto aquà en la nota.
Vamos a ver cómo lo recuperamos.
Aquà tendrÃamos E.
Esta E es un event, que no lo he comentado
porque ya lo hemos visto más de una vez.
Lo que podemos hacer también es recuperar el target.
Digamos, el elemento que ha disparado este evento.
Asà que el target, ¿de dónde lo podemos sacar?
Pues del propio event.
Y aquà ya tendrÃamos el target.
Bueno, pues todo event.
Y aquà se llama el target, ¿vale?
Pues podemos acceder al elemento node por el nombre.
O sea que aquà tendrÃamos, si tenemos otro input con otro nombre,
pues podrÃamos poner target.node por el nombre
y extraer el valor.
Es el que vamos a necesitar a la hora de crear nuestra nueva nota.
Vamos a ponerle content, ¿no?
Directamente, que es el contenido de la nota.
Y asà será más fácil después de despachar la acción.
Otra cosa que podemos hacer,
esto serÃa una manipulación directa del DOM.
Como no estamos controlando con el state,
aquÃ, este input, lo que podemos hacer es lo que hacÃamos en la clase,
una de las clases que hacÃamos, ¿no?
Que una vez que guardábamos los campos del formulario,
reseteábamos.
En lugar de resetear el estado,
ahora lo que vamos a hacer es machacar en el DOM directamente ese texto.
Lo vamos a dejar con un string vacÃo y ya está.
Y ahora lo que podemos hacer es de la store,
que la tenemos aquÃ, ¿vale?
La store es un dispatch.
¿Y el dispatch para qué servÃa?
Pues justamente enviar acciones.
Para decir, vale, store, que sepas que ha ocurrido esto.
¿Y qué es lo que ha ocurrido?
Pues lo que ha ocurrido es que tenemos una nueva acción.
Notes created, ¿vale?
Es como que se ha creado una nueva nota.
Y le tenemos que decir, pues, la información.
Nosotros le estamos pasando con el payload toda la información.
En el payload es donde tendrÃamos el objeto
que describe toda la información.
Primero tendrÃamos el content.
TendrÃamos que decirle si es importante o no.
Justamente esto es lo que vamos a utilizar
para cambiarle si es importante o no una nota
con lo que hicimos del reducer.
También tendrÃamos que crearle una idea.
A ver, vamos a generar rápidamente la idea.
Como esto no es muy importante,
lo que voy a hacer es crear aquà un generate ID,
que sea un método que te genere un random, ¿vale?
Vamos a hacer un math floor de un math random
y este math random lo vamos a multiplicar
por un número muy grande y más uno.
Esto lo que nos va a dar es un número entre el uno
y el nueve, no, no, no, no, no, no, no, no.
Esto no es importante.
Esto seguramente lo harÃa el backend y ya está.
Por ahora, esto deberÃa funcionar.
Tengo aquà el formulario, pues, probando.
Aquà tendrÃamos nuestra nota.
What, midu, midu, ¿vale?
Y estas serÃan mis notas que tenemos justamente en la store.
Asà que crear notas, ya lo tenemos bien.
Otra cosa que podemos hacer, hombre,
cuando aquà ves que tenemos un lead,
que tiene una key y tenemos si es importante o no importante.
Hombre, ya que creamos el reducer
para cambiarle la importancia,
lo cierto es que podrÃamos darle un uso.
Creamos un método.
Se llama toggle important.
Al toggle important le vamos a pasar directamente
la ID de la nota que queremos cambiar su importancia.
O sea, que hacemos un store dispatch
y ¿qué le tenemos que pasar aqu�
El tipo, que el tipo lo tenemos justamente por aquÃ.
Es este.
Este es el tipo de la acción.
Pues el tipo es este.
Y el payload es, en este caso, un objeto
que hay que decirle la ID del que quieres cambiar la importancia.
Pues esta ID le va a llegar por parámetro.
Ahora, ¿dónde tenemos que ejecutar esto?
Bueno, asà que vamos a hacer que cada vez que se le haga clic
a todo el elemento lead, ¿vale?
De una nota, que vaya cambiando la importancia de esa nota.
Asà que cuando se haga clic, aquà vamos a ejecutar un método
que sea el toggle important con el node.id.
Ahora si le doy, podemos ver que va cambiando de important
a node.important.
Y esto es porque está haciendo el toggle,
o sea, que está funcionando correctamente todo.
Esto lo voy a eliminar, que no nos ayuda ya en nada, ¿vale?
Hay un tema que aquà ya, pues digamos que chirrÃa.
Y es el tema que cuando creamos una acción, ¿no?
Cuando estamos pasando una acción,
estamos haciendo un dispatch, le decimos,
oye, store, ha pasado esto, ¿no?
Y tenemos que crear todo este objeto entero y tal.
A ver, no es que esté mal, pero puedes ver que constantemente
estamos repitiendo las acciones, este contrato de la acción.
Para esto existe justamente una cosa en Redux,
que es parte del pattern o del patrón que se suele utilizar,
que son los action creators, o creadores de acciones.
¿Qué significa o qué es un creador de acción?
Un creador de acción, un action creator,
lo que hace es abstraer todo esto,
de forma que vamos a tener en un método
que le pasamos los parámetros mÃnimos que necesita
para crear esta acción de aquÃ.
Vamos a hacer una que sea un create node.
¿Y qué necesita este create node?
¿Vale? Que es justamente esto.
Esto es una action, es un objeto con el type y el payload.
Lo que vamos a hacer con este create node,
si te fijas, lo único que necesita serÃa el generate ID y el content.
El generate ID lo tenemos justamente fuera.
Al crear la nota necesitamos el content.
Pues como parámetro le vamos a pasar el content.
Pues lo que va a devolver es la acción.
Para eso se llama un action creator,
porque va a crear una acción.
La acción que va a crear el create node es justamente todo esto.
Y entonces, ¿por qué es importante esto?
Porque si tú tienes la creación del objeto aquÃ,
aparte de que no se puede reusar fácilmente,
en este caso solo tenemos un componente o tenemos todo a saco,
pero poco a poco lo vamos a ir separando.
Aparte de esto, es que el tener un contrato,
un string repetido en diferentes sitios es bastante peligroso.
No te fÃes de los strings.
Asà que lo que vamos a hacer justamente esta función
es dejar de tener que crear este objeto constantemente
y saber todos los detalles del payload y tal.
Lo que hacemos aquà es el create node,
le pasamos el content y nos devuelve el objeto que necesitamos,
o sea, la acción.
Este create node lo vamos a poner aquÃ
y cuando hagamos el dispatch,
lo que hacemos es un create node y le pasamos el content.
¿Qué estamos diciéndole a esto?
Es, haz un dispatch de la acción que estás creando aquÃ,
con este action creator.
Nos devuelve el objeto que es la acción,
que la tenemos aquà y ya estarÃa.
Lo mismo exactamente podrÃamos hacer con el toggle importance of
y le ponemos aquà la id.
Esto es una forma de leerlo, ¿no?
Cambia la importancia de la id.
Lo mismo, hacemos esto y esto,
en lugar de hacerlo aquÃ,
de hacer todo este objeto aquà manualmente,
lo que podemos hacer es ponerlo aquÃ.
Está bien que conozcas un poco este pattern de Redux,
pero también es algo que puedes utilizar más allá de Redux.
En lugar de hacer el dispatch de este objeto,
lo que hacemos es toggle importance of the id.
Primero voy a ver que todo funciona correctamente.
Súper importante siempre asegurarnos que las cosas,
cuando hacemos unos pocos,
aunque sean pocos cambios,
pues vamos, probamos,
oye, funciona bien, sÃ.
Vale, perfecto.
Y vamos tirando.
Antes de seguir ahà haciendo cambios
y luego de repente,
oye, ¿por qué no funciona esto?
Bueno, ahora que ya sabemos que funciona esto bien,
una cosa que justamente podemos hacer
para reutilizar estos métodos
es sacarlos de aquÃ.
Estos dos métodos que tenemos por aquÃ,
incluso Generate ID,
porque no es importante para este componente,
los voy a cortar.
Y lo que voy a hacer es llevármelo al NodeReducer este.
Y los voy a poner aquÃ.
Y ahora, de este, este Create Node,
lo que puedo hacer es exportarlo
y esto también lo puedo exportar.
Asà que, de esta forma,
cada vez que quiera utilizar estas acciones,
lo que puedo hacer es llamar directamente
al Create Node y el Toggle Importance
e importarlos.
Igual que hago aquÃ,
que estoy importando el Reducer,
pues ahora puedo hacer el Create Node
y el Toggle Importance.
Pues ya empieza mi componente
a dejar de estar tan hinchado, ¿no?
Y tener, además, tantos detalles
de cómo tiene que gestionar el estado,
que no tiene mucho sentido.
Pero todavÃa me chirrÃan unas cuantas cosas.
A mà lo que me gustarÃa, en realidad,
es empezar esta aplicación
que ahora mismo es un componente
de arriba a abajo
que tiene todo.
Lo tiene todo.
Mira, es que encima estamos
en el punto de entrada de la aplicación.
O sea, ni siquiera, como puedes ver,
la Store cuando se está suscribiendo
y entonces está renderizando toda la app.
Esto es porque hemos aprendido Redux
y cómo utilizar Redux asÃ, en Vanilla,
sin ningún tipo de conexión con React.
Y funcionar funciona.
Estamos viendo que Redux
es totalmente agnóstico
a la librerÃa,
a la biblioteca de UI que utilicemos.
Esto mismo lo podrÃamos utilizar
en un montón de librerÃas,
incluso con JavaScript puro y duro.
Y eso es lo importante, ¿no?
Entender que Redux
es algo que puede funcionar
de forma totalmente separada en React.
Pero, obviamente,
vamos a intentar llevar esto
a un nivel superior
porque esto no es la forma correcta
de que funcione renderizar
otra vez toda la aplicación.
Lo que vamos a querer
es que esté mejor integrado Redux con React.
Para ello, ¿cómo lo vamos a hacer?
Primero, antes de nada...