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

React Redux映射对象内数组时页面空白,如何解决?

问题:React + Redux Toolkit映射对象内数组时页面空白

我用React和Redux Toolkit做前端开发,尝试映射对象里的数组时整个页面变成空白。

数据结构说明

Redux状态中的mocktest是一个对象,内部包含questionSet数组,数组元素带有setName字段。

页面获取状态代码

const { id } = useParams();
const { mocktest, isLoading, isError, message } = useSelector(
  (state) => state.mocktest
);
console.log(mocktest);

useEffect(() => {
  if (isError) {
    toast.error(message);
  }
  dispatch(getMockTestById(id));
}, [isError, message, dispatch, id]);

Slice异步请求代码

export const getMockTestById = createAsyncThunk(
  'mocktest/getMockTestById',
  async (id, thunkAPI) => {
    try {
      // const token = thunkAPI.getState().auth.user.token;
      return await mockTestServices.getMockTestById(id);
    } catch (error) {
      const message =
        (error.response &&
          error.response.data &&
          error.response.data.message) ||
        error.message ||
        error.toString();
      return thunkAPI.rejectWithValue(message);
    }
  }
);

尝试的数组映射代码

{mocktest.questionSet.map((qSet) => (
  <h4 className="text-center">{qSet.setName}</h4>
))}

我想让setName显示在h4标签里,还试过加this.props,但没用。


解决方案

页面空白的核心原因是初始状态下mocktest可能为undefined或空对象,直接访问mocktest.questionSet会触发JS报错,导致组件渲染失败,可以通过以下方式修复:

  1. 添加可选链避免空值报错
    在访问嵌套属性时使用?.操作符,同时给映射元素加上唯一key(符合React列表渲染规范):

    {mocktest?.questionSet?.map((qSet) => (
      <h4 key={qSet.id} className="text-center">{qSet.setName}</h4>
    ))}
    
  2. 初始化Redux默认状态
    在Slice的初始状态中,给mocktest设置包含空数组的默认值,确保数据未加载时questionSet是合法数组:

    const initialState = {
      mocktest: { questionSet: [] },
      isLoading: false,
      isError: false,
      message: ''
    }
    
  3. 结合加载状态做条件渲染
    利用isLoading状态在数据请求完成前显示加载提示,提升用户体验:

    {isLoading ? (
      <div>加载中...</div>
    ) : (
      mocktest?.questionSet?.map((qSet) => (
        <h4 key={qSet.id} className="text-center">{qSet.setName}</h4>
      ))
    )}
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:41:58