javascript - React 如何知道组件已从 DOM 中移除?

标签 javascript reactjs dom

Adding Lifecycle Methods to a Class在 React 的官方 Facebook 文档中提到:

5) If the Clock component is ever removed from the DOM, React calls the componentWillUnmount() lifecycle hook so the timer is stopped.

只是想了解怎么做?我知道 React 知道何时要将组件插入 DOM,因此它可以调用 componentDidMount 生命周期 Hook 。

但是对于 componentWillUnmount 它只是说“everDOM 中移除”。似乎暗示它是真正的 DOM 而不是 React DOM。还不如使用 javaScript/jQuery 删除组件,componentWillUnmount 应该触发。

React 究竟是如何知道组件已经从真实 DOM 中移除的?会不会有观察者?

谢谢

最佳答案

实际 DOM 上没有观察者。 每次调用组件的渲染函数时,都会重新构建虚拟 DOM。如果不再需要某个组件,则会将其从虚拟 DOM 中删除。

diffing 算法识别实际 DOM 中需要更改的那些部分,以使实际 DOM 成为虚拟 DOM 的反射(reflect):一些组件必须添加到实际 DOM(= 称为安装),其他组件将必须删除(=卸载)。整个过程称为 reconciliation .

正是由于这个协调过程,React 知道哪些组件要从实际的 DOM 中删除。就在组件被删除之前,React 调用 componentWillUnmount() 生命周期钩子(Hook)。

如果另一个脚本(Javascript 或 jQuery)导致从实际 DOM 中删除某个组件,React 永远不会注意到它,因此不会调用 componentWillUnmount() 生命周期钩子(Hook)。

关于javascript - React 如何知道组件已从 DOM 中移除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44996941/

相关文章:

javascript - Angular:仅对 html 表单的某些部分启用表单输入

javascript - 为什么 Ractive.js 的 reset() 和 update() 方法在有一个带有 array.prototype.sort() 的助手和一个空对象的数据时复制模板

javascript - 如何从 jQuery UI slider 获取值?

javascript - jQuery:将 <option> 添加到 <select>

javascript - 在异步函数中执行 createStore 时未定义存储?

json - 在 Reactjs 中,如何从已经放置图像链接的 json 文件中返回图像?

javascript - 未捕获的类型错误 : Cannot read property 'config' of undefined "google chrome extension"

html - 我可以在多个 <template> 片段上使用重复的 ID 吗?

javascript - 在 Angular 中测试具有自定义验证器的响应式(Reactive)表单字段

javascript - 在单击 react 之前触发的 onClick 事件