para que les quede mas facil 🥵🥵
Conceptos claves para empezar
¿Ya tomaste el Curso Básico de Redux?
Conceptos claves de Redux
Ciclo de vida de Redux
Diferencias entre Redux y Context
Introducción a nuestro proyecto
Creemos una Pokedux
Iniciando nuestro proyecto
¡Atraparlos ya!
Introducción a PokeAPI
React.js + Redux
Integrando Redux
Hooks vs. Connect
Redux DevTools
Middlewares
Middlewares
Peticiones asíncronas
Redux Thunk
Middlewares alternativos: Redux Saga
Avanzando la ui
Agreguemos un loader
Agreguemos favoritos
Inmutabilidad
¿Qué es inmutabilidad?
Agregando Inmutabilidad a nuestra Pokedux
Avanzado
Cuándo usar reducers combinados
Redux Toolkit: creando nuestro primer Slice
Redux Toolkit: createAsyncThunk
Despedida del curso
Conclusiones
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
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.
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:
source
, crea una nueva llamada statics
.app.js
, importa la imagen:
import logo from 'statics/logo.svg';
Luego, agrégala a una nueva columna:
<imagen source={logo} alt="PokeDots" />
.app img {
margin-bottom: 3rem;
}
Este margen sigue la convención elegida y asegura un espaciado consistente en el diseño.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.
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.
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
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));
}
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();
}, []);
Una vez que hemos recibido la data correctamente, es tiempo de trabajar con ella dentro del componente de React.
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.
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
}
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
para que les quede mas facil 🥵🥵
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);
}
};
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
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));
}
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
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?