Ich erhalte diese Fehlermeldung nach einer trivialen React-Beispielseite:
Nicht gefundener Fehler: Invariante Verletzung: _registerComponent (...): Zielcontainer ist kein DOM-Element.
Hier ist mein 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>
Was bedeutet das?
Zum Zeitpunkt der Ausführung des Skripts ist das Element document
noch nicht verfügbar, da sich script
selbst in head
befindet. Während es eine gültige Lösung ist, script
in head
und Rendern bei DOMContentLoaded
-Ereignis zu belassen, ist es noch besser, Setzen Sie Ihr script
ganz unten in die body
und Render-Root-Komponente in ein div
, bevor es so aussieht:
<html>
<head>
</head>
<body>
<div id="root"></div>
<script src="/bundle.js"></script>
</body>
</html>
und in der bundle.js
, Anruf:
React.render(<App />, document.getElementById('root'));
Sie sollten immer einen verschachtelten div
anstelle von body
rendern. Andernfalls werden alle Arten von Code von Drittanbietern ( Google Font Loader, Browser-Plugins usw. können den DOM-Knoten body
ändern, wenn React) dies nicht erwartet und seltsame Fehler verursacht, die nur schwer zu verfolgen und zu debuggen sind. Lesen Sie mehr zu diesem Thema.
Das Schöne am Setzen von script
am Ende ist, dass das Rendern erst dann blockiert wird, wenn das Skript geladen wird, wenn Sie dem Projekt React server rendering) hinzufügen.
React.render
ist veraltet, benutzeReactDOM.render
stattdessen.
Beispiel:
import ReactDOM from 'react-dom';
ReactDOM.render(<App />, document.getElementById('root'));
/index.html
<!doctype html>
<html>
<head>
<title>My Application</title>
<!-- load application bundle asynchronously -->
<script async src="/app.js"></script>
<style type="text/css">
/* pre-rendered critical path CSS (see isomorphic-style-loader) */
</style>
</head>
<body>
<div id="app">
<!-- pre-rendered markup of your JavaScript app (see isomorphic apps) -->
</div>
</body>
</html>
/app.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './components/App';
function run() {
ReactDOM.render(<App />, document.getElementById('app'));
}
const loadedStates = ['complete', 'loaded', 'interactive'];
if (loadedStates.includes(document.readyState) && document.body) {
run();
} else {
window.addEventListener('DOMContentLoaded', run, false);
}
(IE9 +)
Note: Durch die Verwendung von <script async src="..."></script>
im Header wird sichergestellt, dass der Browser das JavaScript-Paket vorher HTML-Inhalt lädt.
die ready-Funktion kann folgendermaßen verwendet werden:
$(document).ready(function () {
React.render(<App />, document.body);
});
Wenn Sie jQuery nicht verwenden möchten, können Sie die Funktion onload
verwenden:
<body onload="initReact()">...</body>
nur eine wilde Vermutung, wie fügen Sie Folgendes zu index.html hinzu:
type="javascript"
so was:
<script type="javascript" src="public/bundle.js"> </script>
Bei mir hat es funktioniert! :-)
Ich bin auf den gleichen Fehler gestoßen. Es stellte sich heraus, dass dies durch einen einfachen Tippfehler verursacht wurde, nachdem mein Code geändert wurde:
document.getElementById('root')
zu
document.querySelector('root')
Beachten Sie das fehlende '#' Es hätte sein sollen
document.querySelector('#root')
Nur für den Fall, dass es anderen hilft, diesen Fehler zu lösen.
Ja, Grundsätzlich ist das, was Sie getan haben, richtig, mit der Ausnahme, dass Sie vergessen, dass JavaScript in vielen Fällen synchronisiert wird. Sie müssen also den Code ausführen, bevor IhrDOMgeladen wird.
1) Prüfen Sie, obDOMvollständig geladen ist, und machen Sie dann, was Sie möchten. Sie können beispielsweise DOMContentLoaded anhören:
<script>
document.addEventListener("DOMContentLoaded", function(event) {
console.log("DOM fully loaded and parsed");
});
</script>
2) Eine sehr häufige Methode ist das Hinzufügen des Skript-Tags am Ende Ihrer document
(nach dem body-Tag):
<html>
<head>
</head>
<body>
</body>
<script src="/bundle.js"></script>
</html>
3) Verwenden von window.onload
, der ausgelöst wird, wenn die gesamte Seite geladen wird (img usw.)
window.addEventListener("load", function() {
console.log("Everything is loaded");
});
4) Verwenden von document.onload
, der ausgelöst wird, wennDOMbereit ist:
document.addEventListener("load", function() {
console.log("DOM is ready");
});
Es gibt noch mehr Optionen, um zu prüfen, obDOMbereit ist, aber die kurze Antwort lautet DO NOT Führen Sie ein Skript aus, bevor Sie sicherstellen, dass Ihr DOM bereit ist in allen Fällen ...
JavaScript arbeitet mitDOMelements zusammen und wenn sie nicht verfügbar sind, wird null zurückgegeben, die gesamte Anwendung kann beschädigt werden. Stellen Sie daher immer sicher, dass Sie vollständig JavaScript ausführen können tun...
In meinem Fall wurde dieser Fehler durch Hot-Reloading verursacht, während neue Klassen eingeführt wurden. Verwenden Sie in dieser Phase des Projekts normale Beobachter, um Ihren Code zu kompilieren.
Ich bin auf eine ähnliche/gleiche Fehlermeldung gestoßen. In meinem Fall hatte ich nicht den Ziel-DOM-Knoten, der die definierte ReactJS-Komponente darstellen soll. Stellen Sie sicher, dass der HTML-Zielknoten mit den entsprechenden "id" oder "name" zusammen mit anderen HTML-Attributen (für Ihre Designanforderungen geeignet) definiert ist
wenn Sie das Webpack zum Rendern Ihrer Reaktion verwenden und das HtmlWebpackPlugin in Ihrer Reaktion verwenden, erstellt dieses Plugin die leere index.html von selbst und fügt die js-Datei darin ein, sodass sie kein div-Element enthält, da Sie mit HtmlWebpackPlugin-Dokumenten Ihre eigene index.html erstellen können und gib die Adresse für dieses Plugin in meiner webpack.config.js an
plugins: [
new HtmlWebpackPlugin({
title: 'dev',
template: 'dist/index.html'
})
],
und das ist meine index.html datei
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="shortcut icon" href="">
<meta name="viewport" content="width=device-width">
<title>Epos report</title>
</head>
<body>
<div id="app"></div>
<script src="./bundle.js"></script>
</body>
</html>
es ist einfach, einfache HTML-CSS-Js zu erstellen und das Skript aus Js zu rendern
mport React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
var destination = document.querySelector('#container');
ReactDOM.render(
<div>
<p> hello world</p>
</div>, destination
);
body{
text-align: center;
background-color: aqua;
padding: 50px;
border-color: aqua;
font-family: sans-serif;
}
#container{
display: flex;
justify-content: flex;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Web site created using create-react-app"
/>
<title> app </title>
</head>
<body>
<div id="container">
</div>
</body>
</html>
verwenden Sie diese src dom in der Datei index.html und verknüpfen Sie sie anschließend mit der Datei js
Für diejenigen, die ReactJS.Net verwenden und diesen Fehler nach einer Veröffentlichung erhalten:
Überprüfen Sie die Eigenschaften Ihrer .jsx-Dateien und stellen Sie sicher, dass Build Action
auf Content
gesetzt ist. Diejenigen, die auf None
gesetzt sind, werden nicht veröffentlicht. Ich bin auf diese Lösung von this SO answer gestoßen.