Tal*_*wan 9 javascript dom reactjs
在React的官方Facebook文档中将类生命周期方法添加到类中,它提到:
5)如果从DOM中删除了Clock组件,React会调用componentWillUnmount()生命周期钩子,以便停止计时器.
只是想了解如何?我知道React知道什么时候将组件插入DOM,所以它可以调用componentDidMount
生命周期钩子.
但componentWillUnmount
它只是说," 曾经从去除DOM ".似乎表明它是真正的DOM而不是React DOM.也许可以用javaScript/jQuery删除组件,并且componentWillUnmount
应该触发.
React究竟知道该组件已从真正的DOM中删除了吗?可能有一个观察者?
谢谢
实际DOM上没有观察者.每次调用组件的render函数时,都会重新构建Virtual DOM.如果不再需要某个组件,则会从虚拟DOM中删除该组件.
差异算法将实际DOM中需要更改的实际DOM的那些部分标识为虚拟DOM的反映:某些组件必须添加到实际DOM(=称为安装),其他组件必须被删除(=卸载).整个过程称为对帐.
正是由于这个协调过程,React 知道要从实际DOM中删除哪些组件.在删除组件之前,React调用componentWillUnmount()生命周期钩子.
如果另一个脚本(Javascript或jQuery)导致从实际DOM中删除某个组件,React将永远不会注意到它,因此不会调用componentWillUnmount()生命周期钩子.
这不是真的。如果您确实从 DOM 中手动删除了一个组件,它不会触发componentWillUnmount
.. 它仅通过虚拟 DOM 发生,如果组件不再存在,则级别:
// Unmount children that are no longer present.
for (name in prevChildren) {
if (
prevChildren.hasOwnProperty(name) &&
!(nextChildren && nextChildren.hasOwnProperty(name))
) {
prevChild = prevChildren[name];
removedNodes[name] = ReactReconciler.getHostNode(prevChild);
ReactReconciler.unmountComponent(
prevChild,
false /* safely */,
false /* skipLifecycle */,
);
}
}
Run Code Online (Sandbox Code Playgroud)
unmountComponent
然后将调用componentWillUnmount
.
我componentWillUnmount
通过打开 devtools 并删除一些具有componentWillUnmount
生命周期方法的组件来手动测试。