React报错之组件不能作为JSX组件使用
正文从这开始~
总览
组件不能作为JSX组件使用,出现该错误有多个原因:
- 返回JSX元素数组,而不是单个元素。
- 从组件中返回JSX元素或者
null
以外的任何值。 - 使用过时的React类型声明。
返回单个JSX元素
下面是一个错误如何发生的示例。
// 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 = () => {
// ️ this returns undefined
return
<h2>hello world</h2>
};
export default App;
上述代码示例返回undefined
,因为我们把返回语句放在一行,而把JSX代码放在下一行,并且没有使用括号。
我们不允许从组件中返回
undefined
,因此会出现这个错误。
为了解决该错误,我们必须确保返回的代码是可达的。
const App = () => {
return (
<div>
<h2>hello world</h2>
</div>
);
};
export default App;
如果你确信从React组件中,返回了单个JSX元素或者null
。但是错误依旧存在,试着更新React类型声明。
更新React类型声明
在项目的根目录下打开终端,运行以下命令:
# ️ with NPM
npm install --save-dev @types/react@latest @types/react-dom@latest
# ️ if you also want to update react and react-dom
npm install react@latest react-dom@latest
# ------------------------------
# ️ with YARN
yarn add @types/react@latest @types/react-dom@latest --dev
# ️ if you also want to update react and react-dom
yarn add react@latest react-dom@latest
该命令将会更新你的react类型声明版本。
确保重启开发服务器,如有必要请重启IDE。开发服务器不会接收这些更改,直到你停止它并重新运行
npm start
命令。
如果错误还没有被解决,尝试删除node_modules
和package-lock.json
(不是package.json
)文件,重新运行npm install
,重启IDE。
# ️ delete node_modules and package-lock.json
rm -rf node_modules
rm -f package-lock.json
rm -f yarn.lock
# ️ clean npm cache
npm cache clean --force
npm install
如果错误依旧存在,请确保重启了IDE和开发服务器。VSCode经常出现故障,有时重启就能解决问题。
React报错之组件不能作为JSX组件使用的更多相关文章
- react 报错的堆栈处理
react报错 Warning: You cannot PUSH the same path using hash history 在Link上使用replace 原文地址https://reactt ...
- React报错之JSX element type does not have any construct or call signatures
正文从这开始~ 总览 当我们试图将元素或react组件作为属性传递给另一个组件,但是属性的类型声明错误时,会产生"JSX element type does not have any con ...
- React报错之Type '() => JSX.Element[]' is not assignable to type FunctionComponent
正文从这开始~ 总览 当我们尝试从函数组件中返回元素组成的数组时,会产生"Type '() => JSX.Element[]' is not assignable to type Fu ...
- react报错 TypeError: Cannot read property 'setState' of undefined
代码如下: class test extends Component { constructor(props) { super(props); this.state = { liked: false ...
- React报错之Cannot find name
正文从这开始~ .tsx扩展名 为了在React TypeScript中解决Cannot find name报错,我们需要在使用JSX文件时使用.tsx扩展名,在你的tsconfig.json文件中把 ...
- React报错之Cannot find namespace context
正文从这开始~ 总览 在React中,为了解决"Cannot find namespace context"错误,在你使用JSX的文件中使用.tsx扩展名,在你的tsconfig. ...
- 【记录tomcat报错解决办法】tomcat请求组件没有找到的问题
报错原因: An incompatible version 1.1.14 of APR based Apache Tomcat Native library is installed, while T ...
- React报错:Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix,
今天在开发时报了以下错误,记录一下 我们不能在组件销毁后设置state,防止出现内存泄漏的情况 出现原因直接告诉你了,组件都被销毁了,还设置个锤子的state啊 解决方案: 利用生命周期钩子函数:co ...
- React报错 :browserHistory doesn't exist in react-router
由于版本问题,React中history不可用 import { hashHistory } from 'react-router' 首先应该导入react-router-dom包: import { ...
随机推荐
- Python 什么是flask框架?快速入门
一:Python flask框架 前言 1.Python 面向对象的高级编程语言,以其语法简单.免费开源.免编译扩展性高,同时也可以嵌入到C/C++程序和丰富的第三方库,Python运用到大数据分析. ...
- 1903021121-刘明伟-java十一周作业-java面向对象编程
项目 内容 课程班级博客链接 19级信计班(本) 作业要求链接 第十一周作业 博客名称 1903021121-刘明伟-java十一周作业-java面向对象 要求 每道题要有题目,代码(使用插入代码,不 ...
- unity---对象池
当内存占满了,GC会自动清理内存 优化方法:对象池 Invoke("Push",1);//延迟一秒时间调用 高级缓存池 小池子 大池子
- BUUCTF刷题记录(更新中...)
极客大挑战 2019]EasySQL-1 直接通过输入万能密码:' or 1=1#实现注入: 思考:服务端sql语句应该为:select * from users where username='xx ...
- .NET MAUI 正式发布,再见了 Xamarin.Forms
David Ortinau 在dotnet 团队博客上发表了一篇文章<Introducing .NET MAUI – One Codebase, Many Platforms>,在这篇文章 ...
- 基于.NetCore开发博客项目 StarBlog - (8) 分类层级结构展示
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- SMFL 教程&个人笔记
本文大部分来自官方教程的Google翻译 但是加了一点点个人的理解和其他相关知识 转载请注明 原文链接 :https://www.cnblogs.com/Multya/p/16273753.html ...
- 【Java】在IDEA中将Javafx项目打包成为可运行的.jar文件
在使用Javafx制作一个图形化界面程序的时候,我遇到了打包文件的难题. 按照网上给出的解决方案构建出来的jar文件总是没有办法运行. 以下是我最终的解决方案. 我使用的IDE是IntelliJ ID ...
- QC快速充电
QC快充 一.高通QC快充的介绍 二.识别充电类型的芯片介绍 三.QC充电曲线 四.如何在log中看QC充电类型 五.QC3识别错误 六.波形图 一.高通QC快充的介绍 高通QC快充技术,又称Quic ...
- 1.3温度转换(中国大学Mooc-Python 语言程序设计)
温度转换 温度刻画的两种不同体系 1.摄氏度:(中国等世界大多数国家使用) 以1标准大气压下水的结冰点为0度,沸点为100度,将温度进行等分刻画 2.华氏度:(美国.英国等国家使用) 以1标准大气压 ...