简体   繁体   English

React-redux- 从 API 获取数据

[英]React-redux- Fetching data from API

I am working on a project and I need to fetch data from backend or from an API.我正在处理一个项目,我需要从后端或 API 获取数据。 I tried fetch the data but nothing appears.我尝试获取数据,但什么也没出现。 I think I am doing something wrong in the container.我想我在容器中做错了什么。 I am a beginner in react-redux, I don't know what I am doing wrong.我是 react-redux 的初学者,我不知道我做错了什么。 I've already read all the posts but nothing seems to works.我已经阅读了所有帖子,但似乎没有任何效果。 my reducer:我的减速机:


const initialState={
  articles: [],
}; 

const rootReducer = (state = initialState, action) => {
  const { type, payload }=action;
  switch(type) {
    case SRETRIEVE_ARTICLE:{
      return {
        ...state,
        articles:payload,
      };
    }

    default: return state;
  }
}

export default rootReducer;

This is what I have right now in container:这就是我现在在容器中的内容:

import Articles from 'components/Articles';
import { fetchArticles } from '../../pages/index';

const mapStateToProps = (state) => ({
    articles:state.articles
  })

  const ConnectedArticles = connect(
    mapStateToProps,
    {fetchArticles}
  )(Articles)

export default ConnectedArticles;

pages.js页面.js

  axios.get('API').then((response) => {
    const { data } = response;

    dispatch({ type: RETRIEVE_ARTICLES, payload: data });
  });
};

const Index = () => {
 
  const articles= useSelector((state) => state.articles);
  const dispatch = useDispatch();
  useEffect(() => {
    dispatch(fetchArticles);
  }, []);

  return <>{articles && articles.map((article) => <Article key={article.id} name={article.name} />)}</>;
};
Index.getInitialProps = async () => ({
  authRequired: true,
  label: 'Dashboard',
});



export default Index;

Also I defined the action type: export const SET_UNOPENED_REWARD = 'SET_UNOPENED_REWARD';我还定义了动作类型: export const SET_UNOPENED_REWARD = 'SET_UNOPENED_REWARD'; and action const unopenedRewards = (payload) => ({ type: SET_UNOPENED_REWARD, payload });和动作const unopenedRewards = (payload) => ({ type: SET_UNOPENED_REWARD, payload });

you should use async and await你应该使用异步和等待

let response = await axios.get('https://run.mocky.io/v3/5c045896-3d18-4c71-a4e5-5ed32fbbe2de')

if(response.status==200){
   dispatch({ type: RETRIEVE_ARTICLES, payload: data });
}

One very nice way to do data fetching with redux is to use redux toolkit's createAsyncThunk and createSlice functions.使用 redux 获取数据的一种非常好的方法是使用 redux 工具包的createAsyncThunkcreateSlice函数。

// src/features/articles/articlesSlice.js

import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";

export const fetchArticles = createAsyncThunk("articles/get", async () => {
  // Here you can use axios with your own api
  const response = await fetch("https://rickandmortyapi.com/api/character");
  const json = await response.json();
  return json.results;
});

export const slice = createSlice({
  name: "articles",
  initialState: {
    loading: false,
    data: []
  },
  reducers: {},
  extraReducers: (builder) => {
    builder.addCase(fetchArticles.pending, (state) => {
      state.loading = true;
    });
    builder.addCase(fetchArticles.fulfilled, (state, action) => {
      state.data = action.payload;
      state.loading = false;
    });
    builder.addCase(fetchArticles.rejected, (state) => {
      state.loading = false;
    });
  }
});
export default slice.reducer;

// src/features/articles/Articles.js

import React, { useEffect } from "react";
import { useSelector, useDispatch } from "react-redux";
import { fetchArticles } from "./articlesSlice";

export const Articles = () => {
  const articles = useSelector((state) => state.articles.data);
  const loading = useSelector((state) => state.articles.loading);
  const dispatch = useDispatch();

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

  return (
    <>
      {loading && "...loading"}
      {articles.map((article) => <Article key={article.id} {...article} />)}
    </>
  );
};

编辑 nice-leaf-z9wx7

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM