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

React报错:Objects are not valid as a React child 数据渲染求助

问题描述

已遭遇该问题两天,无法正确渲染获取到的数据。检测得知schemes是对象类型,使用Object.keys方法后仍出现相同错误。数据结构中paymentData为数组,条目数量不固定,以下是相关代码文件及数据结构说明,请求解决方法。

schemeAPIslice 文件

export const schemeApiSlice = apiSlice.injectEndpoints({
    endpoints: (builder) => ({
        getSchemeOfUser: builder.query({
            query: () => ({
                url: `${SCHEME_API_URL}`,
                method: "GET",
                credentials: "include",
            }),
            keepUnusedDataFor: 5,
            providesTags: ["Schemes"],
        }),
        createScheme: builder.mutation({
            query: (data) => ({
                url: `${SCHEME_API_URL}/scheme_started`,
                method: "POST",
                body: data,
                credentials: "include",
            }),
            invalidatesTags: ["Schemes"],
        }),
    }),
});

export const { useGetSchemeOfUserQuery, useCreateSchemeMutation } = schemeApiSlice;

Dashboard.js

const { data } = useGetSchemeOfUserQuery();
<div className='container'>
                <SchemeData schemes={data?.schemes} />
            </div>

SchemeData 组件

const SchemeData = ({ schemes }) => {
    console.log(schemes);
    console.log(typeof schemes);

    console.log(typeof JSON.stringify(schemes));

    return (
        <div>
            <h5>Scheme List</h5>
            <ul>
                {Object.keys(schemes).map((item, i) => (
                    <li className='py-5' key={i}>
                        <span>{schemes[item]}</span>
                    </li>
                ))}
            </ul>
        </div>
    );
};

数据结构说明

返回的data对象中,schemes是嵌套对象,每个键对应一个方案条目,条目内包含paymentData(数组类型,元素数量不固定)等属性,结构大致如下:

{
  schemes: {
    "scheme_id_1": {
      id: "scheme_id_1",
      name: "xxx",
      paymentData: [/* 数组元素 */],
      // 其他属性
    },
    "scheme_id_2": {
      id: "scheme_id_2",
      name: "yyy",
      paymentData: [/* 数组元素 */],
      // 其他属性
    }
  }
}
解决方法

1. 处理数据未加载的边界情况

组件初始化时,接口请求还未完成,data?.schemes会是undefined,直接调用Object.keys会触发错误,需先做判断:

const SchemeData = ({ schemes }) => {
    // 数据未加载时显示加载提示
    if (!schemes) return <div>加载中...</div>;

    return (
        <div>
            <h5>Scheme List</h5>
            <ul>
                {Object.keys(schemes).map((schemeKey) => (
                    <li className='py-5' key={schemeKey}>
                        {/* 渲染方案具体属性,比如名称 */}
                        <h6>{schemes[schemeKey].name}</h6>
                        {/* 遍历渲染paymentData数组 */}
                        <div className="mt-2">
                            <p>支付记录:</p>
                            <ul>
                                {schemes[schemeKey].paymentData.map((payment, idx) => (
                                    <li key={idx}>{payment.amount} - {payment.date}</li>
                                ))}
                            </ul>
                        </div>
                    </li>
                ))}
            </ul>
        </div>
    );
};

2. 避免直接渲染对象

原代码中{schemes[item]}直接输出整个对象,React无法解析会报错,必须渲染对象的具体属性(如name、id),或对嵌套数组做遍历渲染。

3. 优化列表key的使用

不要用数组索引i作为key,改用方案的唯一标识(如schemeKey或schemes[schemeKey].id),避免列表更新时出现渲染异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:05:06