Comencemos a concretar lo que hemos aprendido con Next.js creando una página de inicio que lista los ítems más recientes disponibles en Contentful. Primero, vamos a iniciar revisando nuestro archivo pages/index.tsx. Si ya hiciste cambios previos a este archivo para prueba, es buena idea descartarlos. Para ello, puedes eliminar las modificaciones con Git y asegurarte de comenzar con un archivo limpio, al que renombraremos para usarlo como documentación.
A continuación, crea un archivo index.tsx vacío y ábrelo en VS Code. Para verificar el funcionamiento, agrega un simple “Hola” en nuestro componente y ejecuta el servidor de Next.js, especificando tu space ID y access token como variables de entorno para que funcione la API de Contentful.
¿Cómo obtengo y guardo datos desde la API de Contentful?
Para mostrar una lista de plantas desde nuestra API, utilizaremos el método getPlantList. Este método emplea promesas y HTTP, así que se integrará utilizando useEffect de React para hacer la llamada desde el cliente.
Dentro de Home, usaremos useEffect para traer nuestra lista desde la API limitando a diez resultados. No olvides verificar que la conexión esté estable y funcione usando console.log.
También crearemos un estado con useState para almacenar los datos obtenidos:
importReact,{ useEffect, useState }from'react';// Supongamos que esta es nuestra función de consulta a la APIimport{ getPlantList }from'./api';exportdefaultfunctionHome(){const[data, setData]=useState([]);// Estado inicial como array vacíouseEffect(()=>{getPlantList().then(receivedData=>{// Actualiza el estado con los datos recibidossetData(receivedData);});},[]);return<div>Hola</div>;}
¿Cómo renderizo los datos obtenidos?
Con nuestra lista de plantas lista, el siguiente paso es renderizar los datos. Podríamos utilizar un map en data para mostrar cada ítem, con su nombre y su imagen.
No es necesario reinvertar la rueda al crear estos componentes. El proyecto ya incluye un componente llamado PlantCollection dentro del folder components, que se encarga de renderizar las plantas. Puedes usarlo de la siguiente manera:
Finalmente, el método useEffect se ejecuta solo en el navegador, lo que significa que estamos usando client side rendering (CSR). Esto implica que el renderizado inicial es gestionado en el cliente, a diferencia del static rendering o server-side rendering (SSR). En la próxima lección, exploraremos cómo mover este proceso hacia un static rendering.
Debido a que las funciones de JavaScript son "ciudadanos de primera clase", al momento de hacer el then, como el parámetro que tiene es el mismo que usamos dentro del setData, podemos simplificarlo de la siguiente manera:
¿Cómo hago para poder usar tipos como 'Plant' sin tener que importarlos explícitamente?
Creo que no puedes hacer lo que preguntas, pero si por ejemplo: Tu tienes una funcion que retorna un tipo 'Plant' y dónde sea que tú llames esa funcion y guardes el retorno de esta en una variable, esa variable implícitamente tendrá el tipo Plant sin necesidad de importarlo.
my-func.ts
exportconst customFunction =():Plant=>{const data:Plant;return data
}
index.ts
import{ custmFunction }from'/my-func'...const data =customFunction()// data es de tipo Plant
El profesor lo hace, es decir, el tipo 'Plant' está definido en un archivo d.ts y lo usa en otro archivo para tipar variables sin importarlo explícitamente.
Mi pregunta es: ¿dónde o cómo debo registrar los tipos de mi app? Para que los pueda usar sin importarlos.
Son como git status y git checkout.
Este último, además de servir para moverse entre ramas, también sirve para descartar los cambios realizados en archivos específicos. Como el profesor puso “gco .”, pues descarto absolutamente todos los cambios que no eran parte del último commit.
Oh wow, pensaba crear mi propio blog y no sabía de esto de los Headless CMS. Increíble! Me adelantará trabajo por ahora
Como puedo importar mi api de forma asincrona?
Dicen que no se recomienda
useEffect(async() =>{})
Bueno, creo que lo ideal sería declarar la funcion asincrona dentro de la funcion sincrona del useEffect, y ejecutarla