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;
Pankaj Thakur
fonte
7
Por favor, dê uma olhada no stackoverflow.com/questions/36795819/…
Marcelo Salazar
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.

JohnL
fonte
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
jackypan1989
fonte
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() { ...
charlez
fonte
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

NSCoder
fonte
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>

  )
}
David Guan
fonte
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.

Balasubramani M
fonte
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.

Katti
fonte
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

tuanh118
fonte
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

Thibault Jp
fonte
8

Entendi isso import App from './app/';esperando que ele importasse ./app/index.js, mas importou ./app.json.

tybro0103
fonte
2
E esta é a explicação: github.com/facebook/react-native/issues/12539
sfratini
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']

cSn
fonte
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.

Blackout1985
fonte
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 :(

Oleg Dater
fonte
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.

Florian Richter
fonte
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 ____

jasonleonhard
fonte
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.

thedayturns
fonte
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

bergie3000
fonte
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';
Rikard Askelöf
fonte
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>)
Andru
fonte
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.

Greg K
fonte
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)

Naxxa Consulting
fonte
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.

Jadam
fonte
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;)

webmaster
fonte
1

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

Eugene Ihnatsyeu
fonte
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';
Kyle Pennell
fonte
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

Jason
fonte
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>
  );
}
codeinaire
fonte
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';

Patrick
fonte
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 {

krayzk
fonte
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;
tiennsloit
fonte