在 DOM 中多次使用 React.render() 可以吗?

IT技术 reactjs
2021-04-03 08:10:03

我想使用 React 在整个 DOM 中多次添加组件。这个小提琴显示了我想要做什么,它不会抛出任何错误。这是代码:

HTML:

<div id="container">
    <!-- This element's contents will be replaced with the first component. -->
</div>

<div id="second-container">
    <!-- This element's contents will be replaced with the second component. -->
</div>

JS:

var Hello = React.createClass({
    render: function() {
        return <div>Hello {this.props.name}</div>;
    }
});

React.render(<Hello name="World" />, document.getElementById('container'));

React.render(<Hello name="Second World" />, document.getElementById('second-container'));

我已经看到了这个问题,我担心通过执行上述操作,我会冒着 React 组件相互干扰的风险。该问题的答案建议使用服务器端渲染,这对我来说不是一个选项,因为我使用的是 Django 服务器端。

另一方面,也许我正在做的事情没问题,因为我只挂载了一个 React 库实例(而不是多个组件调用自己的 React 实例)?

这种使用多个 DOM 实例的方式是使用 React 的好方法吗?

3个回答

是的,React.render在同一页面上多次调用是完全没问题的。正如您所建议的,React 库本身只加载一次,但每次调用React.render都会创建一个独立于任何其他组件的新组件实例。(事实上​​,这种情况在正在过渡到 React 的站点上并不少见,其中页面的某些部分是使用生成的,React.render而其他部分则不是。)

如果根据您打开的页面有多个ReactDOM.render()必须在同一个中插入组件的div情况呢?特别是,您在每个页面中只有一个丑陋的串联app.js资产<script src="app.js">这会加载库,例如 jQuery、Bootstrap、React,并拥有您的自定义 JS 代码和 React 组件。如果你访问/foo,你有ReactDOM.render(<Foo />, getElemById('content'))如果您访问/bar', you have ReactDOM.render(<Bar/>, getElemById('content'))`。他们确实干涉。你如何管理这个?
2021-05-28 08:10:03
太棒了 - 它对“增压”现有的 Django 应用程序也非常有帮助。我想将 Django 用于渲染内容以获得 SEO,并使用 React 进行用户与 DOM 元素的交互。这使得实现起来非常简单。
2021-05-31 08:10:03
@Green 我不确定我是否理解,如果组件位于不同的页面上,它们会如何干扰?否则,为什么不为每个组件添加一个新的容器元素,即:ReactDOM.render(<Foo/>, document.getElementById('content').appendChild(document.createElement('div')))
2021-06-03 08:10:03
您可能还可以查看 shouldComponentUpdate 并且它可以在将来启动性能(可能不是您的情况)。这是参考:facebook.github.io/react/docs/component-specs.html
2021-06-07 08:10:03
@YPCrumble 如果漏斗回答正确,请标记
2021-06-16 08:10:03

从页面加载性能的角度来看,这种方法是可以的,但还有其他缺点,如果可能,应该避免多个 React 根。

  • 不同的 React 根不能共享上下文,如果需要在 React 根之间进行通信,则需要回退到全局 DOM 事件
  • 您从时间切片等性能优化中获得的好处较少- 悬念和异步渲染。跨 React 根边界挂起是不可能的

进一步阅读

@DiegoFortes 是的,您可以使用ReactDOM.createPortal. reactjs.org/docs/portals.html
2021-05-22 08:10:03
我可以创建一个单一的render并注入insertAdjacentElementReact组件,但使用 React 而不是实际的 DOM 元素吗?
2021-06-15 08:10:03

如果你想知道对同一个容器多次使用 ReactDOM.render() 是否可以文档说:“如果 React 元素之前被渲染到 [同一个] 容器中,这将对其执行更新并且只发生变异DOM 以反映最新的 React 元素”

谢谢。这确实是我试图找出的。
2021-06-19 08:10:03