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

Redux useSelector调用3次仅第3次返回数据 调用map报undefined错误

问题根因及解决方案

核心错误原因

1. Reducer状态返回逻辑错误

你在处理GET_PROJECTS_REQUEST action时,直接返回了仅包含isLoading: true的对象,没有保留原有state中的其他字段,导致请求触发后,redux状态里的projects字段被直接丢弃,变成undefined。这就是你调用map时报Cannot read property 'map' of undefined的直接原因。
同时GET_PROJECTS_SUCCESS的返回逻辑也存在同样问题,没有保留原有状态的其他字段,会导致error等字段丢失。

2. 列表渲染回调缺少返回值

你在map方法的回调函数中用花括号包裹了JSX逻辑,但没有显式写return语句,就算数据正常也无法渲染出项目列表。同时列表渲染缺少必填的key属性,会触发react控制台警告。


修复代码

1. 修正Reducer

import { ActionTypes } from "../types";

const initialState = {
  projects: [],
  isLoading: false,
  error: null,
};

const projectsReducer = (state = initialState, action) => {
  switch (action.type) {
    case ActionTypes.GET_PROJECTS_REQUEST: {
      // 先解构原有state,再覆盖需要更新的字段
      return {
        ...state,
        isLoading: true
      }
    }
    case ActionTypes.GET_PROJECTS_SUCCESS: {
      return {
        ...state,
        isLoading: false,
        projects: action.payload,
      };
    }
    case ActionTypes.GET_PROJECTS_FAILED:
      return {
        ...state,
        error: action.message,
      };
    default: {
      return state;
    }
  }
};

export default projectsReducer;

2. 修正组件渲染逻辑

import React, { useState, useEffect } from "react";
import "./Projects.scss";
import { useSelector } from "react-redux";

function Projects() {
  const projects = useSelector((state) => state.projects);
  const isLoading = useSelector((state) => state.isLoading);

  console.log('PROJECTS', projects)
  return (
    <section className="Projects" id="work">
      <h2 className="Projects__title Projects__title--portfolio">My Work</h2>
      { !isLoading ? 
        // 可选链做兜底,避免极端情况报错
        projects?.projects?.map((project, index) => (
          // 用圆括号做隐式返回,添加key属性
          <div className="Projects__portfolio" key={index}>
            <p>HELLLO</p>
            <a href={project.html_url} className={`Projects__portfolio--img${index}`}></a>
          </div>
        )) : null}
    </section>
  );
}

export default Projects;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 20:51:00