React: Ereignis-Listener entfernen, der mit bind in der ES6-Syntax verwendet wird?

Erstellt am 9. Feb. 2016  ·  3Kommentare  ·  Quelle: facebook/react

Ich versuche, mit einem Iframe über die postMessage-API zu kommunizieren, habe jedoch ein Problem mit der eventListeners-Verwaltung in ES6

In den Dokumenten heißt es, dass

Mit React wird jede Methode automatisch an ihre Komponenteninstanz gebunden (außer bei Verwendung der ES6-Klassensyntax).

Das Problem ist, dass this.handler.bind(this) !== this.handler Wenn ich mit dem Ereignis fertig bin, kann ich den Listener nicht entfernen, da ich keinen Verweis auf den Handler behalten kann. Ich könnte versuchen, die Funktion zu kapseln, aber die Kapselungsfunktion würde auch eine Bindung benötigen. Ich könnte versuchen, den Konstruktor auch zu super zu machen, aber ich bin mir nicht sicher, ob dies eine gute Idee ist, und ich kenne die Argumente nicht, die er benötigt. Ich bin mir ziemlich sicher, dass mir hier ein wichtiger Punkt fehlt.

Jede Hilfe wäre sehr dankbar!

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>
    )
  }
}

Danke trotzdem !

Question

Hilfreichster Kommentar

Der Issue-Tracker ist für Fehler mit React vorgesehen, nicht für die allgemeine Unterstützung. Verwenden Sie dazu Stack Overflow oder IRC.

Die generische Lösung für dieses Problem besteht jedoch darin, einen Verweis auf den gebundenen Handler beizubehalten. Sie können die Methode beispielsweise im Konstruktor binden:

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

Siehe auch den Blog-Beitrag, in dem Klassen eingeführt wurden: https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html#autobinding .

Alle 3 Kommentare

Der Issue-Tracker ist für Fehler mit React vorgesehen, nicht für die allgemeine Unterstützung. Verwenden Sie dazu Stack Overflow oder IRC.

Die generische Lösung für dieses Problem besteht jedoch darin, einen Verweis auf den gebundenen Handler beizubehalten. Sie können die Methode beispielsweise im Konstruktor binden:

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

Siehe auch den Blog-Beitrag, in dem Klassen eingeführt wurden: https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html#autobinding .

@fkling Genau das wollte ich sagen: P. In allen Punkten korrigieren. Vielen Dank!

Sry dafür, nochmals vielen Dank!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen