J'ai un composant de réaction comme:
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
Ici, le lister d'événements est ajouté au composant. Lorsque je rafraîchit la page, une fenêtre contextuelle me demande de quitter la page.
Mais lorsque je vais sur une autre page et que je l'actualise à nouveau, la même fenêtre contextuelle s'affiche.
Je supprime la eventListener
du composant sur componentWillUnmount
. Alors pourquoi n'est-il pas supprimé?
Comment puis-je supprimer l'événement beforeunload
sur d'autres pages?
removeEventListener
devrait obtenir la référence au même rappel que celui attribué dans addEventListener
. Recréer la fonction ne fera pas l'affaire. La solution consiste à créer le rappel ailleurs (onUnload
dans cet exemple) et à le transmettre comme référence à addEventListener
et 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
La solution d'Ori n'a pas fonctionné pour moi. Je devais le faire pour que ça marche ... (Merci docs)
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
}