Ресивер события eventjs beforeunload добавлен, но не удален
У меня есть реагирующий компонент вроде:
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
Здесь добавляется событие lister. Когда я обновляю страницу, она вызывает всплывающее окно с просьбой покинуть страницу.
Но когда я перехожу на другую страницу и обновляюсь, она снова показывает то же самое всплывающее окно.
Я удаляю eventListener
из компонента на componentWillUnmount
. Тогда почему он не удаляется
Как удалить событие beoreunload
на других страницах?
Ответы
Ответ 1
removeEventListener
должен получить ссылку на тот же обратный вызов, который был назначен в addEventListener
. Воспроизведение функции не будет. Решением является создание обратного вызова в другом месте (onUnload
в этом примере) и передать его как ссылку как на addEventListener
, так и на removeEventListener
:
import React, { PropTypes, Component } from 'react'
class MyComponent extends Component {
constructor(props) {
super(props);
this.onUnload = this.onUnload.bind(this); // if you need to bind callback to this
}
onUnload(event) { // the method that will be used for both add and remove event
console.log("hellooww")
event.returnValue = "Hellooww"
}
componentDidMount() {
window.addEventListener("beforeunload", this.onUnload)
}
componentWillUnmount() {
window.removeEventListener("beforeunload", this.onUnload)
}
render() {
return (
<div>
Some content
</div>
)
}
}
export default MyComponent
Ответ 2
Ориентное решение для меня не сработало. Я должен был сделать это, чтобы он работал... (Спасибо, документы)
componentDidMount() {
window.addEventListener('beforeunload', this.handleLeavePage);
}
componentWillUnmount() {
window.removeEventListener('beforeunload', this.handleLeavePage);
}
handleLeavePage(e) {
const confirmationMessage = '';
e.returnValue = confirmationMessage; // Gecko, Trident, Chrome 34+
return confirmationMessage; // Gecko, WebKit, Chrome <34
}