当 React 尝试注册在 window.onload 或 window.addEventListener 中运行的组件时, DOM 尚未加载
DOM isn't loaded yet when React tries to registers Component which runs in window.onload or window.addEventListener with load
我在头 html 标签中有一个脚本标签。当 index.html 文件的其余部分已加载时,脚本应添加一个事件侦听器。因此,在此之前什么都不应该运行。除了浏览器读取 javascript 并导致一点渲染阻塞外,它几乎与在正文末尾添加脚本标签相同。
index.html
<html>
<head>
//meta stuff
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script src="https://unpkg.com/react@15/dist/react.js"></script>
<script src="https://unpkg.com/react-dom@15/dist/react-dom.js"></script>
<script type="text/javascript" src="./code/webapp.js"></script>
</head>
<body>
<noscript>Javascript is not enabled!</noscript>
<div id="root"></div>
</body>
</html>
这是我从 React 获得的控制台错误消息:
Uncaught Error: _registerComponent(...): Target container is not a DOM element.
at invariant (react-dom.js:18118)
at Object._renderNewRootComponent (react-dom.js:9978)
at Object._renderSubtreeIntoContainer (react-dom.js:10069)
at Object.render (react-dom.js:10090)
at App (webapp.js:formatted:28)
奇怪的是函数 App() 在 window.onload 或 window.addEventListener('load') 期间被触发。我以前在我的个人网站上使用过它,但我在脚本标签上有延迟和异步,所以也许这就是它总是正确触发的原因。
webapp.js
...
function App() {
console.log('App loading...');
const reactroot = document.getElementById('root');
var app = React.createElement(WebApp, null);
ReactDOM.render( app, reactroot);
}
window.onload = App;
如果有人建议使用 document.ready(),我尽量不依赖 jQuery。我还想将其用于生产网站,而不仅仅是我的个人作品集。所以我不能依赖于添加 defer/async 到脚本标签。
相关主题:
您应该使用 DomContentLoaded 事件而不是 onload
回调
document.addEventListener("DOMContentLoaded", function(event) {
console.log("DOM fully loaded and parsed");
});
查看 this question 了解有关 onload
与 DomContentLoaded
事件的更多信息
我在头 html 标签中有一个脚本标签。当 index.html 文件的其余部分已加载时,脚本应添加一个事件侦听器。因此,在此之前什么都不应该运行。除了浏览器读取 javascript 并导致一点渲染阻塞外,它几乎与在正文末尾添加脚本标签相同。
index.html
<html>
<head>
//meta stuff
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script src="https://unpkg.com/react@15/dist/react.js"></script>
<script src="https://unpkg.com/react-dom@15/dist/react-dom.js"></script>
<script type="text/javascript" src="./code/webapp.js"></script>
</head>
<body>
<noscript>Javascript is not enabled!</noscript>
<div id="root"></div>
</body>
</html>
这是我从 React 获得的控制台错误消息:
Uncaught Error: _registerComponent(...): Target container is not a DOM element.
at invariant (react-dom.js:18118)
at Object._renderNewRootComponent (react-dom.js:9978)
at Object._renderSubtreeIntoContainer (react-dom.js:10069)
at Object.render (react-dom.js:10090)
at App (webapp.js:formatted:28)
奇怪的是函数 App() 在 window.onload 或 window.addEventListener('load') 期间被触发。我以前在我的个人网站上使用过它,但我在脚本标签上有延迟和异步,所以也许这就是它总是正确触发的原因。
webapp.js
...
function App() {
console.log('App loading...');
const reactroot = document.getElementById('root');
var app = React.createElement(WebApp, null);
ReactDOM.render( app, reactroot);
}
window.onload = App;
如果有人建议使用 document.ready(),我尽量不依赖 jQuery。我还想将其用于生产网站,而不仅仅是我的个人作品集。所以我不能依赖于添加 defer/async 到脚本标签。
相关主题:
您应该使用 DomContentLoaded 事件而不是 onload
回调
document.addEventListener("DOMContentLoaded", function(event) {
console.log("DOM fully loaded and parsed");
});
查看 this question 了解有关 onload
与 DomContentLoaded
事件的更多信息