我有一个像这样的反应组件:
import React, { PropTypes, Component } from 'react'
class MyComponent extends Component {
componentDidMount() {
window.addEventListener("beforeunload", function (event) {
console.log("hellooww")
event.returnValue = "Hellooww"
})
}
componentWillUnmount() {
window.removeEventListener("beforeunload", function (event) {
console.log("hellooww")
event.returnValue = "Hellooww"
})
}
render() {
return (
<div>
Some content
</div>
)
}
}
export default MyComponent
这里的事件列表器被添加到组件中。当我刷新页面时,它会弹出要求离开页面。
但是当我转到另一个页面并再次刷新时,它会显示相同的弹出窗口。
我正在从 eventListener
上的组件中删除 componentWillUnmount
。那为什么它没有被删除呢?
如何删除其他页面上的 beforeunload
事件?
原文由 gamer 发布,翻译遵循 CC BY-SA 4.0 许可协议
removeEventListener
应该获得对在addEventListener
中分配的相同回调的引用。重新创建函数是行不通的。解决方案是在别处创建回调(本例中为onUnload
),并将其作为对addEventListener
和removeEventListener
8408 的引用传递反应钩子
您可以使用
useRef
和useEffect
挂钩将beforeunload
事件处理抽象为自定义挂钩。自定义挂钩
useUnload
接收一个函数(fn
)并将其分配给当前 ref。它调用useEffect
一次(在组件挂载时),并将事件处理程序设置为匿名函数,该函数将调用cb.current
(如果已 定义),并返回清理函数以删除事件处理程序,当组件被移除时。用法: