Erro não capturado: Violação invariável: o tipo de elemento é inválido: espera-se uma sequência (para componentes internos) ou uma classe / função, mas obtém: object


528

Estou recebendo este erro:

Erro não capturado: Violação invariável: o tipo de elemento é inválido: espera-se uma sequência (para componentes internos) ou uma classe / função (para componentes compostos), mas obtém: object.

Este é o meu código:

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)

Meu Home.jsxarquivo:

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;



Este erro pode aumentar se você tentar importar um componente inexistente . Certifique-se de não ter erro de digitação e de que o componente realmente tenha esse nome. No caso de bibliotecas, certifique-se de usar a versão correta, pois os componentes podem ter nomes diferentes em versões diferentes.
totymedli

Isso também pode acontecer quando você define uma propriedade, talvez através da destruição do ES6, com o mesmo nome de um componente já importado (e tenta transmiti-la para outro componente).
Philip Murphy

Respostas:


886

No meu caso ( usando o Webpack ), havia a diferença entre:

import {MyComponent} from '../components/xyz.js';

vs

import MyComponent from '../components/xyz.js';

O segundo funciona enquanto o primeiro está causando o erro. Ou o contrário.


81
Googler do futuro aqui, graças a esse foi o meu problema! Faz sentido em retrospecto, pois o primeiro está destruindo a exportação, mas se você usou o padrão, está apenas tentando desestruturar uma função / classe.
ebolyen

3
Para futuras pessoas, meu caso foi um erro de digitação no nome do elemento que eu estava usando. Mudei <TabBarIOS.item>para<TabBarIOS.Item>
Ryan-Neal Mes

6
Imenso. Por que esse é o caso?
lol

45
Para quem ainda se pergunta por que isso funciona - {MyComponent} importa a exportação 'MyComponent' do arquivo '../components/xyz.js' - O segundo importa a exportação padrão de '../components/xyz.js'.
precisa saber é o seguinte

Pode ser também por causa da importação dentro do MyComponent. no meu caso o erro mencionado MyComponent, mas a declaração realmente importação dentro dela fazer com que o rror: import {SomeLibraryCompenent} de 'some-biblioteca'
ykorach

159

você precisa exportar o padrão ou exigir (caminho). padrão

var About = require('./components/Home').default

2
Eu tive esse problema com 'react-native-navbar'. Liguei para o padrão no exigir e ele corrigiu o meu problema. Obrigado.
Varand Pezeshkian

3
Hmm, adicionar. Padrão no meu caso resolve o problema. No entanto, estou realmente padrão de exportação Início estende Component nessa classe, então eu teria esperado para o trabalho sem o '.default'
Marc

3
você pode explicar o motivo como o que acontece quando adicionamos o padrão?
Subham Tripathi

1
funcionou, mas pode alguém fazer uma explicação sobre o que o .default faz.
Burak Karasoy

1
@BurakKarasoy Você precisa do padrão. Desde que a maneira padrão dos módulos de criação do Babel é transformar as export defaultinstruções em, para exports.defaultque você precise usá- .defaultlo ao importar o módulo. Uma maneira de se livrar disso é usar o babel-plugin-add-module-exportações que restaura o comportamento padrão.
Jean-Baptiste Louazel

54

Você acabou de modularizar algum dos seus componentes React? Se sim, você receberá este erro se esqueceu de especificar module.exports , por exemplo:

componente / código válido anteriormente não modularizado:

