如何在 Redux/Redux-thunk 中获取 api?

Posted

技术标签:

【中文标题】如何在 Redux/Redux-thunk 中获取 api?【英文标题】:How to fetch api in Redux/Redux-thunk? 【发布时间】:2021-06-16 07:41:48 【问题描述】:

我是 redux 的新手。我无法调用 API。像递增、递减等所有其他操作都可以正常工作,但 get_posts() 无法正常工作。 请帮助我,有关最佳实践的其他信息会很有帮助。谢谢 我已经应用了 redux-thunk 中间件,但无法调用 API。我被困在 redux 上好几天了。

减速器

const countReducer = (state = 0, action) => 
  switch (action.type) 
    case "INCREMENT":
      return state + action.payload;
    case "DECREMENT":
      return state - 1;
    case "get_posts":
      return action.payload;
    default:
      return state;
  
;
export default countReducer;

动作

import axios from "axios";

export const increment = (nr) => 
  return 
    type: "INCREMENT",
    payload: nr,
  ;
;

export const decrement = () => 
  return 
    type: "DECREMENT",
  ;
;

export const get_posts = () => 
  return 
    type: "get_posts",
    payload: fetchPosts,
  ;
;

export function fetchPosts() 
  return async (dispatch) => 
    const res = await axios.get("https://jsonplaceholder.typicode.com/users");
    dispatch(get_posts());
  ;


调度程序/App.js

import  useSelector, useDispatch  from "react-redux";
import  increment, decrement, get_posts  from "./action";
function App() 
  const counter = useSelector((state) => state.counter);
  const isLogged = useSelector((state) => state.isLogged);
  const dispatch = useDispatch();
  return (
    <div className="App">
      <h1>Counter counter</h1>
      <button onClick=() => dispatch(increment(5))>Increment</button>
      <button onClick=() => dispatch(decrement())>Decrement</button>
      <button onClick=() => dispatch(get_posts())>Get API</button>
      isLogged ? <h3>Valuable info I shouldnt</h3> : "NOt logged"
    </div>
  );


export default App;

【问题讨论】:

尝试在 getPosts() 函数上使用异步,并在调用 fetchPosts() 的那一行添加 await 语句。 你遇到了什么错误? 它返回 null,不是任何值 当你等待我上面提到的函数调用时,你仍然得到null吗? @Blessing 现在收到此错误。 “错误:操作必须是普通对象。使用自定义中间件进行异步操作。” 【参考方案1】:

你错误的流程老兄,我会尝试在你错误的行代码中给出正确的行代码

调度程序/App.js

import  increment, decrement, fetchPosts from "./action";
...
...
<button onClick=() => dispatch(fetchPosts())>Get API</button>
...

注意:调度用于获取 api 的操作(函数)

动作

...
export const get_posts = (payload) => 
  return 
    type: "get_posts",
    payload,
  ;
;

export function fetchPosts() 
  return async (dispatch, getState) => 
      try 
        const data = await axios.get("https://jsonplaceholder.typicode.com/users");
        dispatch(get_posts(data));
      catch(err) 
        console.log(err)
      
  ;

注意:调度动作类型函数并将响应作为参数负载

【讨论】:

【参考方案2】:

发生的第一个错误是您调用fetchPosts 而不是fetchPosts(),因为它是一个函数。为确保您获得数据,您必须像这样等待fetchPosts 的调用。

export const get_posts = async () => 
  return 
    type: "get_posts",
    payload: await fetchPosts(),
  ;
;

【讨论】:

想通了:- export const get_posts = () => return async function (dispatch) const res = await axios.get("jsonplaceholder.typicode.com/users"); console.log(res.data[ 0].id); dispatch( type: "get_posts", payload: [res.data[0].id], ); ; ;

以上是关于如何在 Redux/Redux-thunk 中获取 api?的主要内容,如果未能解决你的问题,请参考以下文章

promise + redux + redux-thunk:打字稿错误“不可分配给类型'Promise<any>”

Redux - 如何调用一个动作并等待它解决

react状态管理器

Redux等待异步thunk继续前进

Redux 等待异步 thunk 继续进行

如何设置 redux-sagas 和文件结构?