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

使用Redux useSelector钩子获取数据时出现Undefined问题

问题分析与解决:useSelector获取Redux数据返回undefined

1. Redux State键名不匹配

在Store.js中,你通过combineReducers将productReducer挂载到了product键下:

const reducers = combineReducers({
  product: productReducer, // 键名是product
});

但在Home.js的useSelector中,你尝试获取的是state.products:

const data = useSelector((state) => state.products); // 错误:应该是state.product

修正:将Home组件中的选择器改为state.product:

const data = useSelector((state) => state.product);
// 或者直接解构所需字段
const { loading, error, products } = useSelector((state) => state.product);

2. Reducer中字段拼写不一致

在ProductReducer.js的ALL_PRODUCT_REQUEST分支里,你返回的是product: [],而初始state定义的是products: []:

case ALL_PRODUCT_REQUEST:
  return {
    loading: true,
    product: [], // 错误:应该是products
  };

这会导致请求过程中state的字段名从products变成product,后续成功后又变回products,造成数据结构混乱,进而导致取值异常。
修正:统一字段名为products:

case ALL_PRODUCT_REQUEST:
  return {
    loading: true,
    products: [], // 修正为products
  };

3. Store配置中初始状态拼写错误

在Store.js中,你把initialState拼写成了initalState:

const store = configureStore({
  reducer: reducers,
  initalState // 错误:拼写应为initialState
});

虽然这个错误不会直接导致undefined,但会导致你设置的初始状态不生效,建议修正:

const store = configureStore({
  reducer: reducers,
  initialState // 修正拼写
});

修正后的关键代码片段

Home.js(修正选择器)

const Home = () => {
  const dispatch = useDispatch();

  useEffect(() => {
    dispatch(getProduct())
  }, [dispatch]);
 
  // 修正为state.product
  const { loading, error, products } = useSelector((state) => state.product);
  console.log(products);

  return (
    <Fragment>
      {loading ? (
        <Loader />
      ) : (
        <Fragment>
          <MetaData title="ECOMMERCE" />
          <div className="banner">
            <p>WELCOME TO ECOMMERCE</p>
            <h1>FIND AMAZING PRODUCTS BELOW</h1>
            <a href="#container">
              <button>
                Scroll<CgMouse />
              </button>
            </a>
          </div>
          <h2 className="homeHeading">Featured Products</h2>
          <div className="container" id="container">
            {products && products.map((product)=>(
              <ProductCard key={product._id} product={product}/>
            ))}
          </div>
        </Fragment>
      )}
    </Fragment>
  )
}

ProductReducer.js(修正字段拼写)

export const productReducer = (state = { products: [] }, action ) => {
  switch(action.type){
    case ALL_PRODUCT_REQUEST:
      return {
        loading: true,
        products: [], // 修正为products
      };

    // 其他分支保持不变
    default:
      return state;
  }
};

Store.js(修正初始状态拼写)

import { configureStore } from '@reduxjs/toolkit';
import { combineReducers } from "redux";
import { productReducer } from './reducers/productReducer';

const reducers = combineReducers({
  product: productReducer,
});

let initialState = {};

const store = configureStore({
  reducer: reducers,
  initialState // 修正拼写
});

export default store;

内容的提问来源于stack exchange,提问作者Aditya Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:36:13