未捕获的错误:不变违规:元素类型无效:期望一个字符串(对于内置组件)或类/函数但得到:对象

Pan*_*kur 490 reactjs react-router

我收到此错误:

未捕获错误:不变违规:元素类型无效:期望一个字符串(对于内置组件)或一个类/函数(对于复合组件)但得到:object.

这是我的代码:

var React = require('react')
var ReactDOM =  require('react-dom')
var Router = require('react-router')
var Route = Router.Route
var Link = Router.Link

var App = React.createClass({
  render() {
    return (
      <div>
        <h1>App</h1>
        <ul>
          <li><Link to="/about">About</Link></li>
        </ul>
      </div>
    )
  }
})

var About = require('./components/Home')
ReactDOM.render((
  <Router>
    <Route path="/" component={App}>
      <Route path="about" component={About} />
    </Route>
  </Router>
), document.body)
Run Code Online (Sandbox Code Playgroud)

我的Home.jsx文件:

var React = require('react');
var RaisedButton = require('material-ui/lib/raised-button');

var Home = React.createClass({
  render:function() {
    return (
        <RaisedButton label="Default" />
    );
  },
});

module.exports = Home;
Run Code Online (Sandbox Code Playgroud)

Joh*_*hnL 842

在我的情况下(使用Webpack),区别在于:

import {MyComponent} from '../components/xyz.js';
Run Code Online (Sandbox Code Playgroud)

VS

import MyComponent from '../components/xyz.js';
Run Code Online (Sandbox Code Playgroud)

第二个工作,而第一个导致错误.

  • 来自未来的Googler,谢谢这是我的问题!回想起来它是有意义的,因为第一个是解构导出,但是如果你使用默认值,那么它只是试图去构造一个函数/类. (78认同)
  • 对于仍然想知道为什么会这样做的人 - {MyComponent}从文件'../components/xyz.js'导入导出'MyComponent' - 第二个从'../components/xyz.js'导入*default*export . (39认同)
  • 相反对我有用,但嘿,那样做:D (28认同)
  • &lt;rant&gt;这太棒了:如果我写 `import {App} from './App';`,错误是 `'./App' 不包含名为 'App' 的导出。`,如果我删除大括号时,错误变为“元素类型无效:需要一个字符串...但得到:对象。”。欢迎来到 ES 导入地狱。&lt;/rant&gt; (7认同)
  • 巨大.为什么会这样? (6认同)
  • 对于未来的人,我的案例是我正在使用的元素名称中的拼写错误.我将`<TabBarIOS.item>`更改为`<TabBarIOS.Item>` (3认同)

小智 155

您需要导出默认值或require(路径).default

var About = require('./components/Home').default
Run Code Online (Sandbox Code Playgroud)

  • 嗯,在我的案例中添加.default解决了这个问题.但是,我实际上是在该类上导出默认的Home扩展组件,所以我希望它能在没有'.default'的情况下工作 (3认同)
  • 你可以解释一下我们添加默认值时会发生什么的原因吗? (3认同)
  • 我在'react-native-navbar'中遇到过这个问题.我在需求上调用了默认值,它解决了我的问题.谢谢. (2认同)

小智 53

你刚刚模块化了你的任何React组件吗?如果是,如果您忘记指定module.exports,则会出现此错误,例如:

非模块化的先前有效的组件/代码:

