React: Supprimer l'écouteur d'événements utilisé avec bind dans la syntaxe ES6?

Créé le 9 févr. 2016  ·  3Commentaires  ·  Source: facebook/react

J'essaie de communiquer avec une iframe avec l'API postMessage mais j'ai un problème avec la gestion des eventListeners dans ES6

Il est indiqué dans la documentation que

Avec React, chaque méthode est automatiquement liée à son instance de composant (sauf lors de l'utilisation de la syntaxe de classe ES6)

Le problème est que this.handler.bind(this) !== this.handler donc lorsque j'en ai terminé avec l'événement, je ne peux pas supprimer l'auditeur car je ne peux pas garder une référence au gestionnaire. Je pourrais essayer d'encapsuler la fonction, mais la fonction d'encapsulation aurait également besoin d'une liaison. Je pourrais essayer de superposer le constructeur aussi mais je ne suis pas sûr que ce soit une bonne idée, en plus je ne connais pas les arguments dont il a besoin. Je suis sûr que je rate un point important ici.

Toute aide serait très appréciée !

export default class SomeComponent extends Component {

  handleIframeData(event) {
    // some stuff in there that will need 'this' to be set to the component's context, to get props for example.
  }

  componentDidMount() {
    window.addEventListener('message', this.handleIframeData.bind(this), false)
  }

  componentWillUnmount() {
    // won't work because 'this.handleIframeData.bind(this) !== this.handleIframeData'
    window.removeEventListener('message', this.handleIframeData, false)
  }

  render() {
    return (
      <div className="SomeComponent" style={{height: '100%', width:'100%', display: 'table'}}>
        <iframe src="assets/iframe/index.html" style={{display: 'table-row', width: '100%', height:'100%', border: 0}}></iframe>
      </div>
    )
  }
}

Merci quand même !

Question

Commentaire le plus utile

Le suivi des problèmes est pour les bogues avec React, pas pour le support général. Utilisez Stack Overflow ou IRC pour cela.

Cela étant dit, la solution générique à ce problème est de conserver une référence au gestionnaire lié. Par exemple, vous pouvez lier la méthode dans le constructeur:

constructor(props) {
  super(props);
  this.handleIframeData = this.handleIframeData.bind(this);
}

Voir aussi le billet de blog qui a introduit les classes: https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html#autobinding .

Tous les 3 commentaires

Le suivi des problèmes est pour les bogues avec React, pas pour le support général. Utilisez Stack Overflow ou IRC pour cela.

Cela étant dit, la solution générique à ce problème est de conserver une référence au gestionnaire lié. Par exemple, vous pouvez lier la méthode dans le constructeur:

constructor(props) {
  super(props);
  this.handleIframeData = this.handleIframeData.bind(this);
}

Voir aussi le billet de blog qui a introduit les classes: https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html#autobinding .

@fkling C'est exactement ce que j'allais dire: P. Correct sur tous les points. Merci!

Sry pour cela, merci encore!

Cette page vous a été utile?
0 / 5 - 0 notes