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

React传递组件作为Props报错:Element type is invalid问题求助

React组件传递Props渲染报错解决

问题背景

我有一个名为EditForm的组件,已在ProductList组件中导入。需要将EditForm组件从ProductList传递给ListContainer组件作为Props,并在ListContainer内部渲染该组件。

预期流程

// EditForm.js
const EditForm = () => {...}
export default EditForm

// ProductList.js
import EditForm from "./EditForm"
..
<ListContainer editForm={EditForm} /> // 将editform作为props传递

// ListContainer.js
const ListContainer({editForm: EditForm}) => {
    ...
    <EditForm /> // 在此处使用editform
}

实际代码

ProductList.js

import React from "react"
import ListContainer from "../common/ListContainer";
import EditForm from "./EditForm";

const ef = () => {
    return (<EditForm />)
}

const ProductList = () => {
    return (
        <React.Fragment>
            <ListContainer  ef={ef} />
        </React.Fragment >
    )
}

export default ProductList

ListContainer.js

import React, { useState } from "react"

const ListContainer = ({ ef: EditComponent }) => {
    return (
        <React.Fragment>
                <EditComponent />
        </React.Fragment >
    )
}

export default ListContainer

报错信息

运行后出现错误:

Uncaught Error: Element type is invalid: expected a string (for built-in components) or a class/function

解决方案

问题出在组件传递方式上,无需额外封装函数,直接传递EditForm组件本身即可:

修改后的ProductList.js:

import React from "react"
import ListContainer from "../common/ListContainer";
import EditForm from "./EditForm";

const ProductList = () => {
    return (
        <React.Fragment>
            <ListContainer ef={EditForm} />
        </React.Fragment >
    )
}

export default ProductList

ListContainer.js保持不变即可。

原因说明

你之前封装的ef函数返回的是<EditForm />,这是一个已渲染的React元素,而非组件本身。React要求作为Props传递的可渲染组件必须是类或函数类型(即组件定义),而非已实例化的元素。直接传递EditForm组件后,ListContainer中的EditComponent就是该组件的定义,渲染<EditComponent />就能正确生成对应的UI元素。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:35:19