Javascript 删除已安装组件的DOM元素

Javascript 删除已安装组件的DOM元素,javascript,reactjs,Javascript,Reactjs,我正在从事一个将React组件合并到非React环境中的项目 该项目使用主干网,我们正在缓慢地迁移网站的某些部分以作出反应 我的问题: 删除DOM节点(通过主干/jquery)会释放与React组件关联的内存吗? 文档中明确指出,您必须管理自己的装载/卸载,但是我想知道简单地删除DOM是否会为我清理内存,或者我是否需要担心长寿命页面中的内存泄漏 一个示例用例是导航离开(使用我们的主干路由器)并重新呈现页面,这将删除所有以前的节点并构建新的html-那么所有装载的react组件会发生什么情况 编辑

我正在从事一个将React组件合并到非React环境中的项目

该项目使用主干网,我们正在缓慢地迁移网站的某些部分以作出反应

我的问题:
删除DOM节点(通过主干/jquery)会释放与React组件关联的内存吗?
文档中明确指出,您必须管理自己的装载/卸载,但是我想知道简单地删除DOM是否会为我清理内存,或者我是否需要担心长寿命页面中的内存泄漏

一个示例用例是导航离开(使用我们的主干路由器)并重新呈现页面,这将删除所有以前的节点并构建新的html-那么所有装载的react组件会发生什么情况

编辑:
明确地说,我并没有使用jQuery修改渲染组件

class App extends React.Component{
   render(){
      return (<div>Amazing</div>);
   }
}



//extreme use case, render a component, remove the DOM node, create a new DOM node
setInterval(function(){
    ReactDOM.render(React.createElement(App),document.getElementById('app'));
    $('#app').remove();
    $('body').append($('<div id="app">'));
},250)
类应用程序扩展了React.Component{
render(){
回归(惊人);
}
}
//极端用例、渲染组件、移除DOM节点、创建新的DOM节点
setInterval(函数(){
render(React.createElement(App),document.getElementById('App');
$('#app')。删除();
$('body')。追加($('');
},250)
编辑: 在调查该问题之后,必须使用MutationObserver检测已删除的节点并将其卸载,否则节点将继续在内存中呈现。 我在这里写了一个完整的描述:


如果删除通过直接操作DOM呈现的React的DOM节点,React将不知道这些更改。如果随后重新呈现React组件,则先前删除的DOM节点将重新出现,因为它仍然存在于React虚拟DOM中

您应该避免操纵React创建的DOM部分。这可能会导致应用程序中出现不必要的行为

例如,删除反应已渲染的DOM节点可能会在重新渲染时引发以下异常:

Uncaught DomeException:未能在“节点”上执行“removeChild”:要删除的节点不是此节点的子节点。
或者其他的一些例外


下面是关于更新DOM的说明:

React不知道在React之外对DOM所做的更改。信息技术 根据其自身的内部表示确定更新,如果 相同的DOM节点由另一个库React get操作 困惑,无法恢复

这并不意味着不可能,甚至不一定很难做到 将React与影响DOM的其他方法结合起来,您只需 注意每个人在做什么

避免冲突的最简单方法是防止React组件 从更新。您可以通过渲染没有响应的元素来实现这一点 更新原因,如空的

接下来是React与jQuery的集成示例


最后,我建议进一步阅读虚拟DOM。官方文件似乎没有说太多,但在网上搜索,你会发现大量的指南;比如。

log componentWillUnmount,这是我记录的答案,它没有运行:)但我的问题是关于内存分配,不仅仅是生命周期方法。我读了那些文档,但它们回避了手头的确切问题。问题不是更改React组件,而是一起删除
根节点。我更新了我的问题,以反映这一点,因为我认为它不清楚。@Patrick,答案是一样的。即使删除根节点,React仍在“运行”。因此,虽然删除它并不“理想”,但如果删除节点并重新插入它,应该不会有问题。只需知道React将进行任何更新,就好像它从未被删除一样。换句话说,整个应用程序状态将保持不变。唯一的问题是React在删除根节点时是否尝试执行某些操作。希望这能回答你的问题?:)谢谢这就是我所怀疑的,我想我必须更深入地分析,以确保不会发生疯狂的内存泄漏。