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

Redux extraReducers失效,无法通过useSelector获取商品数据求助

问题排查与修复

你的代码存在三个关键问题,导致无法通过useSelector获取数据:

1. useSelector未传入状态选择器函数

在home.jsx中,useSelector()没有传入任何函数来指定要从Redux store中获取的状态片段,自然无法拿到数据。

修复代码:

// home.jsx
const data = useSelector(state => state.products.products);
console.log(data);

2. Products切片名称错误

在products.jsx中,你创建的切片名称是"counter",这会导致store中该切片的键名是counter,与预期的商品状态路径不匹配,进而让useSelector找不到正确数据。

修复代码:

// products.jsx
export const productsSlice = createSlice({
  name: "products", // 把counter改为products
  initialState,
  reducers: {},
  extraReducers: (builder) => {
    builder.addCase(getProducts.fulfilled, (state, action) => {
      state.products = action.payload.data; // 同时修正这里,取响应的data字段
    });
  },
});

3. ExtraReducers错误存储了整个Axios响应

你的getProducts返回的是整个Axios响应对象(包含status、headers等冗余信息),但实际商品数据在response.data中,直接存储整个响应会导致数据结构不符合预期。

上面的修复代码已经同时处理了这个问题,将state.products = action.payload改为state.products = action.payload.data。

额外确认:Store配置

确保你的Redux store配置中正确注册了products reducer:

// store.js(示例)
import { configureStore } from '@reduxjs/toolkit';
import productsReducer from './products';

export const store = configureStore({
  reducer: {
    products: productsReducer, // 这里的键名要和切片name一致
  },
});

完成以上修复后,useSelector就能正确获取到商品数据,你可以恢复原本的渲染逻辑:

// home.jsx返回部分
return (
  <div className="home">
    {data.map((item) => (
      <Card
        key={item.id} // 不要忘记添加唯一key
        title={item.title}
        price={item.price}
        img={item.images[0]}
      />
    ))}
  </div>
);

内容的提问来源于stack exchange,提问作者Berk Bıçakcı

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:32:19