No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Introducción a PokeAPI

7/22
Recursos

¿Cómo empezamos con la integración de PokeApp en nuestro proyecto?

Integrar una API en un proyecto puede ser un desafío, pero con las herramientas adecuadas y una comprensión clara, se convierte en un emocionante viaje de aprendizaje. En esta guía, vamos a abordar cómo integrar la API llamada PokeApp a nuestro proyecto utilizando Visual Studio Code como entorno de desarrollo principal.

¿Cómo añadimos un toque final a la maqueta?

Antes de sumergirnos en la integración de APIs, es esencial perfeccionar nuestra maqueta. Un detalle final puede marcar la diferencia en la interfaz de usuario. Para ello:

  1. Crear una carpeta para archivos estáticos: En la carpeta source, crea una nueva llamada statics.
  2. Agregar el logo: Descarga la imagen del logo proporcionada y colócala en la carpeta recién creada.
  3. Importar y usar el logo: Desde el archivo app.js, importa la imagen:
    import logo from 'statics/logo.svg';
    
    Luego, agrégala a una nueva columna:
    <imagen source={logo} alt="PokeDots" />
    
  4. Ajustar el diseño: Añade espacio entre el logo y el buscador mediante CSS:
    .app img {
        margin-bottom: 3rem;
    }
    
    Este margen sigue la convención elegida y asegura un espaciado consistente en el diseño.

¿Cómo podemos integrar la API PokeApp?

Ahora que nuestro diseño está perfeccionado, pasamos a la integración de la API PokeApp. Este proceso involucra varios pasos que incluyen la instalación de una librería, la configuración de funciones para llamar a la API, y la gestión de los datos recibidos.

  1. Revisar la documentación de la API: Accede al link de resultados que contiene elementos clave para nuestro proyecto. Establece los parámetros de interés, por ejemplo, limitar la consulta a los 151 Pokémon de la primera generación, sin un offset.

  2. Instalar Axios: Esta librería nos ayudará a manejar las peticiones HTTP. Detén temporalmente el servidor del proyecto e instala Axios:

    npm install axios
    
  3. Crear la estructura para las peticiones: En la carpeta source, crea una subcarpeta API y un archivo index.js. Aquí, declara una función para obtener los Pokémon:

    import axios from 'axios';
    
    export function getPokemons() {
      return axios.get('https://pokeapi.co/api/v2/pokemon?limit=151')
        .then(response => console.log(response.data.results))
        .catch(error => console.error(error));
    }
    
  4. Uso de useEffect para la llamada a la API: En el archivo app.js, configura useEffect para realizar la llamada a la API al montar el componente:

    import { useEffect } from 'react';
    import { getPokemons } from './API';
    
    useEffect(() => {
      async function fetchPokemons() {
        const data = await getPokemons();
        console.log(data);
      }
      fetchPokemons();
    }, []);
    

¿Cómo podemos mostrar los datos en la interfaz?

Una vez que hemos recibido la data correctamente, es tiempo de trabajar con ella dentro del componente de React.

  1. Manejo del estado local: Usa el hook useState para almacenar los Pokémon obtenidos.

    import { useState } from 'react';
    
    const [pokemons, setPokemons] = useState([]);
    

    Actualiza el estado con los datos obtenidos de la API.

  2. Actualizar la lista de Pokémon: Configura la lista de Pokémon para que utilice el estado actualizado.

    function PokemonList() {
      // Renderiza basado en el estado de pokemons
    }
    
  3. Pasar datos a los componentes: Asegúrate de que cada tarjeta (componente) de Pokémon reciba el nombre correcto:

    function PokemonCard({ name }) {
      return <div>{name}</div>;
    }
    

Con estos pasos, has integrado con éxito la API de PokeApp a tu proyecto, permitiendo la visualización de datos dinámicos. A medida que continúas construyendo, te animo a seguir explorando y ajustando para aprender más sobre el manejo de APIs y React. ¡El siguiente paso te llevará al emocionante mundo de Redux para una gestión de estado más avanzada!

Aportes 13

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Usando async await:

import axios from 'axios';

export const getPokemons = async () => {
	try {
		const { data } = await axios.get(
			'https://pokeapi.co/api/v2/pokemon?limit=151'
		);
		console.log(data.results);
		return data.results;
	} catch (error) {
		console.error('There was an error: ', error);
	}
};

Con async/await es más fácil

solo se debe escibir la función getPokemon de esta manera:

export const getPokemon = async () => {
  try {
    const { data } = await axios.get('https://pokeapi.co/api/v2/pokemon?limit=151')
return data
  } catch (error) {
    console.error(error.message)
  }
}

Y dentro de App.jsx en el useEffect solamente se ejecutaría la función:

useEffect(() => {
  getPokemon()
}, [])

Para los que esten trabajando con TypeScript y Vite, mi codigo esta así: (cualquier duda o aporte comenten)

// App.tsx
import { useEffect, useState } from 'react'
import { Col } from 'antd'
import { Search } from './components/Search'
import { PokemonList } from './components/PokemonList'
import { getPokemons } from './api'
import logo from './statics/logo.svg'
import './App.css'

function App() {
  const [pkmns,setPkmns] = useState([]);
  useEffect(()=>{
    async function fetchPokemon(){
      const pokemons = await getPokemons();
      setPkmns(pokemons)
    } 
    fetchPokemon();
  },[])
  return (
    <div className="App">
      <Col span={4} offset={10}>
        <img src={logo} alt="Pokedux" />
      </Col>
      <Col span={8} offset={8}>
        <Search />
      </Col>
      <PokemonList pokemons={pkmns} />
    </div>
  )
}

export default App

