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

React Hooks+Redux实现CRUD时dispatch获取全量数据返回undefined如何解决

问题修复方案

1. 补全useEffect的依赖数组

当前你的useEffect没有传入依赖数组,会导致组件每渲染一次就触发一次retrieveCars请求,添加空依赖数组让请求只在组件挂载时执行一次:

useEffect(() => {
  dispatch(retrieveCars());
}, []); // 新增空依赖数组

2. 给carReducer添加default分支

Redux要求所有reducer必须在未匹配到action类型时返回原有state,你目前的switch没有default分支,其他action触发时会把cars state重置为undefined:

const initialState = [];
  
function carReducer(cars = initialState, action) {
  const { type, payload } = action;
  switch (type) {
    case CREATE_CAR:
      return [...cars, payload];
    case RETRIEVE_CARS:
      return payload;
    // 新增default分支
    default:
      return cars;
  }
}

3. 检查rootReducer的挂载配置

确认你用combineReducers合并reducer时,carReducer对应的key是cars,和useSelector(state => state.cars)的取值字段一致,示例配置如下:

// rootReducer 参考示例
import { combineReducers } from 'redux';
import carReducer from './carReducer';

const rootReducer = combineReducers({
  cars: carReducer, // 此处key必须为cars,否则useSelector无法正确取值
  // 其他业务reducer配置
});

4. 可选:渲染前增加数组类型校验

可以进一步增加类型判断,避免非数组值调用map报错:

<tbody>
  {/* 把cars&&替换为Array.isArray(cars)判断 */}
  {Array.isArray(cars) &&
    cars.map((data) =>
      <tr key={data.idCars}>
        <th scope="row">{data.idCars}</th>  
        <td>{data.carName}</td>
        <td>{data.carModel}</td>
        <td>
          <Link to={"/classement/update/" + data.idCars}
            className="btn btn-info"
          >
            Edit
          </Link>
          <button  className="btn btn-danger" onClick={() => deleteC(data.idCars)}>
            Remove
          </button>
        </td> 
      </tr>
    )
  }
</tbody>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:09:01