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

React+TypeScript动态生成组件报错:对象不可作为React子元素

React + TypeScript Todo List:解决"Objects are not valid as a React child"报错

问题根源

你写的ProjectMenuItem组件直接把单个参数当作用户传入的项目名称,但React函数组件的第一个参数是props对象,不是单个属性值。所以你现在的projectName其实是一个形如{ projectName: "Project 1" }的对象,当你在<p>{projectName}</p>里渲染它时,React就会抛出"对象不能作为React子元素"的错误。

修复方案

1. 修正ProjectMenuItem组件的参数接收方式

有两种清晰的写法,同时完善TypeScript类型定义:

  • 解构props(推荐,代码更简洁):
export function ProjectMenuItem({ projectName }: { projectName: string }){
    return(
        <p>{projectName}</p>
    );
}
  • 直接使用props对象:
export function ProjectMenuItem(props: { projectName: string }){
    return(
        <p>{props.projectName}</p>
    );
}

2. 优化项目列表的key(可选但推荐)

你之前用Math.random()生成key是不稳定的,React推荐用唯一且固定的标识,比如项目自身的key(project1、project2这些):

function generateProjectMenuItems() {
    const projectMenuItems = [];
    for (const projectKey in projects) {
        const projectName: string = projects[projectKey as keyof typeof projects].title;
        projectMenuItems.push(<ProjectMenuItem key={projectKey} projectName={projectName} />);
    }
    return projectMenuItems;
}

修复后的完整代码

ProjectMenuItem.tsx

export function ProjectMenuItem({ projectName }: { projectName: string }){
    return(
        <p>{projectName}</p>
    );
}

ProjectList.tsx

export function ProjectList(){
    const projects = {
        project1: { title: 'Project 1' },
        project2: { title: 'Project 2' },
        project3: { title: 'Project 3' },
    };
    function generateProjectMenuItems() {
        const projectMenuItems = [];
        for (const projectKey in projects) {
            const projectName: string = projects[projectKey as keyof typeof projects].title;
            projectMenuItems.push(<ProjectMenuItem key={projectKey} projectName={projectName} />);
        }
        return projectMenuItems;
    }
    return(
        <div className="project-list flexbox">
            <p>project components go here</p>
            {generateProjectMenuItems()}
        </div>
    )
}

修改后,页面会正常渲染三个<p>元素,分别显示Project 1、Project 2、Project 3。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:41:03