Essayer d'obtenir react-router (v4.0.0) et react-hot-loader (3.0.0-beta.6) pour jouer correctement, mais obtenir l'erreur suivante dans la console du navigateur:
Avertissement: React.createElement: type n'est pas valide - attend une chaîne (pour les composants intégrés) ou une classe / fonction (pour les composants composites) mais a: undefined. Vous avez probablement oublié d'exporter votre composant à partir du fichier dans lequel il est défini.
index.js:
import React from 'react';
import ReactDom from 'react-dom';
import routes from './routes.js';
require('jquery');
import 'bootstrap/dist/css/bootstrap.min.css';
import 'bootstrap/dist/js/bootstrap.min.js';
import './css/main.css';
const renderApp = (appRoutes) => {
ReactDom.render(appRoutes, document.getElementById('root'));
};
renderApp( routes() );
routes.js:
import React from 'react';
import { AppContainer } from 'react-hot-loader';
import { Router, Route, browserHistory, IndexRoute } from 'react-router';
import store from './store/store.js';
import { Provider } from 'react-redux';
import App from './containers/App.jsx';
import Products from './containers/shop/Products.jsx';
import Basket from './containers/shop/Basket.jsx';
const routes = () => (
<AppContainer>
<Provider store={store}>
<Router history={browserHistory}>
<Route path="/" component={App}>
<IndexRoute component={Products} />
<Route path="/basket" component={Basket} />
</Route>
</Router>
</Provider>
</AppContainer>
);
export default routes;
reactjs
react-router
react-hot-loader
JoeTidee
la source
la source
component
propriété à la place derender
, car le package ne prend pas en charge la version ultérieure. En savoir plus sur GitHub .Réponses:
La plupart du temps, cela est dû à une exportation / importation incorrecte.
Erreur courante:
Option possible:
Il y a plusieurs façons dont cela pourrait être erroné, mais cette erreur est due à une incompatibilité d'importation / exportation 60% du temps, à chaque fois.
Éditer
Typiquement vous devriez obtenir un stacktrace qui indique un emplacement approximatif de l'endroit où l'échec se produit. Cela suit généralement juste après le message que vous avez dans votre question initiale.
S'il ne s'affiche pas, il peut être utile de rechercher pourquoi (il peut s'agir d'un paramètre de construction qui vous manque). Quoi qu'il en soit, si cela n'apparaît pas, le seul plan d'action est de réduire où l'exportation / importation échoue.
Malheureusement, la seule façon de le faire, sans trace de pile, est de supprimer manuellement chaque module / sous-module jusqu'à ce que vous n'obteniez plus l'erreur, puis remontez la pile.
Modifier 2
Via les commentaires, c'était en effet un problème d'importation, en particulier l'importation d'un module qui n'existait pas
la source
<IndexRoute component={Products} />
J'avais aussi cette erreur.
J'utilisais:
import BrowserRouter from 'react-router-dom';
Fix faisait cela, à la place:
import { BrowserRouter } from 'react-router-dom';
la source
Essaye ça
dans votre App.js
la source
Vous devez être conscient de
named export
etdefault export
. Voir Quand dois-je utiliser des accolades pour l'importation ES6?Dans mon cas, je l'ai corrigé en passant de
à
la source
J'ai eu ce problème lorsque j'ai ajouté un fichier css dans le même dossier que le fichier du composant.
Ma déclaration d'importation était:
ce qui était bien quand il n'y avait qu'un seul fichier, MyComponent.jsx. (J'ai vu ce format dans un exemple et l'ai essayé, puis j'ai oublié que je l'avais fait)
Lorsque j'ai ajouté MyComponent.scss dans le même dossier, l'importation a échoué. Peut-être que JavaScript a chargé le fichier .scss à la place et qu'il n'y a donc pas eu d'erreur.
Ma conclusion: spécifiez toujours l'extension du fichier même s'il n'y a qu'un seul fichier, au cas où vous en ajouteriez un autre plus tard.
la source
Pour les futurs googleurs:
Ma solution à ce problème était de mettre à niveau
react
etreact-dom
vers leurs dernières versions sur NPM. Apparemment, j'importais un composant qui utilisait la nouvelle syntaxe de fragment et il était cassé dans mon ancienne version de React.la source
Ce problème m'est apparu lorsque j'avais une mauvaise référence dans mon instruction de rendu / retour. (pointez sur une classe non existante). Vérifiez également votre code de déclaration de retour pour les mauvaises références.
la source
La plupart du temps, cela indique une erreur d'import / export. Mais faites attention non seulement à vous assurer que le fichier référencé dans la trace de pile est bien exporté lui-même, mais également à ce que ce fichier importe correctement les autres composants . Dans mon cas, l'erreur était comme ceci:
la source
Je pense que la chose la plus importante à réaliser lors du dépannage de ce bogue est qu'il se manifeste lorsque vous essayez d'instancier un composant qui n'existe pas. Ce composant n'a pas besoin d'être importé. Dans mon cas, je passais des composants en tant que propriétés. J'ai oublié de mettre à jour l'un des appels pour passer correctement le composant après une refactorisation. Malheureusement, comme JS n'est pas typé statiquement, mon bogue n'a pas été détecté et il a fallu du temps pour comprendre ce qui se passait.
Pour résoudre ce bogue, inspectez le composant avant de le rendre, pour vous assurer qu'il s'agit du type de composant que vous attendez.
la source
render={props => <Component {...props} />}
encomponent={Component}
.Il me manquait un fragment de réaction :
Le code ci-dessus renvoie l'erreur ci-dessus. Mais cela corrige le problème:
la source
yarn add react-collapsing-table
). J'ai réussi à alterner entre cet avertissement (qui a entraîné une erreur d'hydratation) et une `` fenêtre n'est pas définie '' qui a été détectée à l'intérieur du module compilé react-collapsing-table ... Même enrouler avec<div>...</div>
n'aide plusimport module from 'module-name'
require(module-name).default
Tableau de composants
Un moyen courant d'obtenir cette erreur consiste à utiliser un tableau de composants , avec un index de position utilisé pour sélectionner le composant à restituer à partir du tableau. J'ai vu un code comme celui-ci plusieurs fois:
Ce n'est pas un mauvais code nécessaire, mais si vous l'appelez avec un mauvais index (par exemple
-1
, ou3
dans ce cas), leToRender
composant lanceraundefined
l'React.createElement: type is invalid...
erreur:Une solution rationnelle
Vous devez vous protéger et protéger vos collègues de ce code difficile à déboguer en utilisant une approche plus explicite, en évitant les nombres magiques et en utilisant les PropTypes:
Et votre code ressemblera à ceci:
Avantages de cette approche
1
est pour l'adresse, 2 est pour ...)la source
Ce qui me manquait, c'était que j'utilisais
à la place ou la bonne réponse devrait être:
Bien sûr, vous devez ajouter le package npm react -router-dom :
la source
Dans mon cas, j'ai oublié d'importer et d'exporter mes (nouveaux) éléments appelés par le rendu dans le fichier index.js.
la source
Dans mon cas, l'ordre dans lequel vous créez le composant et le rendu importait. J'étais en train de rendre le composant avant de le créer. Le meilleur moyen est de créer le composant enfant, puis les composants parents, puis de rendre le composant parent. La modification de la commande a résolu le problème pour moi.
la source
Dans mon cas, je devais juste passer de
react-router-redux
àreact-router-redux@next
. Je suppose que cela a dû être une sorte de problème de compatibilité.la source
En termes simples, en quelque sorte, ce qui suit se produit:
Cela peut ne pas nécessairement être lié à une importation ou une exportation incorrecte:
la source
Si vous rencontrez cette erreur lors du test d'un composant, assurez-vous que chaque composant enfant est correctement rendu lorsqu'il est exécuté seul, si l'un de vos composants enfant dépend de ressources externes pour le rendu, essayez de le simuler avec jest ou toute autre bibliothèque moqueuse:
Exemple:
la source
Dans mon cas, l'erreur s'est produite lors de la tentative d'utilisation de ContextApi. J'ai utilisé par erreur:
Mais cela aurait dû être défini comme:
Je le publie ici afin que les futurs visiteurs qui se retrouvent coincés sur une erreur aussi stupide puissent éviter des heures de maux de tête, car cela n'est pas causé par une importation / exportation incorrecte.
la source
La dépendance circulaire en est également une des raisons. [en général]
la source
C'est une erreur qui a dû être déboguée. Comme cela a été dit à plusieurs reprises, une importation / exportation incorrecte peut provoquer cette erreur, mais étonnamment, j'ai eu cette erreur à cause d'un petit bogue dans mon
react-router-dom authentication setup
ci-dessous, c'est mon cas:MAUVAISE CONFIGURATION:
CONFIGURATION CORRECT:
La seule différence était que je déconstruisais le
token
dans lePrivateRoute component
. Au fait, le jeton est obtenu delocalstorage
cetteconst token = localStorage.getItem("authUser");
manière, donc s'il n'est pas là, je sais que l'utilisateur n'est pas authentifié. Cela peut également provoquer cette erreur.la source
C'est assez simple, vraiment. J'ai eu ce problème lorsque j'ai commencé à coder React, et le problème est presque toujours dû au fait que l'importation:
Vous pouvez utiliser la déstructuration car react lib a une propriété comme mémo, mais vous ne pouvez pas déstructurer quelque chose comme ça
car ce n'est pas un objet.
J'espère que ça aide!
la source
a corrigé le problème pour moi
Code d'erreur:
Réparer
la source
Ce n'est pas nécessairement un problème direct lié à l'importation / exportation. Dans mon cas, je rendais un élément enfant à l'intérieur d'un élément parent et l'élément enfant a un élément / tag jsx qui est utilisé mais pas importé. Je l'ai importé et je l'ai utilisé, puis il a résolu le problème. Donc, le problème était dans les éléments jsx qui sont à l'intérieur de l'élément enfant PAS l'exportation de l'élément enfant lui-même.
la source
Je viens de passer 30 minutes à essayer de résoudre ce problème de base BASIC.
Mon problème était que j'importais des éléments natifs de réaction
par exemple
import React, { Text, Image, Component } from 'react';
Et essayer de les utiliser, ce qui m'a fait recevoir cette erreur.
Une fois que je passe de
<Text>
la<p>
et<Image>
à<img>
tout ce qui a fonctionné comme prévu.la source
J'obtenais cette erreur et aucune des réponses n'était mon cas, cela pourrait aider quelqu'un à rechercher sur Google:
Je définissais mal un Proptype:
Ça devrait être:
VSCode et l'erreur de compilation ne m'ont pas donné un indice correct.
la source
ÉDITER
Vous complexifiez le processus. Faites juste ceci:
index.js:
routes.js:
la source