var YourReactComponent = React.createClass({
    render: function() { ...
Run Code Online (Sandbox Code Playgroud)

模块化的组件/代码与module.exports:

module.exports = React.createClass({
    render: function() { ...
Run Code Online (Sandbox Code Playgroud)

  • 我能够将其简化为:`export default class YourReactComponent extends React.Component {` (3认同)
  • 创建类然后导出会是一样的吗?就像您的第一个代码片段,然后是“ module.exports = YourReactComponent`” (2认同)

NSC*_*der 18

如果您收到此错误,可能是因为您正在使用导入链接

import { Link } from 'react-router'

相反,它可能更好用

import { Link } from 'react-router-dom'
                      ^--------------^

我相信这是反应路由器版本4的要求


Dav*_*uan 17

https://github.com/rackt/react-router/blob/e7c6f3d848e55dda11595447928e843d39bed0eb/examples/query-params/app.js#L4 Router也是其中一个属性react-router.因此,更改您的模块需要这样的代码:

  var reactRouter = require('react-router')
  var Router = reactRouter.Router
  var Route = reactRouter.Route
  var Link = reactRouter.Link
Run Code Online (Sandbox Code Playgroud)

如果你想使用ES6语法链接use(import),请使用babel作为帮助.

BTW,使你的代码的作品,我们可以添加{this.props.children}App,如

render() {
  return (
    <div>
      <h1>App</h1>
      <ul>
        <li><Link to="/about">About</Link></li>
      </ul>
      {this.props.children}
    </div>

  )
}
Run Code Online (Sandbox Code Playgroud)


Bal*_*i M 15

不要对单个问题的答案列表感到惊讶.这个问题有多种原因;

对于我的情况,警告是

warning.js:33警告:React.createElement:type无效 - 期望一个字符串(对于内置组件)或一个类/函数(对于复合组件)但得到:undefined.您可能忘记从其定义的文件中导出组件.请在index.js中检查您的代码:13.

其次是错误

invariant.js:42 Uncaught Error:元素类型无效:期望一个字符串(对于内置组件)或一个类/函数(对于复合组件)但得到:undefined.您可能忘记从其定义的文件中导出组件.

我无法理解错误,因为它没有提到任何方法或文件名.只有在看到上面提到的这个警告后我才能解决.

我在index.js上有以下行.

<ConnectedRouter history={history}>
Run Code Online (Sandbox Code Playgroud)

当我使用关键字"ConnectedRouter"搜索上述错误时,我在GitHub页面中找到了解决方案.

该错误是因为,当我们安装react-router-redux包时,默认情况下我们安装这个包. https://github.com/reactjs/react-router-redux但不是实际的库.

要解决此错误,请通过指定npm范围来安装正确的包 @

npm install react-router-redux@next
Run Code Online (Sandbox Code Playgroud)

您无需删除错误安装的软件包.它会被自动覆盖.

谢谢.

PS:甚至警告都会帮助你.不要仅仅因为看错误而忽略警告.


jas*_*ard 14

鉴于您的错误:

'Uncaught Error: Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function but got: object'

您有 2 个选择:

  1. 导出文件可以有字default,如
export default class someNameHere
Run Code Online (Sandbox Code Playgroud)

然后您的导入将需要避免{}在它周围使用。如

import somethingHere from someWhereHere
Run Code Online (Sandbox Code Playgroud)
  1. 避免使用默认词。然后你的出口看起来像
export class someNameHere
Run Code Online (Sandbox Code Playgroud)

那么您的导入必须使用{}. 喜欢

import {somethingHere} from someWhereHere
Run Code Online (Sandbox Code Playgroud)

  • 很棒的答案!!!+1...我完全忽略了`export default {component name}` 忘记添加它 (2认同)
  • @TimothyMacharia 导入声明有四种形式: 1. 命名导入: import {export1,export2} from "module-name"; 2. 默认导入: import defaultExport from "module-name"; 3、命名空间导入:import * as name from "module-name";4.副作用导入:导入“模块名”;[参考](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import) (2认同)

Kat*_*tti 11

在我的例子中,导出的子模块之一没有返回适当的反应组件.

__CODE__ 代替 __CODE__

显示的错误是针对父母的,因此无法弄清楚.


小智 9

就我而言,这是由错误的评论符号引起的.这是错的:

<Tag>
    /*{ oldComponent }*/
    { newComponent }
</Tag>
Run Code Online (Sandbox Code Playgroud)

这是对的:

<Tag>
    {/*{ oldComponent }*/}
    { newComponent }
</Tag>
Run Code Online (Sandbox Code Playgroud)

注意大括号


小智 9

我有同样的错误: ERROR FIX !!!!

我使用'react-router-redux'v4,但她很糟糕.在npm安装react-router-redux @之后, 我正在使用 "react-router-redux":"^ 5.0.0-alpha.9",

而且它的工作


tyb*_*103 7

我通过import App from './app/';期望它导入来获得这个./app/index.js,但它改为导入./app.json.

  • 这是解释:https://github.com/facebook/react-native/issues/12539 (2认同)

Chr*_*dam 7

我遇到了同样的问题,并意识到我在JSX标记中提供了一个Undefined React组件。事实是,要渲染的react组件是动态计算的,并且最终未定义!

错误指出:

不变违规:元素类型无效:预期为字符串(对于内置组件)或类/函数(对于复合组件),但得到:未定义。您可能忘记了从定义文件中导出组件。检查C。,的渲染方法。

产生此错误的示例:

var componentA = require('./components/A');
var componentB = require('./components/B');

const templates = {
  a_type: componentA,
  b_type: componentB
}

class C extends React.Component {
  constructor(props) {
    super(props);
  }
  
  // ...
  
  render() {
    //Let´s say that depending on the uiType coming in a data field you end up rendering a component A or B (as part of C)
    const ComponentTemplate = templates[this.props.data.uiType];
    return <ComponentTemplate></ComponentTemplate>
  }
  
  // ...
}
Run Code Online (Sandbox Code Playgroud)

问题是提供了无效的“ uiType”,因此这导致产生未定义的结果:

templates['InvalidString']
Run Code Online (Sandbox Code Playgroud)


Ole*_*leg 7

与React Native最新版本0.50及更高版本有类似问题.

对我来说,这是一个区别:

import App from './app'
Run Code Online (Sandbox Code Playgroud)

import App from './app/index.js'
Run Code Online (Sandbox Code Playgroud)

(后者解决了这个问题).花了我几个小时来抓住这个奇怪的,很难注意到细微差别:(


the*_*rns 5

就我而言,导入是由于库而隐式发生的。

我设法通过改变来修复它

export class Foo

export default class Foo.


小智 5

就像对此的快速补充。我遇到了同样的问题,而Webpack正在编译测试,并且应用程序运行良好。当我将组件导入测试文件时,我在其中一个导入中使用了不正确的大小写,这会导致相同的错误。

import myComponent from '../../src/components/myComponent'
Run Code Online (Sandbox Code Playgroud)

本来应该

import myComponent from '../../src/components/MyComponent'
Run Code Online (Sandbox Code Playgroud)

请注意,导入名称myComponent取决于MyComponent文件内导出的名称。


小智 5

另一个可能的解决方案,对我有用:

当前,react-router-redux处于beta中,npm返回4.x,但不返回5.x。但是@types/react-router-redux返回了5.x。因此,使用了未定义的变量。

强制NPM / Yarn使用5.x为我解决了该问题。


ber*_*000 5

当我在同一目录中有一个具有相同根名称的 .jsx 和 .scss 文件时,我遇到了这个错误。

因此,例如,如果您在同一个文件夹中拥有Component.jsxComponent.scss并且您尝试执行以下操作:

import Component from ./Component

Webpack 显然感到困惑,至少在我的情况下,当我真的想要 .jsx 文件时,它会尝试导入 scss 文件。

我能够通过重命名 .scss 文件并避免歧义来修复它。我也可以显式导入 Component.jsx


And*_*dru 5

就我而言,我使用的是默认导出,但不导出 afunctionReact.Component,而只是一个JSX元素,即

错误:

export default (<div>Hello World!</div>)
Run Code Online (Sandbox Code Playgroud)

作品:

export default () => (<div>Hello World!</div>)
Run Code Online (Sandbox Code Playgroud)


小智 5

我在反应路由中遇到此错误,问题是我正在使用

<Route path="/" component={<Home/>} exact />

但错误的路线需要组件作为类/函数,所以我将其更改为

<Route path="/" component={Home} exact />

它起作用了。(只要避免组件周围的大括号即可)