React报错之Element type is invalid
总览
产生"Element type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got"错误有多个原因:
- 在导入组件时,将默认导入和命名导入混淆。
- 忘记从文件中导出组件。
- 不正确地定义了一个React组件,例如,作为一个变量而不是一个函数或类。
为了解决该错误,确保使用大括号来导入命名导出而不是默认导出,并且只使用函数或类作为组件。
这里有个示例来展示错误是如何发生的。
// ️ must be function or class (NOT variable)
const Button = <button>Click</button>;
export default function App() {
// ️ Warning: React.jsx: type is invalid -- expected a string
// (for built-in components) or a class/function
// (for composite components) but got:
return (
<div>
<Button />
<h1>hello world</h1>
</div>
);
}
上述代码问题在于,我们声明了Button
变量,该变量返回了JSX代码。
函数组件
为了解决该错误,我们必须使用函数组件来代替。
// ️ is now function
const Button = () => {
return <button>Click</button>;
};
export default function App() {
return (
<div>
<Button />
<h1>hello world</h1>
</div>
);
}
现在,Button
是一个函数,并返回JSX代码。可以作为一个React组件使用。
混淆导入导出
另一个常见的错误原因是混淆了默认和命名的导入和导出。
当组件使用默认导出来导出时,你必须确保导入的时候没有使用大括号。
// Header.js
// ️ default export
export default function Header() {
return <h2>Hello world</h2>;
}
现在,它必须不带大括号导入。
// ️ default import
import Header from './Header';
export default function App() {
return (
<div>
<Header />
</div>
);
}
另一方面,如果你的组件使用命名导出来导出的话,它必须使用大括号导入。
// Header.js
// ️ named export
export function Header() {
return <h2>Hello world</h2>;
}
现在,当组件被导入时,它必须包裹在大括号内。
// ️ named import
import {Header} from './Header';
export default function App() {
return (
<div>
<Header />
</div>
);
}
确保你没有将一个组件作为默认导出,并试图将其作为命名导入(用大括号包裹),或者反过来。因为这是导致错误的一个常见原因。
如果错误尚未解决,确保重启你的开发服务以及IDE。
检查路径
你还应该确保指向模块的路径拼写正确,大小写正确以及指定导出组件的文件。
确保路径正确的最好方法是删除它,开始输入路径,让你的IDE用自动补全来帮助你。
如果你开始输入路径后没有得到自动补全,很可能是你的路径不正确。
使用ESM
确保你没有混淆ES Modules
和CommonJS
语法。
你应该在你的React.js应用程序中只使用
import/export
语法,而不是module.exports
或require()
语法。
从react-router-dom
导入
当我们从react-router
而不是react-router-dom
导入东西时,有时也会出现这个错误。
// ️ BAD
// import {Link} from 'react-router';
// GOOD
import {Link} from 'react-router-dom';
如果你使用react router,请确保从react-router-dom
导入,而不是从react-router
中。
当我们试图使用不是函数或类的东西作为一个组件时,会产生"Element type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got:"错误信息。
错误信息
你应该看一下
got:
后面的错误信息,因为它可能表明是什么原因导致的错误。
当我们使用一个组件时,我们必须确保它是一个函数或一个类。如果你使用任何其他的值作为一个组件,就会引起错误。
React报错之Element type is invalid的更多相关文章
- React报错Failed prop type: Invalid prop `component` of type `object` supplied to `Route`, expected `function`
引言 最近在忙毕业设计,博客也很久没更新了,毕业设计使用vue做了一个校园寻物网站,现在开始学Raect,记录一下自己遇到问题,react-redux的connect方法使得组件与Redux建立了联系 ...
- 运行报错:java.io.IOException: invalid constant type: 15
jdk,tomcat更新到jdk1.8与 tomcat8 运行报错:java.io.IOException: invalid constant type: 15 pom.xml文件中更新javassi ...
- scp使用加密算法报错unknown cipher type
为了提高scp的传输速度指定了scp的加密算法为arcfour $ scp -c arcfour localFile userName@remoteIP:remoteFile 得到报错unknown ...
- 解决C语言程序报错:return type defaults to‘int’
下面是通过自定义一个函数printN,之后在main函数中调用printN,使得可以通过输入整数N,将从1到N的全部整数都打印出来的程序. 但是在编译过程中却报错: return type defau ...
- react 报错的堆栈处理
react报错 Warning: You cannot PUSH the same path using hash history 在Link上使用replace 原文地址https://reactt ...
- 报错:Missing type map configuration or unsupported mapping
报错:Missing type map configuration or unsupported mapping □ 背景 当把View Model转换成Domain Model保存的时候,发生在Au ...
- Poi读取Excle报错 java.util.zip.ZipException: invalid stored block lengths
一:Poi读取Excle报错 java.util.zip.ZipException: invalid stored block lengths 系统中需要导出excle签收单,excle模板是预设好 ...
- selenium+python自动化88-批量操作循环点击报错:Element not found in the cache - perhaps the page has changed since it was looked up
前言 selenium定位一组元素,批量操作循环点击的时候会报错:Element not found in the cache - perhaps the page has changed since ...
- vuex2 mapActions 报错 `unknown action type: xxxx`
export const setBreadCrumb = ({ dispatch }, data) => { dispatch('SET_BREADCRUMB', data) } 当调用的时候报 ...
- JavaWeb报错:java.sql.SQLException: Invalid value for getInt()
1.错误描述:在对数据库进行操作时,控制台报错:java.sql.SQLException: Invalid value for getInt() :2.错误原因:数据库中表的字段的类型与实体类中属性 ...
随机推荐
- 1- Mac和Linux远程连接服务器异常修复(WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!)
p.p1 { margin: 0; font: 11px Menlo; color: rgba(0, 0, 0, 1) } span.s1 { font-variant-ligatures: no-c ...
- 关于aws-Global区的新账户的一些限制坑点
在使用global-aws的时候,遇到几个限制坑点记录如下(都是需要发请求找aws服务支持才能提高) 1.关于Elastic IPs的限制,默认为 5,这样在ec2下的Elastic IPs中最多只能 ...
- MySQL 窗口函数
1. 窗口函数概念和语法 窗口函数对一组查询行执行类似聚合的操作.然而,聚合操作将查询行分组到单个结果行,而窗口函数为每个查询行产生一个结果: 函数求值发生的行称为当前行 与发生函数求值的当前行相关的 ...
- .Net Framework中的AppDomain.AssemblyResolve事件的常见用法、问题,以及解决办法
一.简述 本文简要的介绍.NET Framework中System.AppDomain.AssemblyResolve事件的用法.使用注意事项,以及复杂场景下AssemblyResolve事件的污染问 ...
- 【Odoo】Odoo16-性能优化提升
上海序说科技,专注于基于Odoo项目实施,实现企业数智化,助力企业成长. 老韩头的开发日常,博客园分享(2022年前博文) 10月12日,Odoo16版本正式发布,本文将就Odoo官方在性能方面做的优 ...
- scrapy出现SSL问题 如何解决? <twisted.python.failure.Failure OpenSSL.SSL.Error: [('SSL routines', '', 'unsafe legacy renegotiation disabled')]>
问题:<twisted.python.failure.Failure OpenSSL.SSL.Error: [('SSL routines', '', 'unsafe legacy renego ...
- python-代码编程规范
命名 常用简写 名称相关 # 信息 information: info # 功能 function : func # 数量 quantity:qty PYQT相关 button : btn_ chec ...
- 新建Maui工程运行到IiOS物理设备提示 Could not find any available provisioning profiles for iOS 处理办法
在构建 MAUI App 或 MAUI Blazor 时,您可能会收到以下 Could not find any available provisioning profiles for iOS. Pl ...
- 08 | 白话容器基础(四):重新认识Docker容器
你好,我是张磊.今天我和你分享的主题是:白话容器基础之重新认识Docker容器. 在前面的三次分享中,我分别从Linux Namespace的隔离能力.Linux Cgroups的限制能力,以及基于r ...
- c#入参使用引用类型为啥要加ref?
摘一段来自官网的说明 :方法的参数列表中使用 ref 关键字时,它指示参数按引用传递,而非按值传递. ref 关键字让形参成为实参的别名,这必须是变量. 换而言之,对形参执行的任何操作都是对实参执行的 ...