原文链接:https://bobbyhadz.com/blog/react-cannot-be-used-as-a-jsx-component[1]
作者:Borislav Hadzhiev[2]
正文从这开始~
总览
组件不能作为JSX组件使用,出现该错误有多个原因:
- 返回JSX元素数组,而不是单个元素。
- 从组件中返回JSX元素或者
null
以外的任何值。 - 使用过时的React类型声明。
返回单个JSX元素
下面是一个错误如何发生的示例。
代码语言:javascript复制// App.tsx
// ⛔️ 'App' cannot be used as a JSX component.
// Its return type 'Element[]' is not a valid JSX element.
// Type 'Element[]' is missing the following properties from type 'ReactElement<any, any>': type, props, key
const App = () => {
return ['a', 'b', 'c'].map(element => {
return <h2 key={element}>{element}</h2>;
});
};
export default App;
代码示例中的问题是,我们返回的是一个JSX元素数组,而不是单个JSX元素。
为了解决这种情况下的错误,我们必须使用React fragment
或者div
元素来包裹数组。
// App.tsx
const App = () => {
return (
<>
{['a', 'b', 'c'].map(element => {
return <h2 key={element}>{element}</h2>;
})}
</>
);
};
export default App;
现在我们的组件返回了单个JSX元素,这样错误就解决了。
当我们需要对子节点列表进行分组而不需要向DOM中添加额外的节点时,就会使用Fragments。
您可能还会看到使用了更加详细的fragments
语法。
// App.tsx
import React from 'react';
const App = () => {
return (
<React.Fragment>
{['a', 'b', 'c'].map(element => {
return <h2 key={element}>{element}</h2>;
})}
</React.Fragment>
);
};
export default App;
你也可以使用div元素来充当包裹器,从组件中返回单个JSX元素。
不要忘记返回值
另一个常见原因是,我们从组件中返回JSX元素或者null
以外的任意值,或者忘记返回值。
// ⛔️ 'App' cannot be used as a JSX component.
// Its return type 'undefined' is not a valid JSX element.
const App = () => {
//