var YourReactComponent = React.createClass({
    render: function() { ...

componente / código modularizado com module.exports :

module.exports = React.createClass({
    render: function() { ...

2
Seria o mesmo para criar a classe e depois exportar? Como seu primeiro trecho e depoismodule.exports = YourReactComponent
Nick Pineda

3
Eu era capaz de simplificar isso para:export default class YourReactComponent extends React.Component {
cpres

Obtendo o mesmo erro. Eu sou capaz de renderizá-lo em um componente, mas incapaz de renderizar em outro.
31416 Mr_Perfect

Mesmo eu mencionei module.exportsainda recebendo o erro
Mr_Perfect

20

Se você receber esse erro, talvez seja porque você está importando o link usando

import { Link } from 'react-router'

em vez disso, pode ser melhor usar

importar {Link} de ' react-router-dom '
                      ^ -------------- ^

Eu acredito que este é um requisito para a versão 4 do roteador de reação


Meu amigo estava importando o Link de react, em vez de react-router-dom. Corrigido o problema. Nunca vi essa mensagem de erro antes.
O-9

18

https://github.com/rackt/react-router/blob/e7c6f3d848e55dda11595447928e843d39bed0eb/examples/query-params/app.js#L4 Router também é uma das propriedades de react-router. Portanto, mude seus módulos e exija código como este:

  var reactRouter = require('react-router')
  var Router = reactRouter.Router
  var Route = reactRouter.Route
  var Link = reactRouter.Link

Se você deseja usar a sintaxe do ES6, use o link ( import), use babel como auxiliar.

BTW, para fazer seus trabalhos de código, podemos adicionar {this.props.children}no App, como

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

  )
}

Desculpe por não testar com cuidado ontem à noite, não há problema no seu componente Casa. Você pode tentar o que acabei de editar?
David Guan

18

Não fique surpreso com a lista de respostas para uma única pergunta. Existem várias causas para esse problema;

Para o meu caso, o aviso foi

warning.js: 33 Aviso: React.createElement: type é inválido - espera-se uma sequência (para componentes internos) ou uma classe / função (para componentes compostos), mas obteve: indefinido. Você provavelmente esqueceu de exportar seu componente do arquivo em que está definido. Verifique seu código em index.js: 13.

Seguido pelo erro

invariant.js: 42 Erro não capturado: O tipo de elemento é inválido: espera-se uma sequência (para componentes internos) ou uma classe / função (para componentes compostos), mas obteve: indefinido. Você provavelmente esqueceu de exportar seu componente do arquivo em que está definido.

Não consegui entender o erro, pois ele não menciona nenhum método ou nome de arquivo. Só consegui resolver depois de olhar para este aviso, mencionado acima.

Eu tenho a seguinte linha no index.js.

<ConnectedRouter history={history}>

Quando pesquisei pelo erro acima com a palavra-chave "ConnectedRouter" , encontrei a solução em uma página do GitHub.

O erro ocorre porque, quando instalamos o react-router-reduxpacote, por padrão instalamos este. https://github.com/reactjs/react-router-redux, mas não a biblioteca real.

Para resolver esse erro, instale o pacote apropriado especificando o escopo npm com @

npm install react-router-redux@next

Você não precisa remover o pacote instalado incorretamente. Será substituído automaticamente.

Obrigado.

PS: Mesmo aviso ajuda você. Não negligencie o aviso apenas olhando o erro sozinho.


Eu gostaria de poder votar isso várias vezes.
Cizaphil

15

No meu caso, um dos módulos filhos exportados não estava retornando um componente de reação adequado.

const Component = <div> Content </div>;

ao invés de

const Component = () => <div>Content</div>;

O erro mostrado foi para o pai, portanto não foi possível descobrir.


11

No meu caso, isso foi causado por símbolos de comentários errados. Isto está errado:

<Tag>
    /*{ oldComponent }*/
    { newComponent }
</Tag>

Isto está correto:

<Tag>
    {/*{ oldComponent }*/}
    { newComponent }
</Tag>

Observe os colchetes


10

Eu tenho o mesmo erro: ERRO FIX !!!!

Eu uso 'react-router-redux' v4, mas ela é ruim. Após a npm instalar react -router-redux @ next , estou no "react-router-redux": "^ 5.0.0-alpha.9",

E É TRABALHO



8

Eu estava tendo o mesmo problema e percebi que estava fornecendo um componente React indefinido na marcação JSX. O problema é que o componente de reação a renderizar foi calculado dinamicamente e acabou sendo indefinido!

O erro declarou:

Violação invariável: o tipo de elemento é inválido: esperava uma sequência (para componentes internos) ou uma classe / função (para componentes compostos), mas obteve: indefinido. Você provavelmente esqueceu de exportar seu componente do arquivo em que está definido. Verifique o método de renderização de C.,

O exemplo que produz este erro:

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>
  }
  
  // ...
}

O problema era que um "uiType" inválido foi fornecido e, portanto, estava produzindo indefinido como resultado:

templates['InvalidString']


Eu pareço ter um erro semelhante com o react-fine-uploader, mas não consigo descobrir nada (ainda). Ele tem um componente da Galeria que estou importando e também vai para o seu método de renderização, mas nesse erro de renderização ocorre, não tenho certeza se é um problema de biblioteca ou meu problema, pois sou novo em reagir.
Zia Ul Rehman Mughal

Ocorreu um erro semelhante em que ocorreu um erro em um componente complexo. Um método simples de depuração é simplificar temporariamente o componente, por exemplo, const MyComponent = () => <div>my component</div>;apenas para ver se as importações funcionam normalmente.
metakermit

Seria útil ser capaz de detectar isso, por exemplo, com uma regra de fiapos.
Will Caim

7

Apenas como uma rápida adição a isso. Eu estava tendo o mesmo problema e enquanto o Webpack estava compilando meus testes e o aplicativo estava funcionando bem. Quando estava importando meu componente para o arquivo de teste, estava usando o caso incorreto em uma das importações e isso estava causando o mesmo erro.

import myComponent from '../../src/components/myComponent'

Deveria ter ficado

import myComponent from '../../src/components/MyComponent'

Observe que o nome da importação myComponentdepende do nome da exportação dentro do MyComponentarquivo.


7

Teve um problema semelhante com as versões mais recentes do React Native, a partir de 0,50.

Para mim, havia uma diferença entre:

import App from './app'

e

import App from './app/index.js'

(este último corrigiu o problema). Levei horas para pegar essa nuance estranha e difícil de notar :(


6

Outra solução possível, que funcionou para mim:

Atualmente, react-router-reduxestá na versão beta e npm retorna 4.x, mas não 5.x. Mas o @types/react-router-redux5.x retornado Portanto, foram utilizadas variáveis ​​indefinidas.

Forçar o NPM / Yarn a usar 5.x resolveu isso para mim.


6

Dado o seu erro de:

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

Você tem 2 opções:

  1. Seu arquivo de exportação pode ter a palavra defaultcomo Em export default class ____.... seguida, sua importação precisará evitar usá {}-lo. Como emimport ____ from ____

  2. Evite usar a palavra padrão. Em seguida, sua exportação se parece com export class ____... Então sua importação deve usar o {}. Gostarimport {____} from ____


Resposta incrível !!! +1 ... Eu ignorado totalmente o export default {component name}e esqueceu de adicioná-lo
Si8

@ Si8 Fico feliz em ajudar e obrigado por me fazer sorrir logo de manhã.
Jasonleonhard

5

No meu caso, a importação estava acontecendo implicitamente devido a uma biblioteca.

Eu consegui consertá-lo mudando

export class Foo

para

export default class Foo.


5

Eu encontrei esse erro quando tinha um arquivo .jsx e .scss no mesmo diretório com o mesmo nome raiz.

Então, por exemplo, se você tem Component.jsxe está Component.scssna mesma pasta e tenta fazer isso:

import Component from ./Component

O Webpack aparentemente fica confuso e, pelo menos no meu caso, tenta importar o arquivo scss quando eu realmente quero o arquivo .jsx.

Consegui corrigi-lo renomeando o arquivo .scss e evitando a ambiguidade. Eu também poderia ter importado explicitamente o Component.jsx


1
Você é um salva-vidas. No meu caso, era essencialmente Component.json (um arquivo de dados).
tengen 28/01

4

E no meu caso, estava faltando um ponto e vírgula na decodificação de importação em um dos meus submódulos.

Corrigido alterando isso:

import Splash from './Splash'

para isso:

import Splash from './Splash';

2
AMD. Cara, você salvou minha vida. Realmente não entendo por que o construtor não informa isso a você.
Milan Vlach

4

No meu caso, eu estava usando a exportação padrão, mas não exportando um functionou React.Component, mas apenas um JSXelemento, ou seja,

Erro:

export default (<div>Hello World!</div>)

Trabalho :

export default () => (<div>Hello World!</div>)

2

Além de import/ exportquestões mencionadas. Eu achei usando React.cloneElement()para adicionarprops a um elemento filho e, em seguida, renderizá-lo me deu o mesmo erro.

Eu tive que mudar:

render() {
  const ChildWithProps = React.cloneElement(
    this.props.children,
    { className: `${PREFIX}-anchor` }
  );

  return (
    <div>
      <ChildWithProps />
      ...
    </div>
  );
}

para:

render() {
  ...
  return (
    <div>
      <ChildWithProps.type {...ChildWithProps.props} />
    </div>
  );
}

Veja os React.cloneElement() documentos para mais informações.


2

Eu recebi esse erro no roteamento de reação, o problema era que eu estava usando

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

mas foi rota errada requer componente como uma classe / função, então eu mudei para

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

e funcionou. (Evite as chaves ao redor do componente)


De alguma maneira diferente, minha solução foi o inverso de vocês :), mas agradeço que abram meus olhos.
Yulio Aleman Jimenez

1

Para mim, meus componentes estilizados foram definidos após minha definição de componente funcional. Isso só acontecia na encenação e não localmente para mim. Depois que mudei meus componentes estilizados para cima da minha definição de componente, o erro desapareceu.


1

Isso significa que alguns dos seus componentes importados foram declarados incorretamente ou inexistentes

Eu tive um problema semelhante, eu fiz

import { Image } from './Shared'

mas quando examinei o arquivo compartilhado, não tinha um componente 'Image', e sim um componente 'ItemImage'

import { ItemImage } from './Shared';

Isso acontece quando você copia o código de outros projetos;)


1

Eu tive um problema com React.Fragment, porque a versão do meu reagir era < 16.2, então me livrei dele.


0

@Balasubramani M me salvou aqui. Queria adicionar mais um para ajudar as pessoas. Esse é o problema quando você cola muitas coisas e fica despreocupado com as versões. Atualizei uma versão do material-ui e preciso mudar

import Card, {CardContent, CardMedia, CardActions } from "@material-ui/core/Card"; 

para isso:

import Card from '@material-ui/core/Card';
import CardActions from '@material-ui/core/CardActions';
import CardContent from '@material-ui/core/CardContent';
import CardMedia from '@material-ui/core/CardMedia';

0

Eu tive o mesmo problema e o problema era que alguns arquivos js não foram incluídos no pacote dessa página específica. Tente incluir esses arquivos e o problema pode ser corrigido. Eu fiz isso:

.Include("~/js/" + jsFolder + "/yourjsfile")

e resolveu o problema para mim.

Isso foi enquanto eu estava usando o React no Dot NEt MVC


0

Eu descobri outro motivo para esse erro. Tem a ver com o CSS-in-JS retornando um valor nulo para o JSX de nível superior da função de retorno em um componente React.

Por exemplo:

const Css = styled.div`
<whatever css>
`;
export function exampleFunction(args1) {
  ...
  return null;
}

export default class ExampleComponent extends Component {
...
render() {
const CssInJs = exampleFunction(args1);
  ...
  return (
    <CssInJs>
      <OtherCssInJs />
      ...
    </CssInJs>
  );
}

Eu receberia este aviso:

Aviso: React.createElement: type é inválido - espera-se uma sequência (para componentes internos) ou uma classe / função (para componentes compostos), mas obteve: null.

Seguido por este erro:

Erro não capturado: o tipo de elemento é inválido: esperava uma sequência (para componentes internos) ou uma classe / função (para componentes compostos), mas obteve: null.

Eu descobri que era porque não havia CSS com o componente CSS-in-JS que eu estava tentando processar. Corrigi-o certificando-se de que havia CSS sendo retornado e não um valor nulo.

Por exemplo:

const Css = styled.div`
<whatever css>
`;
export function exampleFunction(args1) {
  ...
  return Css;
}

export default class ExampleComponent extends Component {
...
render() {
const CssInJs = exampleFunction(args1);
  ...
  return (
    <CssInJs>
      <OtherCssInJs />
      ...
    </CssInJs>
  );
}

0

Estou recebendo quase o mesmo erro:

Erro não capturado (prometido): o tipo de elemento é inválido: espera-se uma sequência (para componentes internos) ou uma classe / função (para componentes compostos), mas obtém: object.

Eu estava tentando importar um componente funcional puro de outra biblioteca de nós que minha equipe desenvolveu. Para corrigi-lo, tive que mudar para uma importação absoluta (referenciando o caminho para o componente interno node_modules) de

importar FooBarList de 'team-ui';

para

importar FooBarList de 'team-ui / lib / components / foo-bar-list / FooBarList';


0

No meu caso, acabou sendo o componente externo importado assim:

import React, { Component } from 'react';

e então declarou como:

export default class MyOuterComponent extends Component {

onde um componente interno importou o React:

import React from 'react';

e pontilhada para declaração:

export default class MyInnerComponent extends ReactComponent {


0

No meu caso, demorei muito tempo para procurar e verificar várias maneiras, mas apenas corrigi-lo dessa maneira: remova "{", "}" ao importar um componente personalizado:

import OrderDetail from './orderDetail';

Meu caminho errado foi:

import { OrderDetail } from './orderDetail';

Como no arquivo orderDetail.js, eu exportei OrderDetail como a classe padrão:

class OrderDetail extends Component {
  render() {
    return (
      <View>
        <Text>Here is an sample of Order Detail view</Text>
      </View>
    );
  }
}

export default OrderDetail;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.