javascript - 不变违规 : _registerComponent(. ..):目标容器不是 DOM 元素

标签 javascript dom reactjs

在制作微不足道的 React 示例页面后出现此错误:

Uncaught Error: Invariant Violation: _registerComponent(...): Target container is not a DOM element.

这是我的代码:

/** @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 保留在 headrender on DOMContentLoaded event 中是一种有效的解决方案,最好将 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 否则,各种第三方代码(Google Font Loader、浏览器插件等)可以在 React 不期望的情况下修改 body DOM 节点,并导致难以跟踪和调试的奇怪错误。 Read more about this issue.

script 放在底部的好处是,如果您将 React 服务器渲染添加到项目中,它不会在脚本加载之前阻塞渲染。


更新:(2015 年 10 月 7 日 | v0.14)

React.render is deprecated, use ReactDOM.render instead.

示例:

import ReactDOM from 'react-dom';

ReactDOM.render(<App />, document.getElementById('root'));

关于javascript - 不变违规 : _registerComponent(. ..):目标容器不是 DOM 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26566317/

相关文章:

javascript - 在 document.forms[x].elements 中从 DOM 中省略图像输入是否正常?

javascript - 如何更改 Yup/Formik 中的默认错误文本?

javascript - 如何解决 Amplify backend-config.jason 不存在问题

仅限 Javascript - 对一堆 DIV 进行排序

javascript - Vue 中的嵌套循环

javascript - 如何通过 jQuery UI 使整个 DOM 可拖动和可调整大小?

javascript - 使用 vanilla JS 开 Jest - 在 DOM 上测试生成的元素

reactjs - 如何通过一劳永逸地重新渲染来修复图像闪烁?

javascript - React Native TextInput 显示后不会聚焦

javascript - 在 DevExpress 图表控件中显示条形内的提示数据