import React, { useEffect } from 'react';
import { List, Avatar } from 'antd';
import { useDispatch, useSelector } from 'react-redux';
import { fetchPokemons } from './redux/pokemonSlice';
import './App.css';

function App() {
  const dispatch = useDispatch();
  const pokemons = useSelector((state) => state.pokemon.pokemons);

  useEffect(() => {
    dispatch(fetchPokemons());
  }, [dispatch]);

  return (
    <div className="App">
      <h1>Pokemon List</h1>
      <List
        itemLayout="horizontal"
        dataSource={pokemons}
        renderItem={(pokemon) => (
          <List.Item>
            <List.Item.Meta
              avatar={<Avatar src={pokemon.image} />}
              title={<a href={pokemon.url}>{pokemon.name}</a>}
              description={pokemon.type.join(', ')}
            />
          </List.Item>
        )}
      />
    </div>
  );
}

export default App;
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
import axios from 'axios';

const initialState = {
  pokemons: [],
  status: 'idle',
  error: null,
};

export const fetchPokemons = createAsyncThunk('pokemon/fetchPokemons', async () => {
  const response = await axios.get('https://pokeapi.co/api/v2/pokemon?limit=10');
  const pokemons = await Promise.all(
    response.data.results.map(async (result) => {
      const res = await axios.get(result.url);
      const { name, sprites, types } = res.data;
      return {
        id: res.data.id,
        name,
        image: sprites.front_default,
        url: `https://pokeapi.co/api/v2/pokemon/${res.data.id}`,
        type: types.map((type) => type.type.name),
      };
    })
  );
  return pokemons;
});

const pokemonSlice = createSlice({
  name: 'pokemon',
  initialState,
  reducers: {},
  extraReducers: (builder) => {
    builder
      .addCase(fetchPokemons.pending, (state) => {
        state.status = 'loading';
      })
      .addCase(fetchPokemons.fulfilled, (state, action) => {
        state.status = 'succeeded';
        state.pokemons = state.pokemons.concat(action.payload);
      })
      .addCase(fetchPokemons.rejected, (state, action) => {
        state.status = 'failed';
        state.error = action.error.message;
      });
  },
});

export default pokemonSlice.reducer;
使用 React、Redux 和 Ant Design 创建 Pokemon 应用程序

原文地址: https://www.cveoy.top/t/topic/lEjE 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录