You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redux异步Action传参失败问题解决求助

解决Redux Toolkit异步Thunk传参失败问题

问题核心

你的loadData异步Thunk定义时,参数是解构对象({ pageNo, language }),但调用时却传入两个独立参数loadData(1, "ruby"),导致解构出的pageNo和language都是undefined,最终请求URL参数异常。同时代码里还有几处逻辑错误会影响功能运行,以下是分步修正方案:

分步修复

1. 修正异步Thunk的调用方式

Thunk接收的是对象参数,调用时需传入包含pageNo和language的对象:

React.useEffect(() => {
  dispatch(loadData({ pageNo: 1, language: "ruby" }));
}, [dispatch]);

2. 修正Thunk内部的异步处理

data.json()是异步操作,必须加await,否则返回的是Promise而非实际数据:

export const loadData = createAsyncThunk(
  "alldata/getdata",
  async ({ pageNo, language }, thunkAPI) => {
    const data = await fetch(
      `http://localhost:5000/scrape?pageNo=${encodeURIComponent(pageNo)}&language=${encodeURIComponent(language)}`
    );
    // 补充await获取实际JSON数据
    const json = await data.json();
    return json;
  }
);

3. 修正Slice中的Reducer逻辑

  • Slice定义时必须用initialState而非state,符合Redux Toolkit规范
  • addProject/removeProject不能直接返回数组操作结果,需直接修改state属性
  • fulfilled回调中无需解构json,Thunk返回的就是原始数据
  • 修正Reducer的导出方式

修正后的Slice代码:

const projectSlice = createSlice({
  name: "allprojects",
  initialState: {
    projectState: [],
    workingState: [],
    isLoading: false,
    hasError: false,
  },
  reducers: {
    addProject: (state, action) => {
      // 直接修改数组,无需return
      state.workingState.push(action.payload);
    },
    removeProject: (state, action) => {
      // 替换为过滤后的数组
      state.workingState = state.workingState.filter(
        (project) => project.id !== action.payload.id
      );
    },
  },
  extraReducers: {
    [loadData.pending]: (state) => {
      state.isLoading = true;
      state.hasError = false;
    },
    [loadData.fulfilled]: (state, action) => {
      state.isLoading = false;
      state.hasError = false;
      // 将返回数据存入state
      state.projectState = action.payload;
    },
    [loadData.rejected]: (state) => {
      state.isLoading = false;
      state.hasError = true;
    },
  },
});

export const { addProject, removeProject } = projectSlice.actions;
// 正确导出reducer
export const Projectreducer = projectSlice.reducer;
export const selectAllPosts = (state) => state.allprojects.projectState;

4. 依赖补充

useEffect需将dispatch加入依赖数组,避免不必要的重复执行。

内容的提问来源于stack exchange,提问作者Kartic Joshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:48:27