总览

产生"Element type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got"错误有多个原因:

  1. 在导入组件时,将默认导入和命名导入混淆。
  2. 忘记从文件中导出组件。
  3. 不正确地定义了一个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 ModulesCommonJS语法。

你应该在你的React.js应用程序中只使用import/export语法,而不是module.exportsrequire()语法。

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的更多相关文章

  1. React报错Failed prop type: Invalid prop `component` of type `object` supplied to `Route`, expected `function`

    引言 最近在忙毕业设计,博客也很久没更新了,毕业设计使用vue做了一个校园寻物网站,现在开始学Raect,记录一下自己遇到问题,react-redux的connect方法使得组件与Redux建立了联系 ...

  2. 运行报错:java.io.IOException: invalid constant type: 15

    jdk,tomcat更新到jdk1.8与 tomcat8 运行报错:java.io.IOException: invalid constant type: 15 pom.xml文件中更新javassi ...

  3. scp使用加密算法报错unknown cipher type

    为了提高scp的传输速度指定了scp的加密算法为arcfour $ scp -c arcfour localFile userName@remoteIP:remoteFile 得到报错unknown ...

  4. 解决C语言程序报错:return type defaults to‘int’

    下面是通过自定义一个函数printN,之后在main函数中调用printN,使得可以通过输入整数N,将从1到N的全部整数都打印出来的程序. 但是在编译过程中却报错: return type defau ...

  5. react 报错的堆栈处理

    react报错 Warning: You cannot PUSH the same path using hash history 在Link上使用replace 原文地址https://reactt ...

  6. 报错:Missing type map configuration or unsupported mapping

    报错:Missing type map configuration or unsupported mapping □ 背景 当把View Model转换成Domain Model保存的时候,发生在Au ...

  7. Poi读取Excle报错 java.util.zip.ZipException: invalid stored block lengths

    一:Poi读取Excle报错  java.util.zip.ZipException: invalid stored block lengths 系统中需要导出excle签收单,excle模板是预设好 ...

  8. 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 ...

  9. vuex2 mapActions 报错 `unknown action type: xxxx`

    export const setBreadCrumb = ({ dispatch }, data) => { dispatch('SET_BREADCRUMB', data) } 当调用的时候报 ...

  10. JavaWeb报错:java.sql.SQLException: Invalid value for getInt()

    1.错误描述:在对数据库进行操作时,控制台报错:java.sql.SQLException: Invalid value for getInt() :2.错误原因:数据库中表的字段的类型与实体类中属性 ...

随机推荐

  1. echarts 改变个别省份的边界线颜色

    想要实现地图,首先要引入china.js文件,如果有引入就直接调过本步骤去下方看代码,没有引入可以点击下方链接自行Ctrl c + Ctrl v china.js import "../.. ...

  2. 自定义View6 -塔防小游戏:第三篇防御塔随意放置+多组野怪

    第一篇:一个防御塔+多个野怪(简易版)第二篇:防御塔随意放置第三篇:防御塔随意放置+多组野怪 1.动态addView防御塔 2.防御塔放置后不可以移动 3.弯曲道路 4.素材替换 第四篇:多波野怪 第 ...

  3. 条件期望:Conditional Expectation 举例详解之入门之入门之草履虫都说听懂了

    我知道有很多人理解不了 "条件期望" (Conditional Expectation) 这个东西,有的时候没看清把随机变量看成事件,把 \(\sigma\)-algebra 看成 ...

  4. 2022-08-21-Freewind主题_cdn替换版

    layout: post cid: 16 title: Freewind主题 cdn替换版 slug: 16 date: 2022/08/21 14:06:00 updated: 2022/08/21 ...

  5. Educational Codeforces Round 137 (Rated for Div. 2) A-F

    比赛链接 A 题解 知识点:数学. \(4\) 位密码,由两个不同的数码组成,一共有 \(C_4^2\) 种方案.从 \(10-n\) 个数字选两个,有 \(C_{10-n}^2\) 种方案.结果为 ...

  6. webRTC demo

    准备: 信令服务 前端页面用于视频通话 demo github 地址. 前端页面 为了使 demo 尽量简单,功能页面如下,即包含登录.通过对方手机号拨打电话的功能.在实际生成过程中,未必使用的手机号 ...

  7. ES 客户端 RestHighLevelClient Connection reset by peer 亲测有效 2022-11-05

    导读 最新公司ES集群老出现连接关闭,进而导致查询|写入ES时报错,报错日志显示如下 [2m2022-10-23 14:13:10.088[0;39m - [31mERROR[0;39m - [35m ...

  8. P6492 STEP(线段树维护左右区间pushup)

    题目链接 题目描述: 给定一个长度为\(~\)n\(~\)的字符序列\(~\)a,初始时序列中全部都是字符\(~\)L. 有\(~\)q\(~\)次修改,每次给定一个\(~\)x,做出如下变化: \( ...

  9. android 代码分析

    1.@Override注解 @Override 注解是用来指定方法重写的,只能修饰方法并且只能用于方法重写,不能修饰其它的元素. 作用是告诉编译器检查这个方法,保证父类要包含一个被该方法重写的方法,否 ...

  10. Burpsuite系列1--自动扫描

    第一章 简述     Burpsuite是基于Java的用于web安全的工具,能够进行爬虫.代理.编码.密码爆破等任务,并支持对XSS漏洞.文件包含等漏洞的主动扫描或被动扫描.burpsuite2.0 ...