Je reçois cette erreur après une page d'exemple React triviale:
Erreur non interceptée: violation invariante: _registerComponent (...): le conteneur cible n'est pas un élément DOM.
Voici mon code:
/** @jsx React.DOM */
'use strict';
var React = require('react');
var App = React.createClass({
render() {
return <h1>Yo</h1>;
}
});
React.renderComponent(<App />, document.body);
HTML:
<html>
<head>
<script src="/bundle.js"></script>
</head>
<body>
</body>
</html>
Qu'est-ce que ça veut dire?
javascript
dom
reactjs
Dan Abramov
la source
la source
Réponses:
Au moment où le script est exécuté, l'
document
élément n'est pas encore disponible, carscript
lui-même est dans lehead
. Bien qu'il soit une solution valable pour maintenirscript
enhead
et rendre leDOMContentLoaded
cas , il est encore mieux de mettre votrescript
au fond même dubody
et rendre composant racine à undiv
avant comme ceci:et dans le
bundle.js
, appelez:Vous devez toujours effectuer un rendu sur un imbriqué
div
au lieu debody
. Sinon, toutes sortes de codes tiers (Google Font Loader, plugins de navigateur, peu importe) peuvent modifier lebody
nœud DOM lorsque React ne s'y attend pas et provoquer des erreurs étranges très difficiles à tracer et à déboguer. En savoir plus sur ce problème.La bonne chose à mettre
script
en bas est qu'il ne bloquera pas le rendu jusqu'à ce que le script se charge au cas où vous ajouteriez le rendu du serveur React à votre projet.Mise à jour: (07 octobre 2015 | v0.14 )
Exemple:
la source
/index.html
/app.js
(IE9 +)
Remarque : Le fait d'avoir
<script async src="..."></script>
dans l'en-tête garantit que le navigateur commencera à télécharger le bundle JavaScript avant chargement du contenu HTML.Source: React Starter Kit , chargeur de style isomorphe
la source
ReactDOM.render
au lieu deReact.render
.defer
peut être une meilleure optionla fonction prête peut être utilisée comme ceci:
Si vous ne souhaitez pas utiliser jQuery, vous pouvez utiliser la
onload
fonction:la source
DOMContentLoaded
serait même plus approprié de gérer queload
(c'est ce que jQuery utilise ). Vous pouvez également le faire dans JS avecwindow.addEventListener
, pas besoin de gestionnaires en ligne et de fonctions globales.$(document).ready
résolu le problème. Oh et oui, utilisezrender
au lieu derenderComponent
.juste une supposition sauvage, que diriez-vous d'ajouter à index.html ce qui suit:
comme ça:
Pour moi, ça a marché! :-)
la source
type="text/javascript"
fonctionnait correctement.J'ai rencontré la même erreur. Il s'est avéré être causé par une simple faute de frappe après avoir changé mon code de:
à
Remarquez le «#» manquant. Il aurait dû être
Il suffit de poster au cas où cela aiderait quelqu'un d'autre à résoudre cette erreur.
la source
Oui, ce que vous avez fait est juste, sauf que vous oubliez que JavaScript est synchronisé dans de nombreux cas, donc vous exécutez le code avant votre DOM soit chargé, il y a quelques façons de résoudre ce problème:
1) Vérifiez si DOM est complètement chargé, puis faites ce que vous voulez, vous pouvez écouter DOMContentLoaded par exemple:
2) La manière la plus courante consiste à ajouter la balise de script au bas de votre
document
(après la balise body):3) Utilisation de
window.onload
, qui se déclenche lorsque la page entière est chargée (img, etc.)4) Utilisation de
document.onload
, qui se déclenche lorsque le DOM est prêt:Il y a encore plus d'options pour vérifier si DOM est prêt, mais la réponse courte est de NE PAS exécuter de script avant de vous assurer que votre DOM est prêt dans tous les cas ...
JavaScript fonctionne avec les éléments DOM et s'ils ne sont pas disponibles, retournera null , pourrait casser toute l'application ... alors assurez-vous toujours que vous êtes entièrement prêt à exécuter votre JavaScript avant de le faire ...
la source
Si vous utilisez webpack pour rendre votre réaction et utilisez HtmlWebpackPlugin dans votre react, ce plugin construit son index.html vierge par lui-même et y injecte le fichier js, donc il ne contient pas d'élément div, comme les documents HtmlWebpackPlugin vous pouvez construire votre propre index. html et donnez son adresse à ce plugin, dans mon webpack.config.js
et voici mon fichier index.html
la source
HtmlWebpackPlugin
plugin ici s'il est utilisé pour référencer un fichier HTML statique?Dans mon cas, cette erreur a été causée par un rechargement à chaud, lors de l'introduction de nouvelles classes. À cette étape du projet, utilisez des observateurs normaux pour compiler votre code.
la source
Pour ceux qui utilisent ReactJS.Net et obtiennent cette erreur après une publication:
Vérifiez les propriétés de vos fichiers .jsx et assurez-vous qu'il
Build Action
est défini surContent
. Ceux définis pourNone
ne seront pas publiés. Je suis tombé sur cette solution de cette réponse SO .la source
J'ai rencontré un message d'erreur similaire / même. Dans mon cas, je n'avais pas le noeud DOM cible qui doit rendre le composant ReactJS défini. Assurez-vous que le nœud cible HTML est bien défini avec "id" ou "nom" approprié, ainsi que d'autres attributs HTML (adaptés à vos besoins de conception)
la source
il est facile de créer des js HTML CSS de base et de rendre le script à partir de js
la source
Quand tu as:
Erreur: erreur non interceptée: le conteneur cible n'est pas un élément DOM.
Vous pouvez utiliser l' événement DOMContentLoaded ou déplacer votre
<script ...></script>
balise au bas de votre corps.la source