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

使用Redux Toolkit存储API数据报错:createSlice.extraReducers对象写法已移除

解决Redux Toolkit extraReducers 对象写法报错及数据存储问题

报错原因

Redux Toolkit 1.9.0及以上版本移除了createSlice.extraReducers的对象字面量写法,要求必须使用builder回调语法处理异步action。

修复步骤及完整代码

1. 修正异步Thunk的JSON解析问题

原代码中data.json()未添加await,会导致返回Promise而非实际JSON数据,需补上:

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

export const getAllJobs = createAsyncThunk("jobDetails/getAllJobs", async () => {
  const data = await fetch("http://localhost:3031/jobs");
  // 必须加await才能拿到解析后的JSON数据
  const result = await data.json();
  return result;
});

2. 改用builder回调重构extraReducers

替换原对象写法为builder的addCase链式调用:

export const jobDetailsSlice = createSlice({
  name: "jobDetails",
  initialState: {
    jobs: [],
    loading: false,
    error: null,
  },
  extraReducers: (builder) => {
    builder
      .addCase(getAllJobs.pending, (state) => {
        state.loading = true;
        state.error = null; // 清除之前的错误状态
      })
      .addCase(getAllJobs.fulfilled, (state, action) => {
        state.loading = false;
        state.jobs = action.payload; // 将API数据存入jobs状态
      })
      .addCase(getAllJobs.rejected, (state, action) => {
        state.loading = false;
        // 异步失败时优先取错误信息,兜底显示默认提示
        state.error = action.error?.message || "获取职位数据失败";
      });
  },
});

export default jobDetailsSlice.reducer;

3. Store代码无需修改(确认逻辑正确)

import { configureStore } from '@reduxjs/toolkit'
import jobDetailsReducer from '../features/jobSlice'

export const store = configureStore({
  reducer: {
    app: jobDetailsReducer
  },
})

使用说明

在组件中通过dispatch(getAllJobs())触发异步请求后,Redux会自动处理三种状态:请求中loading设为true,成功时将API返回数据存入state.app.jobs,失败时记录错误信息。


内容的提问来源于stack exchange,提问作者Harshdeep Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 04:35:59