我正在使用Next.js和TypeScript。我有一个项目数组,我循环并显示在我的HTML中。当我在我的项目数组中传递名为“InboxIcon”的组件作为JSX时,我得到了下面的错误:
这不起作用...它导致错误
const features = [
{
title: 'hello'
icon: <InboxIcon strokeWidth={6}/>
},
]
服务器错误错误元素类型无效:应为字符串(对于内置组件)或类/函数(对于复合组件),但得到:对象。
生成页面时发生此错误。任何控制台日志都将显示在终端窗口中。调用堆栈renderElement
This works
const features = [
{
title: 'hello'
icon: InboxIcon
},
]
我怎样才能让第一种方法起作用呢?
索引.tsx
import { ItemColumnOne } from '@/components/Card'
import { InboxIcon } from '@/components/InboxIcon'
const features = [
{
title: 'hello'
icon: <InboxIcon strokeWidth={6}/>
},
]
export default function Home() {
return (
<>
{features.map((feature) => (
<Card
key={feature.title}
icon={feature.icon}
/>
))}
</>
)
卡片.tsx
interface Props {
title: string
icon: any
}
export function Card(props: Props) {
return (
<div>
<props.icon className="display-icon"/>
{props.title}
</div>
)
}
InboxIcon
interface Props {
className?: string
strokeWidth: number
}
export function InboxIcon(props: Props) {
return (
<svg
className={props.className}
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
aria-hidden="true"
>
<path
strokeWidth={props.strokeWidth}
fill="currentColor"
d="M 70 110 C 70 140, 110 140, 110 110"
/>
</svg>
)
}
1条答案
按热度按时间z2acfund1#
在功能组件方面,这一行:
相当于:
这一行:
相当于:
所以在最基本的形式下你要做的是:
因此,错误:“元素无效...得到:对象”。
希望你能明白为什么这行不通。
幸运的是,React提供了一种向现有组件添加属性的方便方法:
cloneElement
Stackblitz Typescript示例:
https://stackblitz.com/edit/react-ts-6ufs9e?file=index.tsx
JavaScript代码片段示例