些細なReactの例のページを作成した後、このエラーが発生します。
捕捉されないエラー:不変の違反:_registerComponent(...):ターゲットコンテナはDOM要素ではありません。
これが私のコードです:
/** @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>
これは何を意味するのでしょうか?
document
自体はscript
内にあるため、スクリプトが実行される時点では、head
要素はまだ使用できません。 script
と_ head
event でレンダリングする)にDOMContentLoaded
を保持することは有効な解決策ですが、script
をbody
の一番下に配置し、をルートコンポーネントの前にdiv
とするこのように:
<html>
<head>
</head>
<body>
<div id="root"></div>
<script src="/bundle.js"></script>
</body>
</html>
そしてbundle.js
では、以下を呼び出します。
React.render(<App />, document.getElementById('root'));
div
ではなく、常にネストされたbody
にレンダリングする必要があります。 そうでないと、Reactが予期しないときにあらゆる種類のサードパーティコード(Google Font Loader、ブラウザプラグインなど)がbody
DOMノードを変更し、トレースやデバッグが非常に難しい奇妙なエラーを引き起こす可能性があります。 この問題についてもっと読む。
script
を一番下に置くことのいいところは、Reactサーバーレンダリングをプロジェクトに追加した場合にスクリプトがロードされるまでレンダリングをブロックしないことです。
React.render
は非推奨です。代わりにReactDOM.render
を使用してください。
例:
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以降)
注 :ヘッダーに<script async src="..."></script>
を含めると、ブラウザは確実にJavaScriptバンドルのダウンロードを開始します 以前 HTMLコンテンツが読み込まれます。
ready関数 は次のように使うことができます。
$(document).ready(function () {
React.render(<App />, document.body);
});
JQueryを使いたくない場合は、onload
関数を使用できます。
<body onload="initReact()">...</body>
単なる憶測ですが、index.htmlに以下を追加するのはどうでしょうか。
type="javascript"
このような:
<script type="javascript" src="public/bundle.js"> </script>
私にとってはうまくいった! :-)
私は同じエラーに遭遇しました。コードを以下から変更した後の単純なタイプミスが原因であることが判明しました。
document.getElementById('root')
に
document.querySelector('root')
欠けている '#'に注目してください。
document.querySelector('#root')
万が一それが他の誰かがこのエラーを解決するのを助けるのを念頭に置いて投稿する。
はい基本的にあなたがしたことは正しいですが、多くの場合JavaScriptが同期していることを忘れているので、DOMがロードされる前にコードを実行します。これを解決する方法:
1)DOMが完全にロードされているかどうかを確認し、必要な処理を行います。たとえば、DOMContentLoadedを聞くことができます。
<script>
document.addEventListener("DOMContentLoaded", function(event) {
console.log("DOM fully loaded and parsed");
});
</script>
2)非常に一般的な方法は、document
(bodyタグの後)の下部にscriptタグを追加することです。
<html>
<head>
</head>
<body>
</body>
<script src="/bundle.js"></script>
</html>
3)window.onload
を使用します。これは、ページ全体が読み込まれたときに起動されます(imgなど)
window.addEventListener("load", function() {
console.log("Everything is loaded");
});
4)document.onload
を使用します。これはDOMの準備ができたときに起動されます:
document.addEventListener("load", function() {
console.log("DOM is ready");
});
DOMの準備ができているかどうかを確認するオプションはさらにありますが、短い答えはDO NOTDOMの準備ができていることを確認する前にスクリプトを実行することですすべての場合...
JavaScriptはDOM要素と連携して動作し、利用できない場合はnullを返し、アプリケーション全体を破壊する可能性があります...実行する前にJavaScriptを実行するには...
私の場合、このエラーは新しいクラスの導入中にホットリロードが原因で発生しました。プロジェクトのその段階では、通常のウォッチャーを使用してコードをコンパイルしてください。
私は似たような/同じエラーメッセージに出くわしました。私の場合は、ReactJSコンポーネントを定義するためのターゲットDOMノードがありませんでした。 HTMLターゲットノードが他のHTML属性と共に適切な "id"または "name"で正しく定義されていることを確認します(あなたの設計ニーズに適しています)
反応のレンダリングにwebpackを使用し、反応にHtmlWebpackPluginを使用する場合、このプラグインは空白のindex.htmlを単独で構築し、その中にjsファイルをインジェクトします。そして私のwebpack.config.jsで、このプラグインにそのアドレスを与えてください。
plugins: [
new HtmlWebpackPlugin({
title: 'dev',
template: 'dist/index.html'
})
],
これが私のindex.htmlファイルです
<!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>
基本的なHTML CSS jsを作成するだけで簡単ですjsからスクリプトをレンダリング
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>
index.htmlファイルでこれらのsrc domを使用し、jsファイルとリンクします。
ReactJS.Netを使用していて、公開後にこのエラーが発生する方へ:
.jsxファイルのプロパティを確認し、Build Action
がContent
に設定されていることを確認してください。 None
に設定されたものは公開されません。私は this SO answer からこの解決策を見つけました。