This graph shows how many times the word ______ has been mentioned throughout the history of the program.
Asà que vamos con el tema de recuperar información del servidor que me parece súper interesante. Aquà habla de utilizar el JSON server. Es un servicio súper interesante que os recomiendo un montón que lo miréis porque esto es lo que os permite
es como falsear una REST API. REST al final es una arquitectura que se utiliza mucho en las APIs que lo que te permite es trabajar con recursos
y utilizar sus endpoints, su dirección, utilizando diferentes acciones sobre esas direcciones. Puedes leer el recurso, actualizar el recurso, borrar el recurso
y está bastante interesante. De hecho, es la forma de arquitectura más tÃpica de APIs que hay hoy en dÃa.
Aunque más adelante veremos que aparte la alternativa ahora serÃa utilizar GraphQL, que es totalmente compatible una con otra.
A mà me gusta mucho este servicio, el JSON placeholder, que está basado justamente en el JSON server, que es exactamente lo mismo.
Pero esto está, digamos, en internet y entonces esto le da un poquito más de sentido a hacerlo en tu aplicación que no tenerlo en local, ejecutándose y tal.
Asà que lo que podemos hacer es transformar nuestra aplicación para que utilice esta API.
Vamos a hacer como lo podrÃamos hacer. Vamos a copiar primero, podrÃa copiar, ah, que por cierto, os recomiendo bastante esta extensión,
JSON formatter, para justamente cuando entráis a una API verla bien asà de esta forma, formateada, que si no lo vais a ver, súper chungo, ¿vale?
No lo vais a ver asà de bonito.
Vale, pues esta serÃa como lo está utilizando. TendrÃa user ID, ID, title y body.
Pues por ahora, lo que vamos a hacer aquÃ, vamos a cambiar un poco.
Uy, he abierto sin querer el Visual Studio Code.
Vamos a cambiar nuestra aplicación que tendrÃa ID, user ID, title.
Pues esto sea el body.
Aquà es, por ejemplo, el title.
Y podrÃamos poner, no sé si copiármelo directamente.
SÃ, ¿no? Vamos a copiarlo.
Copiar. A ver si esto se copia bien.
Y de esta forma ahora lo arreglaremos.
Esto por aquÃ, esto por aquÃ, por aquÃ.
Venga.
Las notas, obviamente, no se muestran, ¿no?
Porque no sé exactamente qué es loco.
De hecho, esto ahora serÃa otra cosa.
Al final, lo que podemos hacer es ver dónde estábamos pasando toda esta información.
No tenÃamos categorÃas, esta categorÃa afuera.
El de tenemos, tendrÃamos aquà el title y el body.
Title y body.
Y esto, justamente, hay una cosa interesante aquÃ,
que es que si hubiéramos utilizado lo de enviar todo el archivo,
o sea, todo el objeto, ahora tendrÃamos que hacer menos cambios.
Esto es una ventaja, justamente, de algo que hemos hablado antes.
¿Veis? Yo ahora aquÃ, como estoy haciendo esto,
ya no tengo que preocuparme de volver a cambiar aquà todas las props.
Esto es una ventaja de hacerlo asÃ.
Como veis, todo tiene sus ventajas y sus desventajas, ¿vale?
No es tan sencillo como decir, ah, no, esto de esta forma y esta de otra, ¿vale?
Esto, el filtro, pues nada, lo vamos a eliminar,
porque este filtro ya no tiene sentido.
Vamos a quitar todos estos filtros.
Filtro fuera.
Filtro fuera, ¿vale?
Y esto del formulario, no sé si dejarlo, a ver, date.
Este date, es que se está quejando este date,
no sé de dónde está, no sé de dónde se está quejando.
Ahora, vale.
Por ahora lo vamos a dejar asÃ.
Esto vamos a transformarlo también, id, title y body,
pues vamos a dejar aquà title y body y vamos a poner que sea justamente lo mismo, ¿vale?
Ya lo tendrÃamos.
Pam.
Para crear el estado tendrÃamos asÃ.
Pero por ahora, si añadimos aquÃ, pues se volverÃa a añadir.
He puesto que el title y el body sean el mismo, pero bueno,
básicamente lo que estamos haciendo es igualarnos al playholder que tenÃamos aquÃ.
Ahora tendrÃamos un user id,
pero lo importante es que más o menos es exactamente lo mismo,
con el title y el body.
Aquà tendrÃamos este contrato ahora, ¿vale?
PodrÃamos añadir notas que sean exactamente lo igual y ya está.
Ahora, lo interesante de esto es que esto tenÃamos aquà las notas
que las tenÃamos creadas,
pero ¿cómo podemos hacer que podamos recuperar esta información
desde una API externa totalmente para verlo en nuestra aplicación?
De hecho, aquà podemos ver este post que tenemos aquÃ
que nos devuelve toda esta información.
No sé si hay, me imagino que sÃ, a ver, no, no hay forma.
PodrÃamos recuperar todos estos posts y mostrarlos y ya está.
Como ya nos hemos asegurado que el contrato del objeto
es exactamente el mismo, pues no deberÃamos tener ningún problema.
¿Cómo podemos hacer esto?
¿Dónde debemos que hacer esto?
Si volvemos a nuestra app, veis que aquà estamos recibiendo por props,
estamos recibiendo este props.notes, ¿vale?
Pues esto lo vamos a eliminar.
Vamos a quitar todas estas notas que tenÃamos aquà a mano
y ya no le va a llegar por props absolutamente nada de esto, ¿vale?
Venga, habÃamos dicho que una buena práctica
era inicializar el estado con el tipo de dato que Ãbamos a tener.
Asà que el tipo de dato que va a tener las notas,
hemos dicho que es un array.
Muy bien.
Asà que estas props ya las podemos eliminar
y ahora mismo las notas están totalmente vacÃas.
No tenemos notas de ningún tipo.
¿Cómo podemos acceder justamente a esta información?
Una forma de hacer una petición a un recurso,
la más tÃpica, es utilizar un fetch.
¿Pero dónde tienes que hacer el fetch?
Claro, si pensamos hacer un fetch,
fetch al final es un método que lo que nos permite
es recuperar datos de internet a partir de una dirección,
una dirección web.
En este caso aquà tendrÃamos que poner la dirección
de la que queremos hacer un fetch, ¿vale?
¿Cuál es la dirección?
Es esta de aquÃ, la que tenemos aquÃ.
¿Vale?
Vamos a hacer un fetch, vamos a hacer una petición a esta URL.
¿Cuál es el problema?
Que fetch al final lo que está haciendo es una petición a una URL
y esto está ocurriendo de forma totalmente asÃncrona.
¿Qué quiere decir asÃncrona?
Pues que nuestra aplicación no va a esperar.
No va a esperar a que esto termine.
Nuestra aplicación, como puedes ver aquà a la derecha,
esto sigue funcionando.
Pero no va a esperar a que tú hagas una petición
y vuelva esta información.
Eso está ocurriendo.
De hecho, voy a guardar los cambios
y vamos a ver que yo he puesto este fetch aquÃ
y si voy aquÃ, voy a ver los cambios.
Vamos a inspeccionar alimentos.
Lo hemos visto en la primera clase, súper importante.
Mirad la network.
Vamos a ver.
Y aquà en XHR and fetch, ¿ves?
Puedes ver este tipo de peticiones.
Aquà tenemos la nuestra.
Y aquà puedes encontrar que esta petición
la está haciendo aquà en este punto.
Bueno, ahora se me pone eso.
Pero ¿veis que en la barrita pone la hecha en un punto?
Pues la petición la he hecho.
Pero esto no está esperando a renderizar esta aplicación.
Esto es totalmente asÃncrono.
No está bloqueando que nuestra página siga funcionando.
JavaScript, por defecto, bloquea cada una de las lÃneas que vemos.
Pero al final, cuando haces peticiones de este tipo
o haces algunos tratamientos de datos,
puede hacer que sea asÃncrono y no bloquee el proceso.
Asà que lo que estamos haciendo aquà es hacer este fetch.
Y entonces, ¿cómo funcionarÃa?
Aquà lo que está haciendo el fetch
es devolver lo que se dice una promesa.
Vamos a verlo.
Si yo hago un console.log de este fetch,
o mejor todavÃa, en lugar de un console.log,
vamos a ir a la cierta de desarrollo
y a la consola voy a hacer el fetch.
¿Veis? Aquà dice promise y dice pending.
Al final, fetch lo que nos devuelve
es un tipo de datos un poco especial
que se llama una promesa.
Una promesa es un objeto que guarda un valor futuro.
¿Qué quiere decir esto?
Una promesa es como decir, vale, yo me quedo haciendo esto.
Por ahora, en este caso, estoy pendiente,
estoy haciendo cosas,
pero en algún momento esta promesa se resolverá.
Ya sea de forma positiva, que ha ido bien,
o de forma negativa.
Nos está dando como un valor futuro.
Nos está diciendo, bueno, ya en un futuro,
por ahora yo estoy pendiente,
pero en algún momento te devolveré algo.
Ya sea un error o ya sea la respuesta que tengo.
Para que esto funcione correctamente,
lo que podemos hacer es guardar en una variable el fetch,
por ejemplo.
Ahora, si le doy a la A,
¿ves ahora qué ha pasado?
Que como he tardado un rato,
cuando yo he intentado ver cuál era el valor de A,
fÃjate, me ha dicho que la promesa ya se ha cumplido.
Y ya tengo aquà la respuesta.
Si hubiera sido súper rápido,
súper rápido,
a lo mejor todavÃa hubiera visto pending.
Pero como he visto que la A,
lo he hecho después de un rato,
dice, no, no, ya la promesa,
tienes una promesa y ya está,
ya tengo la respuesta.
Ya ha sido completa
y ya tengo aquà la respuesta.
Y podrÃamos ver aquà que tengo la información justamente
que necesito, ¿vale?
Asà que esto es lo que harÃa un fetch.
Pero claro, ¿cómo podemos hacer esto y utilizarlo aqu�
Claro, cuando tú tienes una promesa
para recuperar ese valor futuro,
tienes que decirle, vale,
tú haces el fetch y entonces
haces un paso más.
Y aquà tienes que pasarle una función
para tratar la respuesta del fetch, ¿vale?
Una vez que tenga el valor
de esta respuesta,
entonces transformame la respuesta
a un JSON.
¿Y qué es lo que hace esto justamente?
Pues devolver también una promesa.
Por lo tanto, puedes encadenar
otra resolución de esta promesa, ¿vale?
Pues entonces,
cuando tenga ya el JSON,
entonces hago algo, ¿vale?
Entonces si ponemos aquÃ
un console.log del JSON,
¿vale?
Vamos a refrescar esto
y veis aquÃ,
ya tenemos aquà la respuesta de la promesa.
De hecho,
si lo copiamos aquÃ
para que lo veáis más claro,
vamos a copiar esto
y lo hacemos aquÃ.
Y esto, ¿veis?
Al principio me ha devuelto un pending,
pero al rato esto se ha resuelto
y ha ejecutado este console.log
y aquà tendrÃamos todo este JSON, ¿vale?
Entonces, aquà hay un problema.
Aquà hay un problema.
Y es que,
como ya vimos en la clase anterior,
si yo aquà actualizo el estado,
si yo aquà hago un setNodes,
¿qué pasa con esto?
Que el setNodes
vuelve a renderizar el componente.
¿Y qué pasa cuando se renderiza el componente?
Que llama al fetch.
Y cuando tiene la promesa,
vuelve a llamar aquà al setNodes.
Y cuando llamas al setNodes,
¿qué pasa?
Que se vuelve a renderizar.
Y que cuando se vuelve a renderizar,
¿qué pasa?
Pues que llamas al fetch.
Y cuando llamas al fetch,
¿qué pasa?
Que te vuelve una promesa.
Y la promesa, ¿qué pasa?
Ya sabes lo que pasa, ¿no?
Lo que está pasando aquÃ
es un render infinito.
Esto es un loop infinito
que lo que harÃa
es que nuestro componente
no pare de renderizarse
porque está haciendo un fetch,
actualiza el estado,
se vuelve a renderizar,
llamas al fetch,
plop, plop, plop, plop.
¿Vale?
¿Cómo puedes evitar esto?
¿Cómo puedes controlar
ese flujo de renderizados
para el componente este de la app?
Para recuperar los datos,
pero solo hacerlo una vez.
Pues lo que tenemos que hacer
es utilizar otro hook
que se llama useEffect.
El useEffect es un hook
que se ejecuta cada vez
que se renderiza nuestro componente.
Aunque veremos
que podemos controlar de alguna forma
cuántas veces se tiene que renderizar.
Pero lo importante
que hay que saber hasta ahora
es que es un efecto.
Es como una función
que quiero que se ejecute
cada vez que se renderiza
mi componente.
Asà que este fetch
no lo vamos a hacer aquÃ
porque queremos tener
ese control granular.
¿Vale?
Queremos controlar
cuando se ejecuta este fetch.
No que pase siempre.
¿Vale?
Asà que lo que vamos a hacer aquÃ
es un useEffect
y aquà le pasamos una función.
Y esta función
es la que vamos a querer
que se ejecute
solo cuando nosotros controlemos.
Voy a poner un console.log.
¿Vale?
Y voy a poner aquÃ
useEffect
para ver cuándo se está ejecutando esto.
Vamos a limpiar aquà esto.
Voy a renderizar otra vez.
Venga.
Pues en la consola
veremos que el efecto
se ha ejecutado una vez.
¿No?
Si yo añado una nota
y por lo tanto actualizo el estado
mira
fÃjate que cada vez que escribo
se está ejecutando este efecto.
¿Por qué?
Porque como te he dicho
cada vez que se renderiza el componente
se tiene que ejecutar este efecto.
Cada vez que estamos escribiendo
justamente estamos actualizando
este estado de la nueva nota.
¿Vale?
Porque esto lo estamos guardando
en un estado.
Cada vez que hacemos un
tecleamos en el input
actualizamos el componente
se vuelve a renderizar todo
y esto lo que está haciendo
es que este efecto
se vuelva a renderizar.
Para evitar que esto se renderice
se ejecute tantas veces
lo que le podemos decir
es las dependencias
que dependen
de que este método se ejecute.
¿Cómo le dices las dependencias
y qué es esto de las dependencias?
Vamos a pasarle un array vacÃo.
A ver lo que pasa.
Voy a guardar los cambios.
Vamos a refrescarlo aquÃ.
Y ahora si escribo
no está volviéndose a ejecutar.
FÃjate que solo se ejecuta una vez.
¿Por qué?
Porque lo que estamos diciendo
aquà al efecto
es, vale,
pues este efecto
lo tienes que ejecutar
cuando no cambie nada.
Pero claro,
o sea,
esto lo que quiere decir
es que no tienes ninguna dependencia
y por lo tanto
solo se va a ejecutar una vez
cuando se ejecuta
por primera vez el componente.
Esto es muy parecido
si sabes de cómo funcionaban antes
los componentes en React
era con clases, ¿vale?
Antiguamente con clases
esto es lo más parecido
a un component inbound.
Esto es lo que quiere decir
este efecto se va a ejecutar
solo la primera vez.
Esto es justamente
lo que necesitamos,
que solo se ejecute
la primera vez
este efecto
cuando se renderiza
el componente.
¿Por qué?
Porque si ponemos aquÃ
que se ejecute
siempre que se renderiza,
pues no lo estamos
controlando correctamente
y al final
también va a ocurrir
un loop infinito.
Asà que es aquÃ
donde tenemos que copiar
el fetch.
Vamos a hacer aquà el fetch.
Vamos a hacer el fetch
de estos datos del post.
Cuando tengamos la promesa
la respuesta
la vamos a convertir
en JSON
y cuando tengamos
este JSON
lo que vamos a hacer
por ahora
es un console.log.
Vamos a ver
lo que tenemos aquÃ.
Vamos a guardar los cambios
y ya podemos ver aquÃ
que haces el efecto
y ya tenemos aquÃ
el console.log
con toda la información
que queremos.
Esta información justamente
es la que queremos guardar
en el estado.
Pues ya aquÃ
lo único que tenemos que hacer
es llamar al setNotes
y decirle que este JSON
lo guardamos en las notas.
Y ahora, fÃjate,
ya ha hecho la petición
y ha guardado
toda esta información
y ya la estamos mostrando.
Pero una cosa importante,
súper importante,
voy a poner un timeout
para que esto,
timeout,
para que esto lo veas claro.
Esto, el timeout,
lo vimos en la primera clase,
¿vale?
Vamos a decirle
que tarde dos segundos
en ejecutar este fetch.
¿Por qué?
Porque esto es importante.
Porque quiero que veas
que cuando tú renderizas
las notas,
primero se renderiza
sin las notas,
¿vale?
O sea,
lo que va a hacer
es que el componente
se renderiza al principio.
Vamos a poner aquÃ
un,
por ejemplo,
vamos a poner aquÃ
si las notas están vacÃas,
como hemos hecho antes,
¿vale?
Si las notas
no tienen resultados,
hola,
midu bootcamp,
¿vale?
FÃjate,
primero se renderiza,
es lo que te decÃa,
¿vale?
No se va a esperar al fetch.
Esto es otro error
bastante común
que tiene que tener en cuenta,
que esto no está esperando.
React lo que siempre va a hacer
es renderizar
lo que pueda cuanto antes.
Entonces,
lo primero que va a hacer
cuando tú entras a la página
es,
hola,
midu bootcamp,
porque primero renderiza esto.
Una vez que has renderizado eso,
ejecuta este useEffect
y de hecho lo vamos a ver
más claro con otro,
mira,
con un console.log aquÃ,
que lo vamos a llamar render.
Vamos a reemplazar,
render,
pasan dos segundos,
ejecuta
este timeout,
¿vale?
Ahora,
vamos a poner aquà useEffect,
useEffect
y esto ahora
es cuando
seteando
las notas
de la API.
Vamos a guardar los cambios.
Ok,
vamos a refrescar.
Hola,
midu bootcamp,
renderizamos
luego el efecto,
pasan los dos segundos,
ahora empezamos
y luego cuando tenemos
el resultado,
seteamos las notas
de la API
y una vez que seteas
la API,
o sea,
seteas el estado,
seteas la respuesta
de la API
en el estado,
entonces se vuelve
a renderizar el componente,
¿vale?
Aquà estamos viendo
un poco todo el ciclo.
Primero se renderiza
sin ejecutar
nada de esto,
entonces una vez
se ha renderizado
ejecuta el efecto
porque los efectos
son cuando
ha ocurrido
el renderizado,
¿ok?
Entonces se ejecuta
el efecto.
Como aquà le hemos dicho
que esperamos
dos segundos,
pues hasta que no pasan
dos segundos
no hace el fetch,
entonces pasa
dos segundos
y dice ahora
hace el fetch,
esto ocurre
de forma totalmente
asÃncrona
y luego ya por fin
pues setea las notas
con lo que ha tenido
de la API.
Es súper importante
de que veas
que todos los renderizados
ocurren sin esperar,
por ejemplo,
podrÃamos tener aquÃ,
que esto es lo tÃpico
del mundo,
otro estado
que le vamos a llamar
loading,
¿vale?
Vamos a poner
que esto es false
y una vez que tenemos
esto de fetch,
aquà podrÃamos hacer
un set loading
a true.
Justo antes
de hacer el fetch
vamos a decirle,
vale,
ahora estás cargando
y cuando termine
la promesa
vamos a decir,
vale,
ahora ya no estás cargando,
¿vale?
O sea que tendrÃamos
estos dos casos,
¿no?
Cuando estás cargando
y cuando no estás cargando.
Ahora lo que podemos hacer
en lugar de decir esto
cuando tenemos
el array
y está vacÃo
lo podemos dejar
pero aquÃ
en lugar de dejar esto
podrÃamos hacer
un renderizado condicional.
Ya vais viendo
cómo vamos utilizando
todas las cosas
que hemos visto
en clases anteriores,
¿eh?
Asà que ya vamos a tener
un montón de cosas
para revisar.
Esto lo vimos
en la clase anterior.
Ahora,
si estás cargando
pues vamos a poner aquÃ
cargando
y si no,
pues un stream vacÃo.
No ponemos nada.
Vamos a refrescar
a ver cómo funciona
todo esto.
¿Vale?
Al principio
hola middle bootcamp
saldrá rápidamente.
Claro,
es tan rápido
lo del loading
que no lo vimos.
El loading está ocurriendo.
Claro,
es que el fetch
es bastante rápido.
Voy a ponerlo aquÃ
solo para que veamos
que en realidad
no está esperando,
¿vale?
En realidad sé que lo renderiza
pero no le da tiempo
a renderizarlo
al final.
Hola middle bootcamp
¿vale?
Loading
que me estoy...
A ver,
set loading
false
ta ta ta
a ver que no lo estamos
viendo el loading.
No lo estamos viendo.
¿Qué le está pasando?
Ah,
porque,
claro,
porque está entrando
aquÃ,
¿vale?
Está entrando ahÃ.
Vale,
ahora sà que lo vamos a ver.
Vale,
¿veis?
cargando.
¿Vale?
Está cargando
y luego
pues ya podrÃas enseñar
aquà un spinner,
hacer una carga,
lo que sea.
Pero lo interesante de esto
es que puedes ver
que está ejecutando el efecto,
has actualizado el estado,
eso se está renderizando
por ahÃ,
tú haces el fetch,
es totalmente asÃncrono,
no está esperando React
a que el fetch termine
ni nada,
eres tú el que le está indicando
que tienes que cambiar el estado
y entonces React
reflejará
esos cambios en la UI.
¿Vale?
Tú no estás diciendo
espera el fetch.
No, no.
React va tirando.
¿Vale?
Y no te espera para nada,
no espera nada ni a nadie.
Tú lo que le vas a ir diciendo
es, vale,
ahora tienes este nuevo estado.
Entonces React dice,
vale,
yo me voy renderizando,
¿vale?
Yo voy haciendo esto,
voy haciendo lo otro,
pero no va a esperar a nadie.
Una cosa que podrÃamos hacer
es el tema de ponerle dependencias.
El tema de las dependencias
es que
¿cuándo se tiene que ejecutar este efecto?
Ahora,
como no tiene dependencias,
pues solo se ejecuta
la primera vez que se renderiza.
Pero le podrÃamos decir,
vale,
cada vez que cambie un valor,
entonces renderÃzate.
Entonces ejecuta este efecto,
no renderÃzate.
Cada vez que cambie algo,
renderÃzate.
¿Cómo lo podemos ver esto?
Mira,
con el new node,
esto es un estado
que va a ir cambiando.
Vamos a ponerle aquÃ
new node.
y ahora vamos a refrescar esto,
lo vamos a poner,
voy a cambiar esto
y vamos a ver esto.
Yo refresco,
¿vale?
Y esto está cargando
y entonces me muestra todo esto,
perfecto.
Ahora,
¿cómo puedo hacer
que este efecto
vuelva a ejecutarse?
Ya veis aquÃ
que tengo render,
useEffect,
¿vale?
Voy a hacer esto,
clear,
no,
no funciona aquÃ.
Console.clear,
a ver si funciona.
SÃ,
ahora sÃ.
Vale,
¿cómo puedo hacer
que esto vuelva a ejecutarse?
Este efecto
tiene una dependencia
que es este,
el new node.
Lo que vamos a hacer aquÃ
es que si yo
ahora tecleo algo aquÃ,
este efecto
va a volver a ejecutarse.
¿Por qué?
Porque cuando yo tecleo aquÃ
deberÃa actualizarse
el estado del new node
y este new node
vendrá aquÃ
y actualizará el estado,
¿vale?
Y cuando actualizaré el estado
dirá,
este efecto
depende del valor
del new node.
Si el valor
del new node
cambia,
entonces vuelve
a ejecutar el efecto.
Esto lo vais a ver
súper claro
cuando vayáis jugando
con esto
y haciendo más pruebas,
más ejemplos y tal,
¿vale?
Pero esto es un ejemplo
para que veáis al menos
con una dependencia.
Vais a ver,
yo voy a hacer ahora,
voy a tipear
algo del teclado,
¿veis?
Renderizado,
useEffect
y esto ha vuelto
a ejecutarse.
Este efecto,
lo que le estamos diciendo,
este efecto
depende
de esta dependencia.
Cada vez que cambie
esta dependencia
ejecuta esta función
de aquÃ,
¿vale?
Asà que le vamos
a volver a dar,
¿veis?
Y otra vez
se ejecuta el efecto.
Es lo que le estamos diciendo.
En este caso,
no tiene sentido
que dependa
de ese valor,
¿vale?
Pero,
para que lo sepas,
ahà lo tendrÃas.
¿Vale?
Pues con esto tendrÃamos
el tema de recuperar datos
del formulario y tal.
Aquà habla
de que justamente
podrÃamos utilizar axios.
¿Pero qué es esto
de axios y tal?
Axios,
al final
es un graper
de fetch.
Fetch
es este método
que tenemos aquÃ.
Es una forma,
la forma,
digamos,
más sencilla
de hacer un fetching
de datos
de un servidor.
Y funciona muy bien,
sobre todo
para cuando tienes
pues APIs
que son solo hacer
get y ya está.
Se puede utilizar
para todo tipo de APIs,
pero al final
el código que tienes
que empezar a escribir
a lo mejor
es demasiado complicado.
Para empezar,
lo mejor es fetch,
entenderlo,
porque además
es parte de la plataforma,
asà que no te lo pierdas
y utilÃzalo
porque es la forma
más sencilla.
Pero cuando empieza
a complicarse las cosas
lo que puedes hacer
es utilizar un paquete
que se llama Axios.
Este paquete
es de nuevo
un cliente
para hacer peticiones
HTTP
que también está
basado en promesas
y lo que te permite
además es que
si fetch
no está soportado
en el navegador
por lo que sea,
utilizas a lo mejor
Internet Explorer 11,
pues Axios
sà que tiene soporte.
Además de que tienes
un montón de ventajas
con Axios,
¿vale?
porque puedes hacer
de una forma
más sencilla
un post,
otro tipo de acciones
sobre una URL,
un endpoint
de una API REST.
Asà que en este caso
vamos a ver con Axios
cómo serÃa
porque nos va a venir bien
justamente para luego
hacer el post.
En este caso
aquà puedo crear
y añadir
una dependencia asÃ,
pero si tuvieses
un proyecto
haces en PM install
Axios
y ya lo tendrÃas.
Ahora que tenemos Axios
pues puedes importar Axios
de Axios
¿veis?
Aquà podemos ver
que tiene un export
por defecto
esto es importante
porque ahora
puedes ver la diferencia
fácilmente
y en este caso
para utilizar Axios
pues solo podrÃas
hacerlo de unas cuantas formas
pero quizás
la más sencilla serÃa
Axios.get
no hace falta
hacer este
esta transformación
a .json
ya lo detecta
automáticamente
ahora aquÃ
ya tendrÃamos
el JSON
y vamos a ver
lo que tendrÃa
este JSON
¿vale?
porque ahora veremos
que no es exactamente
el mismo
aquà tendrÃamos
directamente
la respuesta
si hacemos
un console.log
de la respuesta
veremos
que lo que está
haciendo Axios
bueno he puesto
dos segundos esto
es que nos devuelve
un objeto
con más información
por ejemplo
el status code
que nos ha devuelto
la API
los headers
la configuración
que ha utilizado
lo importante
es que en data
es donde tenemos
justamente
la respuesta
de la API
asà que vamos a utilizar
vamos a recuperar
data de response
y ahora
vamos a hacer
el set notes
con data
¿vale?
y con esto
ya estarÃamos
utilizando Axios
exactamente lo mismo
que hemos hecho
con fetch
pero con Axios
ya ves que
hemos quitado
hemos simplificado
un poco
como estamos
haciendo ese get
y nos va a ayudar
bastante con el tema
del post
que ya veremos
como lo hacemos
voy a quitar
todo el timeout
para simplificar
esto
esto al final
era un ejemplo
vamos a hacer
esto por aquÃ
esto
el set loading
aquà lo pasamos
a false
también importante
para que no
se quede el cargando
ahÃ
y ya lo tendrÃamos
¿vale?
esto serÃa con Axios
pero de nuevo
te recomiendo muchÃsimo
que conozcas fetch
porque es parte
de la plataforma
y también es bastante
sencillo de utilizar
y si tienes que hacer
pruebas técnicas
hay veces
que la gente
te pregunta directamente
ah pues hazlo con fetch
en lugar de hacerlo con esto
¿vale?
entonces
aquà tenéis los ejercicios
que son bastante interesantes
son bastante sencillos
y ya veis
que vais a tener que utilizar
todo lo que he explicado hoy
os animo a que los hagáis
porque os va a ayudar
un montón
a entender
todo lo que hemos visto
en la clase de hoy
y cualquier cosa
pues ya sabéis
en Discord
tenemos el canal
del Bootcamp
por si no habéis entendido algo
pues que lo podamos comentar
ahora
vamos a pasar
al tema de alterar
los datos
que tenemos en el servidor
¿vale?
porque
justamente lo único
que hemos hecho
es recuperar los datos
asà que vamos a ver
cómo podemos alterar
que normalmente
lo que vamos a querer
es crear datos
¿no?
aquÃ
como hemos visto antes
estábamos creando notas
a ver
aquÃ
una vez que recuperamos
aquÃ
las notas
lo que está pasando aquÃ
si vamos abajo del todo
que aquà podrÃamos crear
una nota
¿no?
midu bootcamp
y le damos a crear nota
¿ves?
y se crea aquÃ
pero cuando refrescas
esta nota
desaparece
esto no tiene sentido
¿no?
lo que queremos justamente
es que esta nota
persista
y para persistir
tenemos que grabarla
en algún sitio
hay un montón de técnicas
bases de datos
esto lo veremos
en el bootcamp
porque vamos a hacer
con Express
vamos a hacer un servidor
asà que
lo veremos más en detalle
por ahora vamos a utilizar
el servidor que ya está hecho
que en este caso
es este
JSON Placeholder
y puedes ver
que aquà en las rutas
no lo he probado
pero
vamos a confiar
que esto funcione
que básicamente
lo que se puede hacer
es hacer un post
mira
aquà justamente
y es muy interesante
que tenéis
una guÃa
que te indica
cómo hacer
cómo crear un resource
¿veis?
aquà utiliza siempre fetch
y aquà se ve
cómo se harÃa un post
con fetch
tendrÃas que
ir a esta ruta
como puedes ver
la ruta es exactamente
la misma
para hacer un get
para recuperar
todos los recursos
que para crearlos
esto es lo tÃpico
de una REST API
¿vale?
esta tÃpica arquitectura
en la que la misma URL
sirve para recuperar
los datos
para borrar datos
para crear datos
y bueno
me parece muy interesante
que aquà tenéis una forma
de cómo se harÃa
desde
desde fetch
este post
de crear el recurso
¿vale?
asà que
con axios
¿cómo lo harÃamos?
pues es que
ya lo tenemos hecho
asà que
ya está esto preparado
¿qué podrÃamos hacer?
podrÃamos entonces
aquà con axios
voy a hacer esto
un poquito más chiquitito
voy a hacer esto
también más chiquito
esto lo voy a quitar
porque esto no lo necesitamos
y asÃ
creo que veremos mejor
con axios
podrÃamos hacer
un post
y aquà el post
como os he dicho
es la misma URL
lo importante
es la acción
que queremos hacer
sobre esa dirección
asà que ahora que tenemos
el post
lo que tenemos que hacer
con axios
si miramos cómo se hacen
los post
es que tú le dices
la URL
pero también le tienes que decir
cómo quieres crear el recurso
asà que aquà lo que le tenemos
que pasar
es toda la información
que queremos crear
entiendo que la idea
si miramos aquÃ
¿veis?
la idea
se crea sola
normalmente esto es
súper tÃpico
la idea del recurso
en realidad
la está creando
directamente
la base de datos
el servidor
o quien sea
en este caso
nosotros solo
tenemos que decir
el tÃtulo
el cuerpo
y el user ID
asà que ahora mismo
por user ID
ya tenÃamos esto
¿veis que aquÃ
estábamos creando
este node
to add to state?
pues esta ID
no la vamos a crear
pero le vamos a pasar
un user ID
que sà que es necesario
¿vale?
y esta constante
que estamos aquÃ
para crear la nota
vamos a ponerla aquÃ
y este node
to add to state
se lo vamos a pasar
a axios justamente
en lugar de ponerle
aquà el objeto
le vamos a decir
el objeto que tienes
que crear
es justamente este
con el tÃtulo
el body
y el user ID
y ahora
por ahora
voy a modificar
esto
voy a quitar
este set nodes
¿vale?
y vamos a ver
si esto funciona
realmente
y luego veremos
cómo opino
realmente
la respuesta
de todo esto
¿vale?
voy a abrir
las herramientas
de desarrollo
vamos a ir a
Nickwork
y vamos a ir
abajo del todo
y aquà abajo del todo
pues ponemos aquÃ
midu bootcamp
¿vale?
le voy a dar
enter
y ya vemos
que hemos hecho
una petición
una vez que hemos
hecho el enter
el status code
201
a ver
status code
cats
a ver si
os recomiendo
mucho esta página
para conocer
qué significa
cada status code
201
básicamente
lo que nos dice
es que ha creado
el recurso
¿vale?
aquà nos lo dice
con gatitos
pero 201
significa
todo ha ido bien
y he creado
el recurso
que me has pedido
asà que
no hemos
no ha habido
ningún problema
podemos ver
con headers
podemos ver
lo que le hemos enviado
¿vale?
la información
que le hemos enviado
¿ves?
le hemos enviado
el body
el title
el user id
y la respuesta
y la respuesta
fÃjate
nos está devolviendo
lo que hemos creado
y nos está devolviendo
la id
o sea
y esto es
otra forma tÃpica
en la que funciona
en este tipo
de APIs
¿vale?
en la que nosotros
creamos
el recurso
sin la id
y nos devuelve
la información
del recurso
que hemos creado
a veces
con más campos
del que hemos usado
en este caso
la id
es algo que ha creado
el servidor
y nos lo ha devuelto
esto es súper tÃpico
incluso hay veces
que puede haber
más campos
imagÃnate que
además del title
además del body
y el user id
pues solo pasándole
el user id
nos devuelve aquÃ
información como
el avatar del usuario
o cosas asÃ
¿vale?
esto puede ocurrir
normalmente
lo más tÃpico
es la id
pero que no os extrañe
si a lo mejor
creáis algo
con solo el title
y el body
y luego
te añade más cosas
por ejemplo
esto lo puedes pensar
con el tweet
creas un tweet
y lo que te devuelve
no solo es
el texto
que has creado
del tweet
no solo
tu avatar
y tal
sino que a lo mejor
el número
de me gusta
que tiene
obviamente
será cero
pero esto
te va a ayudar
justamente
a inicializar
la UI
con la información
correcta
asà que
esta información
que es justo
la que nos ha devuelto
aquà tenemos
dos opciones
¿vale?
y estas
son opciones
bastante interesantes
aquà que tenemos
igual que hemos hecho
con el get
de axios
aquÃ
que hemos hecho
el get
y hemos hecho
.den
y tenemos la respuesta
en el post
podemos hacer lo mismo
aquà tendrÃamos
la respuesta
podrÃamos recuperar
el data
de la respuesta
y entonces
podrÃamos hacer
un set notes
donde tendrÃamos
por un lado
las notas
que tenÃamos antes
¿veis?
esto es muy parecido
a lo que estamos
haciendo antes
tenÃamos las notas
previas
y a las notas
previas
le vamos a concatenar
la nueva
¿vale?
y de esta forma
esto nos funcionarÃa
pero ahora
se pueden hacer
un montón de cosas
sobre esto
¿vale?
ahora lo vamos a ver
vamos a ver si esto funciona
y
pasaremos a otra cosita
venga
voy a refrescar
para que
si esto lo hemos hecho bien
desde el principio
¿veis?
aquà tenemos todas
nuestras notas
entonces aquÃ
pues creamos
creando
una nueva nota
le damos a crear nota
¿vale?
y veis
pues ahora
una vez que se ha creado
pues se ha añadido aquÃ
y esta que se ha añadido
deberÃa tener
la ID
que nosotros hemos utilizado
lo podrÃamos mirar
con los componentes
con esto
podrÃamos inspeccionar aquÃ
y veis
la key
era la ID
y es la 101
que es justamente
la que nos ha devuelto
en la Nickware
la ID
es la 101
como podéis ver
esto no tiene persistencia
¿vale?
esto no tiene
ningún tipo de persistencia
¿por qué?
porque si esto
lo guardase
en una base de datos
a lo mejor lo tumbarÃan
y tal
pero sà que podemos ver
si se están creando
los recursos
si todo funciona bien
ya nos preocuparemos
de que haya una persistencia
real de base de datos
porque eso lo veremos
nosotros en el bootcamp
pero lo importante
es que veáis
que esto está funcionando bien
y que está ocurriendo
y tal
hay un tema aquÃ
que es interesante
¿vale?
y es que
aunque nosotros
estamos haciendo aquÃ
esto
aquà hay un impas
en el que tú
aquÃ
si yo añado una nota
¿veis?
se queda vacÃo
y entonces aparece la nota
¿vale?
veis que yo estoy escribiendo aquÃ
crear nota
bueno claro
esto me está devolviendo
siempre 101
pero hay un momento
en el que yo escribo
parece que no pasa nada
y entonces se crea
claro
porque como el post
es totalmente asÃncrono
pues hay que tener en cuenta
que esto tarda
¿no?
una cosa que se suele hacer
este set notes
se puede hacer de forma optimista
que se llama ¿vale?
se puede hacer
antes de incluso hacer el post
añadir
esta nota que hemos creado
con una idea falsa
la podemos intentar calcular nosotros
o lo que sea
para que visualmente
el usuario lo vea
pero luego lo que hacemos
es asegurarnos
si ha funcionado o no
no sé si lo veremos en el bootcamp
pero aquà puede ser interesante
por ejemplo hacer un catch
esto lo vais a ver un montón
en Twitter
Facebook
de que vosotros hacéis un tweet
y entonces ese tweet
ocurre de repente
o sea aparece el tweet
de golpe
pero entonces hay un problema
en la red
y te dice
ah no he podido hacer el tweet
y tú te quedas
pero si yo lo habÃa visto
o sea yo he visto claramente
ahà como
como estaba funcionando
¿no?
y esto es porque
está funcionando
de forma optimista
¿vale?
esto es lo que se dice
de forma optimista
de hecho aquà podrÃamos ver
un poco el tema este
de la promesa
que si no existe
pues que haga algo y tal
ahora
una buena práctica
que podemos hacer ya
y esto es súper interesante
es que como podéis ver
estamos haciendo un montón de cosas
voy a dejar esto como estaba
con el set notes dentro
estamos haciendo ya
lógica de negocio
con componentes de React
y que quiere decir esto
de lógica de negocio
y tal
la lógica de negocio
es lo que puedes hacer
en tu aplicación
sin necesidad
en realidad
de que dependa de React
por ejemplo
el que tú hagas
una nueva nota
esto o esto
esto de recuperar una nota
esto lo podrÃas hacer
con React
sin React
lo podrÃas hacer
de cualquier forma
¿vale?
entonces lo ideal
serÃa extraerlo
y como hemos visto
como se harÃan los módulos
una cosa que podrÃas hacer
aquà en source
podrÃamos por ejemplo
crear una carpeta
que se llama servicios
y aquà en servicios
podrÃamos escribir notes
y dentro
he creado un archivo
perdón
o sea podrÃamos crear
otra carpeta
aquà cada uno
podrÃamos hablar
de arquitectura
un montón
pero por ahora
esto serÃa al menos
lo mÃnimo
¿vale?
crear una carpeta
se llama notes
dentro de notes
podrÃamos tener
get all notes
¿vale?
y aquà poder crear
un archivo
donde tendrÃamos
esta lógica
¿no?
asà que vamos a hacer
export const
y podrÃamos llamarle
get all notes
y esto funcionarÃa asÃ
ahora aquÃ
esto devuelve esto
y lo que va a hacer
es
y esto es súper importante
recuperar la respuesta
pero lo único
que va a hacer esto
es devolver
la información
y esto
funcionarÃa asÃ
¿vale?
quitamos esto
¿por qué?
porque aquà no tiene que pasar
nada de React
esto tiene que ser
totalmente agnóstico
a React
vamos a importar aquÃ
la dependencia
de axios
pero ya tenemos
como un servicio
totalmente agnóstico
a React
que lo que hace
es recuperarme
todas las notas
¿por qué es importante esto?
porque si el dÃa de mañana
yo cambio React
esto lo puedo utilizar
en Vue
en React
en Svelte
en JavaScript Vanilla
en otra aplicación
que tenga en React Native
lo que sea
si por lo que sea
solo cambia la API
pues podrÃa venir aquÃ
y cambiar este get
y poder poner aquÃ
pues la API que yo tenga
y ya está
¿vale?
esto podrÃa ser una
por ahora
podrÃamos empezar asÃ
esto serÃa
yo creo que lo más importante
que podrÃas hacer ahora
serÃa esto
¿vale?
más incluso
que veremos
que podemos hacer
custom hooks
y tal
pero esto
esto es mÃnimo
esto es lo básico
que tienes que hacer
si alguien te dice
que dejes asà tu código
no sé
preocúpate
esto es lo mÃnimo
que deberÃas hacer
¿vale?
separar al menos
este tipo de lógica
en ficheros
totalmente aparte
asà que ahora
que tienes este
get all notes
lo importante
es que sabes
que te devuelve una promesa
donde tienes
esta información
asà que ahora
en lugar de hacer esto
de axios
no sé qué
no sé cantos
pues tenemos
get all notes
esto lo importamos
¿ves?
ya se ha importado
automáticamente
de servicios
notes
get all notes
y harÃamos exactamente
lo mismo
porque esto devuelve
una promesa
aquà tendrÃamos
las notas
y ahora esto
es lo que sÃ
que harÃamos aquÃ
¿vale?
esto serÃa parte
de
parte de React
el actualizar
el estado
el si es loading
si no es loading
asà que ahora
utilizamos el notes
y ya tendrÃamos esto
recuperamos las notas
y una vez que tenemos esto
pues resolvemos la promesa
con las notas
y ya está
lo mismo
irÃa con
escribir las notas
¿no?
podrÃamos crear aquÃ
otro fichero
que sea
pues create note
¿vale?
y exactamente
exactamente lo mismo
vamos a extraer esto
lo hacemos aquÃ
importamos axios
que lo vamos a necesitar
export
const
create note
y
vale aquÃ
se me ha olvidado un igual
¿vale?
ahora lo interesante de esto
es que justamente
necesitamos más información
cuando creamos una nota
tenemos que decirle
el title
el body
y el user id
asà que ahora esto
es ya
el title
el body
y el user id
y esta información
es la que usarÃamos
justamente
para crear la nota
¿vale?
ahora
¿qué hacemos?
pues este set notes
no lo hacemos aquÃ
devolverÃamos la información
una vez que la tengamos
y ahora aquÃ
en lugar de hacer esto
hacemos el create note
y aquÃ
¿qué le pasamos?
pues el note
to add to state
que tiene justamente
el title
el body
el user id
que le va a llegar aquÃ
para crear esto
¿vale?
y ahora aquÃ
hacemos un then
y ya tenemos aquÃ
la nueva nota
y esta nueva nota
es la que vamos a utilizar
para el set notes
y quedarÃa limpio
de axios
¿vale?
súper importante
que quedase totalmente
limpio de axios
sé que me estáis diciendo
que
utilizar
custom hooks
y tal
pero lo primero
que deberÃais hacer
es esto
antes de un custom hook
luego un custom hook
puede utilizar
este servicio
exactamente igual
¿vale?
y ya veremos
cómo creamos custom hooks
lo veremos en el curso
asà que no os preocupéis
pero
lo primero
primero
primero que deberÃais hacer
antes de probaros
un custom hook
es esto ¿vale?
extraer a un servicio y tal
luego el custom hook
por supuesto
podrÃa utilizar esto
y no habrÃa ningún problema
luego
una vez que estáis aquÃ
podrÃais utilizar
a sync await
que iremos viendo
en el curso
podrÃamos ver
cómo podemos manejar
la sincronÃa
de diferente forma
por ahora
solo hemos visto promesas
pero a lo largo del bootcamp
vamos a ver
que aparte de promesas
que al final
son también promesas
podemos utilizar otra cosa
que se llama
async await
pero por ahora
vamos a dejar con esto
asÃ
de esta forma
hemos creado también
tanto crear
como recuperar
aquà he puesto
este date
aquÃ
ahora este
new node
en lugar de data
serÃa new node
¿vale?
entonces
la ventaja
alguien me pregunta
la ventaja
entre fetch y axios
fetch
digamos que es
la forma más sencilla
más rápida
cero
ocupa cero
porque ya está
en el navegador
a no ser que utilices
un navegador muy antiguo
es parte de la plataforma
fetch
¿vale?
no es una dependencia
fetch
está en la API
del navegador
es parte
de la plataforma
y es la forma
más rápida
en la que puedes hacer
pues un get
o incluso un post
sin necesidad de instalar
absolutamente nada
ahora
axios
lo que tiene
es una envoltura
de lo que hace
fetch
que te permite
de una forma
quizás más sencilla
si vas haciendo
cada vez cosas
más complicadas
puedes interceptar
requests
puedes crear
por ejemplo
envolturas sobre APIs
puedes crear
un cliente
en el que siempre
esté llamando
a los mismos endpoints
puedes hacer
de forma muy sencilla
cuando haces el get
ya te lo transforma
en un JSON
claro
tienes toda
toda una envoltura
que te simplifica
mucho la API
entonces
yo
creo que es súper importante
conocer fetch
porque es parte
de la plataforma
pero cuando va creciendo
tu aplicación
normalmente
puede ser interesante
tener axios
porque te permite
crear una instancia
de una API
en la que siempre
le vas a pasar
un token
o puedes tener
todos los métodos
ya sin necesidad
de pasarle cabeceras
porque fÃjate
aquà para hacer un post
que tienes que indicar
method post
pasarle el body
asegurarte que eso
pasas como un JSON
stringify
todo esto
te lo está haciendo
justamente axios
de gratis
¿vale?
entonces hay veces
que puede ser interesante
utilizar axios por esto
pero ¿qué pasa?
todo tiene un coste
¿vale?
todo tiene un coste
axios por ejemplo
pues ocupa
4,5 kilobytes
¿es la dependencia
más grande del mundo?
no
¿es la peor?
tampoco
pero Fetch
ocupa cero
¿vale?
entonces hay veces
si tienes una aplicación
que sea lo suficientemente
sencilla
igual Fetch
ya te hace
lo que necesitas
de hecho
creo que normalmente
hay gente
que utiliza
axios de una
y puede ser
que
por un lado
no sepa exactamente
lo que está haciendo
por debajo
que creo que
es
una de las mejores
formas de aprender
cosas
es saber
qué está ocurriendo
por debajo
y lo segundo
es que a lo mejor
está haciéndolo
sin ninguna necesidad
porque a lo mejor
solo hacen un
get en toda su aplicación
que podrÃan hacer
con un Fetch
en tres lÃneas
de código
entonces creo que
todo tiene su
uso
¿vale?
pero claro
si al final
tienes una API
en la que siempre
pasas el token
mira
aquà tenemos un ejemplo
¿no?
de crear una instancia
con una URL base
y tal
pues esto
con Fetch
serÃa mucho más complicado
todo tiene su uso
todo tiene sus ventajas
y sus desventajas
¿vale?
que eso es lo realmente
importante
entender
cuando tienes que utilizar
uno u otro
no hay una respuesta
blanco o negro
¿vale?
de utiliza siempre Fetch
o utiliza siempre Access
no
siempre
tienes que entender
cuál es la mejor herramienta
que tienes que utilizar
en tu caso
¿ok?
entonces
Cores puedes hacerlo
en Fetch
sin ningún problema
si el tema de Cores
es un problema más
de servidor
que no de
de hecho en Fetch
podrÃas hacer un
no Cores
que te vendrÃa
la respuesta
de una forma opaca
pero
Funcionarte
podrÃa funcionar
bueno mira
esto está haciendo
exactamente
lo mismo
que hemos hecho
nosotros
del Node Service
mira
en este caso
este también es uno
interesante
en el que
lo que hace
es crear un servicio
nosotros hemos creado
como más de uno
pero en su caso
esto podrÃa ser
al final esto es
como vosotros queráis
podrÃais utilizar
Nodes
bueno
vamos a llamarle
index.js
y aquà podrÃamos
exportar
por ejemplo
podrÃamos exportar
el create
podrÃamos exportar
el get all
vale
esto también
podrÃa funcionar
en lugar de hacerlo asÃ
pues hacerlo
de esta forma
vale
al final esto
como podéis ver
es un poco
como vosotros
prefiráis hacerlo
y en esta
bootcamp
no nos vamos a meter
en
querÃa explicaros
lo de la lógica
negocio
porque me parece
bastante importante
pero
no
tampoco quiero
entrar en temas
de arquitectura
porque ya os dije
que esto iba a ser
muy desde cero
para gente
que supiese
un poco de programación
pero que
no hacÃa falta
tener conocimientos
avanzados
más adelante
a lo mejor en twitch
nos animamos con esto
pero esto podrÃa ser
de otra forma
vale
tenemos
en lugar de importar
esto ya no lo necesitamos
en lugar de importar
de forma separada
podrÃamos tener
un solo servicio
servicios
notas
esto ya no necesitarÃamos
ni esto
y tendrÃamos
el de create
y el de get all
pues esta podrÃa ser
de otra forma
vale
asà que
podrÃamos tener
create
y esto
podrÃamos decirle
as create note
y get all
as
get all notes
por ejemplo
y utilizar estos
en lugar de los otros
que tenÃamos antes
y de esta forma
lo tendrÃamos
en un solo archivo
ya verÃamos
que esto
dependiendo
de la complejidad
que tuviese
nuestros servicios
pues podrÃa ser
un solo archivo
separarlo unos por otros
y cosas asÃ
vale
esta serÃa una forma
si
a ver
que más
que más
dice por aquÃ
a ver
que sea interesante
para crear
bueno
esto sà que lo hemos visto
ya
lo de los objetos
de los literales
y
yo creo
bueno
lo de los errores
sà que puede ser interesante
al final
una cosa que puede estar bien
es tener en cuenta
que
cuando tú haces
este
este get
y haces un punto den
tú puedes hacer aquÃ
por ejemplo
cuando creamos la nota
vale
cuando creamos la nota
aquà podrÃamos hacer un catch
y mirar el error
que nos está dando
por ejemplo
si yo aquà creo
una nota
sin esta información
vamos a crear
vamos a poner esto
esto deberÃa dar un error
de algún tipo
vale
entonces vamos aquÃ
voy a refrescar
si yo intento crear una nota
con esta información
¿qué problema?
dice
vale
bueno
eso es el inter
si yo intento crear una nota
con esta información
¿veis?
esto está petando
me dice que title
is not defined
bueno esto
esto está petando
pero más por mi culpa
que no por
no
porque dice
title is not defined
esto es
aquÃ
en este create node
está intentando
extraer title
vale
voy a intentar
a ver si me peta
la API
que es lo que quiero
que me pete la API
title is not defined
otra vez
ay
es que no es esta
perdón
es que ahora lo estamos
haciendo aquÃ
¿vale?
que no le he puesto aquÃ
la información esta
que querÃa añadirle
he creado el create
aquà súper rápido
y no
ahora
vale
vale
vamos a ver si peta la API
no peta la API
pensaba que iba a petar la API
a ver
si
el JSON playholder
este tenÃa algún
mecanismo
de decir
si no me envÃas esto
peto
porque podrÃamos ver
entonces
vamos a intentar que pete
crear nota
¿veis?
me está diciendo
si, si
yo me lo he comido
con patatas
esto
solo le he pasado
el user ID
y esto funciona
igualmente
a ver
error
no
querÃa ver
si podÃa evitar
esto
bueno
si no lo que podemos hacer
es forzar el error
podrÃamos hacer aquÃ
un throw
new
error
something
something
bad
happened
¿vale?
esto es forzando el error
¿eh?
no hagáis esto en casa
¿vale?
veis que aquà me está dando un error
que dice
oye que aquà ha pasado algo
que no sé qué
no sé cuánto
una cosa que podrÃa
aquÃ
bueno
claro
esto en realidad
para
podrÃamos hacer un
promise
reject
¿vale?
lo que estoy haciendo es forzar el error
de la API
como que ha petado de alguna forma
¿vale?
veis que aquà dice
something bad happened
¿no?
como ha pasado algún error
estoy como forzando
como si la API estuviese petando
¿vale?
solo para que veamos
lo que podrÃamos hacer
esto lo voy a volver a comentar
porque ya veo que la API esta
no podemos forzar el error
¿vale?
igual que hacemos un punto den
en las promesas
también puedes hacer un punto catch
como os he dicho antes
¿vale?
como os he dicho antes
en las promesas
son totalmente asÃncronas
lo que al principio
tiene un estado de pendiente
en la que está haciendo
lo que tenga que hacer
para que ocurra
el poder recuperar el valor
o hacer lo que
le has dicho que haga
de forma asÃncrona
primero está pendiente
y una vez que pasa
a resuelta
claro
puede haber pasado dos cosas
una que se ha resuelto
bien
¿no?
que se ha resuelto
y otra es que tiene un error
que se ha
es rechazado
¿vale?
es un reject
que se ha rechazado la promesa
asà que por un lado
tendrÃas el punto den
donde se ha resuelto
pero por otro lado
tendrÃas la de
se ha rechazado
y entonces
si se ha resuelto
lo puedes resolver
con el punto den
nunca mejor dicho
resolver
y si se ha rechazado
puedes capturar el error
¿vale?
aquà tendrÃamos el error
y aquà podrÃas
capturarlo
y evitar que tu aplicación
reviente
y decir
ostras
pues ya que ha petado
voy a hacer un console
lot del error
pero podrÃa aquÃ
hacer
y setear un estado
por ejemplo
vamos a tener un estado
que le vamos a llamar
set error
y aquà le voy a poner
pues
la API
ha petado
¿vale?
entonces
este set error
para que
vayas viendo
todas las partes
todas las cosas
que podemos ir haciendo
hacemos el seterror
por defecto
el seterror
obviamente es
false
o sea no tenemos
un error
vamos a poner un stream vacÃo
por ahora
¿vale?
si es stream vacÃo
es que no tenemos error
entonces
cuando peta
este seterror
pues le ponemos
la API ha petado
¿qué podemos hacer aqu�
pues de nuevo
renderizado condicional
podrÃamos hacer mil cosas
¿vale?
aquà error
pues aquÃ
si tenemos el error
pues mostramos el error
y si no
pues un stream vacÃo
por ejemplo
esto como
vamos a ponerlo abajo
para que lo veamos
más fácilmente
vamos para abajo
y aquÃ
pues si yo he intentado
crear la nota
y da un error
creamos
¿ves?
la API ha petado
de hecho
pues ya
ya esto
deberÃamos
ir sabiendo
¿no?
style red
perdón
color red
está guay esto
pero
tampoco tanto
¿vale?
por CSS
con el style error
le decimos
venga error
crear nota
¿vale?
la API ha petado
porque
¡ay no!
es que no se puede utilizar
en style en lÃnea
esto es porque yo
he ido aquÃ
muy de listo
el estilo en lÃnea
tiene que ser un objeto
¿vale?
importante
no utilices estilos en lÃnea
de hecho
luego veremos ya
cómo funciona
esto correctamente
¿vale?
crear la nota
¿veis?
pues aquà tendrÃamos
el error
asà que
y luego
obviamente
como esto es un estado
siempre
siempre tendrÃamos
que limpiar
el estado
¿vale?
si antes de crear la nota
queremos limpiar el error
¿no?
pues entonces
si yo cuando ahora
le dé a crear nota
si funciona bien
no quiero
que vuelva a aparecer
pues deberÃa limpiar
¿vale?
asà que antes de crear la nota
lo limpio
y ya deberÃa estar
o podrÃas limpiarlo
después de un timeout
o podrÃamos hacer
un use effect
para limpiar el error
podrÃas hacer tantas cosas
podrÃas hacer tantas cosas
asà que
bueno
hoy no hemos visto
a sync await
porque
querÃa enfocarme
sobre todo
si me pongo ahÃ
a promise
a sync await
taoma
use effect
y tal
vamos a intentar
siempre como ir poco a poco
creando nuevo contenido
y viendo
el lenguaje
de forma iterativa
¿vale?
ya os dijimos que
vamos a intentar
poco a poco
pues ver
las cosas
de una forma más
encrechendo
¿vale?
no lanzar aquÃ
un montón de cosas
he intentado
que fuese
lo más
iterativa posible
¿vale?
de forma que
entendáis
lo que va ocurriendo
en cada paso
¿no?
cómo lo hemos creado
el estado
en local
pero luego
lo hemos hecho
con una API
el use effect
que ir creando
bueno
hemos seguido
el full stack
open
yo lo he estado
cambiando un poco
porque hay cosas
que me parece
que el orden
no es el correcto
pero bueno
que hemos podido
ir viendo
que todo
tiene un sentido
cuando lo vamos
montando
¿no?
que no
toma
asà se hace
la API
¿no?
¿por qué
se hace asÃ
la API?
pues porque
esto
tiene un render
infinito
¿cómo lo evito?
pues venga
aquà tiene la dependencia
¿no?
cómo lo hemos ido
haciendo de forma
totalmente
iterativa
no me ha dado tiempo
pero he ido
escuchando
con Prime
que se me iba
rejuntando gente
asà que
mucha gente
todo el mundo
que me ha pagado
la hidratación
y no he utilizado
ahora sÃ
tenÃa la garganta seca
pero muchas gracias
a todos los que me han
seguido mientras
a Rubén Eno
por suscribirse
con Prime
muchas gracias
a todos los que
habéis pagado
la hidratación
que os lo agradezco
aunque yo
pues he ido a saco
a los que han sugerido
encuestas como
context or redax
cuándo usar
y por qué
eso lo he comentado
tantas veces
pero lo veremos
lo veremos
en otro
lo vamos a ver
¿vale?
vamos a ver redax
en el full stack
bootcamp
y explicaremos
cuándo uno u otro
¿vale?
más adelante
gracias andresino87
por suscribirte con Prime
muchas gracias
a Kaina Cero
por suscribirte con Prime
muchÃsimas gracias
el chico nube
que se ha suscrito
un mes
con el nivel 1
también
muchas gracias
Julio Burgos
por suscribirse con Prime
muchÃsimas gracias
a Jaime Dordio
espero no dejarme a nadie
que se ha suscrito
con Prime
y es que
claro
aquà hay tanta
tela que cortar
Sergio
Edo 33
que ha regalado
una suscripción
de la comunidad
de nivel 1
muchÃsimas gracias
por apoyarme
y por además
regalar
¿vale?
muy buena clase
MiduF
me voy a ver
de nuevo la clase
muy bien
os digo
todas las clases
las vais a tener
en midu.tv
asà que ya sabéis
en mi youtube
ahà os podéis
registrar
os suscribÃs
de hecho mira
aquà tengo la última clase
que es aprendiendo
javascript y tal
en listas de reproducción
o si no
si bajáis aquÃ
creo que la
creo que la he puesto
no
no la he puesto todavÃa
vale
pues nada
lo pondré
pero si no
en listas de reproducción
tenéis aquà el
bootcamp full
está gratuito
bienvenidos
¿veis?
esta fue la primera clase
tenemos la segunda
tenemos la clase anterior
de React
donde hablamos del estado
del componente
y todo
asà que
en mi canal de youtube
podéis seguir
todas las clases
que las voy a subir ahÃ
y ahà las podéis compartir
con gente
lo podéis hacer
la podéis revisar
tantas veces como queráis
asà que ahà se queda
¿vale?
muy buen curso
qué pedazo de clase
gracias crack
gracias a vosotros
gracias Diana
grande
midu clase
como siempre
eres un crack
gracias señor
dead
esta clase la tendré
que volver a ver
pero también me miraré
la playlist
desde el curso de React
si os gustarÃa
aprender más de React
verlo desde otra perspectiva
con otros ejemplos
pues de nuevo
también igual
en mi canal de youtube
tenéis un curso de React
completo
que se explica
de forma más tranquila
porque son más horas
¿veis?
este curso de React
desde cero
pues tenéis una lista
ah mira
esta sà que está aquÃ
si bajáis aquÃ
tenéis el curso de React
desde cero
que son 12 horas
entonces no me ha quedado claro
el use effect
ahà lo explico de otra forma
más pausadamente
pero bueno
yo creo que
el verlo aquÃ
y verlo allÃ
pues al final
pues haces como la imagen completa
y dices
ah bueno
pues aquÃ
aquà lo otro
muchas gracias
a ti Marcos
muchas gracias
Midu
reforzando conocimientos
mientras cocino
que grande
que grande
y con el hambre que tengo
encima yo
Brando Vidal
grande crack
muchas gracias
¿cómo limpias el estado
del componente
cuando se desmonta?
el estado del componente
cuando se desmonta
no lo tienes que limpiar tú
lo limpia
o sea
desaparece el componente
si se está desmontando
no necesitas preocuparte
por el estado del componente
otra cosa es
limpiar efectos
que eso lo veremos
más adelante
¿vale?
gracias a vosotros
todos los
gracias por ser mi valentine
¿verdad?
es que es
agregar dependencias
a ver
en este caso
hemos visto
cómo agregar dependencias
aquà directamente
¿no?
veis aquÃ
esto no es una extensión
para agregar dependencias
en vuestro proyecto
serÃa
npm install axios
¿vale?
eso en vuestro proyecto
eso si es una dependencia
de producción
tendrÃas que hacer esto
npm install axios
si es una de desarrollo
tendrÃas que poner
guión guión
development
¿vale?
si fuese una extensión
de desarrollo
como por ejemplo
el inter
no se programar
dice que ha sido
la mejor cita
que ha tenido
en san valentÃn
agregar dependencias
eso lo hemos visto
muchas gracias
a todos los que
estáis súper agradecidos
os agradezco
un montón
de corazón
tu canal
es una joya
y para joya
a mi comunidad
eso sà que es una joya
pues eso
que me he saltado
Kira4489
muy buena clase
me voy a ver de nuevo
la clase
directamente
gracias a todos
los que habéis pagado
la postura
que os habéis preocupado
por mi espalda
he ido muy a saco
pero porque ya os digo
que el full stack este
pues al final
la idea es que lo repaséis
¿vale?
que le echéis un vistazo
¿alguna sugerencia
respecto a la cantidad
máxima de estados
en un componente?
al final
eso
es una muy buena pregunta
Pablo
yo dirÃa
los mÃnimos posibles
como vimos
en la clase anterior
que esto lo expliqué
¿no?
de intentar
tener los mÃnimos posibles
intentar tener los estados
que al final
marcan la diferencia
para ti
en el sentido de que
si puedes tener
valores
que puedas calcular
que evites
tener un estado
para ello
¿vale?
y luego
más adelante
veremos
como
creo que veremos
y si no lo veremos
en algún sitio
o en mi curso de React
está
el utilizar
el reducer
para simplificar
estados muy grandes
pero
los mÃnimos posibles
esa serÃa
no hay un número mágico
los mÃnimos posibles
ericestro
dice
madre mÃa
midudev
te ruego
que cuando quieras
ejemplificar
varias cosas
a la vez
limpiemos el sandbox
porque después
está dando encima
que no creo
no es relevante
para ejemplificar
por ejemplo
el axios
bueno
ericestro
como ves
al final
el axios
sà que ha tenido
un sentido
o sea
lo he hecho
a posta
porque
por ejemplo
yo lo he dejado
aquÃ
para que veáis
que no deberÃa
estar aquÃ
¿no?
porque hemos visto
que hemos cambiado
el fetch
al axios
y lo he hecho
todo en el componente
pero
a ver
que tampoco
si miráis
son 69 lÃneas
de código
que puedes decir
hostia son muchas
pero tampoco son tantas
para todo lo que hace
esto ¿no?
que es una aplicación
de notas
y tal
yo os animo
a que ahora que tenéis
esto
pues por ejemplo
este formulario
pues lo paséis
a un componente
qué problemas
puedes encontrar
cosas asÃ
pero la gracia
de esto
de meter el axios
aquÃ
y ejemplificar
esto
era
veis
he creado
el fetch
al axios
pero ahora
imagÃnate
yo ahora
puedo crear
en lugar de
preocuparme
de axios
y todo esto
ahora aquÃ
es donde tengo
el axios
si yo aquÃ
utilizo fetch
o axios
solo lo cambiarÃa
aquà y no
en el componente
¿vale?
ahà está
donde estaba
un poco
la gracia
Miguel
eres una máquina
de lo mejor
que he visto
con profesor
muchas gracias
Nick Javos
muchÃsimas gracias
qué pedazo
de comentario
me llena
de orgullo
y satisfacción
pero lo mejor
soy vosotros
¿eh?
¿cómo limpias
un componente?
como el component
will mount
a ver
que me lo preguntáis
me estáis preguntando
mucho
pero el tema
es que aquÃ
en este componente
no necesitáis
limpiar nada
¿vale?
pero en el caso
de que tuvieseis
que limpiar
y para la gente
que dice
pero cómo se puede
limpiar
que no sé qué
no sé cuánto
el useEffect
tú puedes limpiar
el efecto
esto lo veremos
más adelante
¿vale?
donde esto es extra
los efectos
pueden devolver
una función
que se ejecuta
cuando justamente
se desmonta
ese componente
¿vale?
asà que
si se desmontase
este componente
pues aquà podrÃas
ejecutar código
pero ahora
no lo verÃamos
porque este
este efecto
no se desmonta
en ningún momento
a ver
podrÃamos
¿qué pasa?
que los efectos
además
a ver
lo podrÃa poner
lo puedo poner
removeEffect
y voy a poner
como dependencia
que esto hemos visto
antes
el new note
¿vale?
de forma que
este efecto
se ejecuta
cada vez que cambia
el estado
del new note
voy a refrescar
aquÃ
y vas a ver
que esto
si yo ahora
voy para abajo
voy para abajo
y yo hago aquÃ
y le doy un clic
veis que
ejecuta
removeEffect
¿por qué?
porque está ejecutando
todo este código
y cuando va a volver
dice
vale
lo he renderizado
una vez que se renderiza
y detecta
un nuevo valor
al new note
lo que hace
es ejecutar
primero
esta función
y entonces
vuelve a ejecutar
el efecto
¿vale?
de hecho
mejor si pones
useEffect
y aquà ponemos
removeEffect
lo vas a ver aquÃ
clarÃsimo
ya verás
entonces
le voy a poner
Console Clear
para que se limpia
la consola
si le doy a la A
¿vale?
primero se limpia
el efecto
y luego se ejecuta
el efecto
primero se limpia
el efecto
luego se ejecuta
el efecto
esto serÃa lo más parecido
a lo que comenta
el component wheel mount
esto ahora
no tiene mucha utilidad
aquÃ
pero si aquÃ
tuvieses un
te añadieses
a un evento
o lo que sea
pues aquÃ
podrÃas
desuscribirte
a ese evento
aquà podrÃas hacer
un montón de cosas
de ese estilo
¿vale?
¿vale?
tu canal es una joya
gracias
gracias por todo
lo que aporta
gracias
sois un amor
de verdad
sois un amor
dos preguntas
¿por qué set show
y no set show?
vale
Dana Bayardi
me pregunta
creo que aquÃ
no tenemos este ejemplo
que me está comentando
¿vale?
pero me está preguntando
claro
me tenÃa que haber
cambiado
me tenÃa que haber
guardado mejor
el componente
que tenÃa antes
pero básicamente
antes tenÃamos
un estado
que era tal
que asÃ
set show
¿no?
y hacÃa esto
¿no?
show all
y os he comentado
que aquà podéis
actualizar el estado
de las formas
¿no?
y la otra serÃa
asÃ
prep show all
prep show all
a ver
estas dos formas
funcionan bien
no hay ningún problema
entre la una y la otra
a ver
lo he comentado
para que no salgan
los errores
pero estas dos formas
funcionarÃan bien
son diferentes
en el sentido
de que una lo haces
con una función
y utilizas el valor anterior
para justamente
actualizarlo
y esta
utilizas el valor
que tienes en ese momento
en el estado
¿qué pasa con esto?
que esto puede ser peligroso
si se queda
dentro de por ejemplo
aquà en una promesa
o lo que sea
si tú esto lo haces
aquà dentro
mira
aquÃ
mira
este es un buen ejemplo
este es un buen ejemplo
mira
esto es un buen ejemplo
vamos a dejarlo
como
asÃ
tendrÃamos aquÃ
notes
vale
estas dos funciones
hacen lo mismo
pero
de forma
un poco diferente
¿por qué?
la primera
se ejecuta
con el valor
de notes
que tiene
de antes
¿vale?
este valor de notes
está aquÃ
entonces ¿qué pasa?
que puede ser
que cuando esta promesa
se resuelva
el valor que tenÃa aquÃ
notes
no es el que esperas
no es el que esperas
porque
esto tiene una referencia
antigua
¿vale?
este notes
es el que tienes
aquÃ
aquà arriba
entonces es una referencia
antigua
y puede causar problemas
¿vale?
es una mala práctica
porque tú no sabes
cuando esta promesa
se resuelva
que las notas
en realidad tengan
las últimas notas
porque como veis
el estado
se puede actualizar
un montón de formas
por ejemplo esto
lo puedes actualizar
justo después
no lo controlas
por lo tanto esto
a lo mejor
las notas
que tú crees
que tienes aquÃ
no son las que hay
ahora
no son las últimas
en cambio
la lÃnea 44
sà que te aseguras
que las notas
que te llegan
por parámetro
son las últimas
que tienes
porque fÃjate
esto es
un scope
nuevo
que estás creando
aquÃ
en un parámetro
que te va a llegar
ahÃ
el último valor
que tiene el estado
asà que
aunque parece
que hacen lo mismo
son dos formas
diferentes
de actualizar el estado
y el valor
que tiene notes
puede ser diferente
asà que
en este tema
que es asÃncrono
lo ideal
serÃa hacer esto
esto serÃa lo correcto
te evitarÃas
problemas
posibles problemas
porque no eres capaz
de saber
si alguien
desde otro sitio
ha hecho esto
notes
pues yo que sé
actualiza aquà notes
y lo pone vacÃo
entonces
claro
si tú haces esto
asÃ
cuando tú creas
aquà se ha actualizado
con notas vacÃas
lo intentaré
intentaré sacar un ejemplo
de que funcione
pero básicamente
es esto
aquà se actualiza
el estado
de forma
totalmente libre
luego se resuelve esto
y este notes
que tú crees
que es este nuevo valor
no
este notes
es el de antes
por eso
la forma correcta
serÃa asegurarte
utilizando este
entonces
yo creo que lo importante
aquà es entender
este concepto
más allá de que
a veces utilices
uno u otro
por ejemplo
aquà el set error
lo estamos haciendo a saco
porque no tiene sentido
no tiene sentido
utilizar aquà una función
cuando estamos machacando seguro
pero cuando quieres utilizar
el valor anterior del estado
puede ser buena práctica
utilizar la función
para asegurarte
que estás utilizando
justamente
el último estado
¿vale?
por eso se hace
no es que sea uno
más correcto que el otro
sino que simplemente
es diferente
y por eso
es importante
conocer cuál es la
la diferencia
entonces
claro
el toggle
que tú decÃas antes
pues
puede ser asÃ
pero
esto lo que te está diciendo
es vale
el valor que tenÃa
en ese momento
pero claro
como a lo mejor
no es el último valor
por eso se hacÃa
con la función
no sé si esto te ha ayudado
Dana
espero que sÃ
que con esto
te haya quedado
más claro
y se pueden tener
tantos useEffect
como queráis
¿vale?
o sea aquÃ
tú puedes poner
mirad
useEffect
y aquà pues
creamos otro useEffect
al final
y además
cada useEffect
puede tener
dependencias diferentes
y veréis
que este es el efecto 2
y puedes tener
tantos efectos
como queráis
obviamente
como el estado
¿vale?
cuanto menos tengáis
mejor ¿no?
mejor se entienden
lo mejor es
dividir en diferentes
componentes
pero ves
useEffect
efecto 2
efecto 3
y este pues puede ejecutarse
cada vez que cambie
este puede ser aquÃ
este puede ser cuando
cada vez que se cambie
el new node
de esta forma
veo que solo el efecto 2
¿ves?
ahora cuando se renderiza
por primera vez
se ejecutan todos los efectos
y luego
si vamos aquÃ
pa pa pa pa
y yo le doy a la A
solo el efecto 2
el efecto 2
es el que se está ejecutando
porque es el que depende
del new node
cambia el valor
pues ejecuta el efecto
tantos efectos
como queráis
¿vale?
vale
¿recomiendas usar
Async Await
en vez de Promise?
lo veremos
pero en realidad
como os digo
no recomiendo
blanco o negro
o sea
Async Await
puede tener una utilidad
ideal para ciertos casos
luego el Promise
puede tener otros
yo creo que lo mejor
es conocer los dos
y creo
yo dirÃa que
lo que es un error
es utilizar siempre
Async Await
o utilizar siempre Promise
creo que cada uno
tiene momentos ideales
en los que encajan mejor
¿vale?
o sea que
recomiendo conocer los dos
no recomiendo uno u otro
recomiendo conocer los dos
eso serÃa un poco
¿vale?
muy bien
pues
amigos y amigas
muchÃsimas gracias
de corazón
por haber asistido
al Full Staff Bootcamp
una semana más
clase 4
la semana que viene
vamos a darle
Node.js
el servidor
vamos a dar parte del servidor
vamos a ver backend
¿vale?
asà que
wow
yo estoy súper emocionado
no sé por vosotros
y vosotras
pero yo
estoy emocionadÃsimo
ya dejamos un poquito
React
para pasar a la parte
del backend
para que esto sea realmente
Full Stack