// index.ts
import axios from "axios";

type PokemonType = {
    name: string;
    url : string
}

type GetPokemonsResponse = {
    results: PokemonType[]
}

export const getPokemons = async ()=>{
    try {
        const { data } = await axios.get<GetPokemonsResponse>('https://pokeapi.co/api/v2/pokemon?limit=151');
        return data.results;
    } catch (err) {
        console.error(err);
    }
}
// PokemonList.tsx
import { FC } from "react";
import { PokemonCard } from "./PokemonCard";
import './PokemonList.css'

export interface IPokemon{
    name: string
    url: string
}

interface Props {
    pokemons: IPokemon[]
}

const PokemonList:FC<Props> = ({ pokemons }) =>{
    console.info(pokemons)
    return (
        <div className="PokemonList">
            {pokemons.map((pokemon,index)=>(
                <PokemonCard url={pokemon.url} name={pokemon.name} key={pokemon.name} />
            ))}
        </div>
    )
}

PokemonList.defaultProps = {
    pokemons: Array(10).fill('')
}

export {
    PokemonList
}
// PokemonCard.tsx
import { FC } from "react";
import { StarOutlined } from "@ant-design/icons";
import { Card } from "antd";
import Meta from "antd/lib/card/Meta";
import { IPokemon } from "./PokemonList";

const PokemonCard:FC<IPokemon> = ({name, url}) => {
    console.info(name)
    return (
        <Card
            title={name}
            cover={<img src="https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/132.png" alt="Ditto" />}
            extra={<StarOutlined />}
        >
            <Meta description="fire, fairy" />
        </Card>
    )
}

export {
    PokemonCard
}

Hola tengo un error al usar key = { pokemon . name } no me salen los nombres y sigue saliendo el warning en consola. Help me pls

api/index.js

import axios from "axios";

const API_URL = 'https://pokeapi.co/api/v2/pokemon?limit=151';
export const getPokemon = () => {
    return axios
        .get(API_URL)
        .then((response) => response.data.results)
        .catch((error) => console.error(error));
}
Implementacion del llamado al API utilizando `fetch` Asi evitamos instalar el modulo de Axios ```js export const getPokemons = async () => { console.log("getting...") const response = await fetch('https://pokeapi.co/api/v2/pokemon?limit=3&offset=0') const data = await response.text(); const result = JSON.parse(data); return result; } ```
Considero que no es necesario utilizar el async/await para realizar la petición debido a que axios.get() nos devuelve una promesa y la estamos manejando dentro del then(), aún así es un muy buen ejercicio :)
Para que salgan las imagenes en lugar de dittos puedes modificar un poco el componente de las cards A mí me quedó así: `import { Card } from "antd";` `import Meta from "antd/es/card/Meta";` `import { StarOutlined } from "@ant-design/icons";` `import "./../style/pokecard.css";` `const pokeImage = (pokemonIndex) =>` `` `https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/${pokemonIndex}.png`;`` `const PokeCard = ({ pokemonInfo: { name, url } }) => {` ` const index = url.split("/")[6].split(".")[0];` ` const pokemonUrl = pokeImage(index);` ` return (` `
` ` <Card` ` title={name}` ` cover={<img src={pokemonUrl} alt={name} extra={<StarOutlined />} />}` ` extra={<StarOutlined />}` ` >` ` <Meta description={name}></Meta>` ` </Card>` `
` ` );` `};` `export default PokeCard;`
## Con Fetch (en api/index.js) ```js const getPokemons = async () =>{ try{ const response = await fetch(API_URL + LIMIT); if(!response.ok){throw new Error("HTTP-Error: "+response.status)}; const data = await response.json(); console.log(data.results); return data.results; } catch(err){ console.log('error', err); } } ```

A mi no me pinta el name en el componente card:

App.js

import { useEffect, useState } from 'react';
import { Col } from 'antd';
import SearchBar from './components/SearchBar';
import PokemonList from './components/PokemonList';
import { getPokemons } from './api';
import logo from './statics/logo.svg';
import './App.css';

function App() {
  const [pokemons, setPokemons] = useState([]);

  useEffect(() => {
    const fetchPokemons = async () => {
      const pokemonsRes = await getPokemons();
      setPokemons(pokemonsRes);
    };

    fetchPokemons();
  }, []);

  return (
    <div className='App'>
      <Col span={4} offset={10}>
        <img src={logo} alt='Pokedux' />
      </Col>
      <Col span={8} offset={8}>
        <SearchBar />
      </Col>
      <PokemonList pokemons={pokemons} />
    </div>
  );
}

export default App;

/api/index.js

import axios from 'axios';

const getPokemons = () => {
  return axios 
  .get('https://pokeapi.co/api/v2/pokemon?limit=151')
  .then((res) => console.log(res.data.results))
  .catch((err) => console.log(err));
}

export { getPokemons };

Pokemonlist.jsx

import PokemonCard from './PokemonCard';

const PokemonList = ({ pokemons }) => {
  return (
    <div className='PokemonList'>
      {pokemons.map((pokemon) => {
        return <PokemonCard name={pokemon.name} key={pokemon.name} />;
      })}
    </div>
  );
};

PokemonList.defaultProps = {
  pokemons: Array(10).fill(''),
};

export default PokemonList;

Esta sección es una joya

useEffect(() => {
    const fetchPokemons = async () => await getPokemos();
    fetchPokemons();
  }, []);

Normalmente existe una mala práctica de usar el async sin escalas en el useEffect, en linters estrictos esto truena y más si es en equipo colaborativo, el trabajo con promesas es una joya, me está encantando este curso, buen remake, que diga excelente remake.

Este video no se ve desde la aplicación movil de platzi