React: هل تريد إزالة مستمع الحدث المستخدم مع الربط في بناء جملة ES6؟

تم إنشاؤها على ٩ فبراير ٢٠١٦  ·  3تعليقات  ·  مصدر: facebook/react

أحاول التواصل مع iframe باستخدام postMessage API ولكن لدي مشكلة في إدارة مستمعي الأحداث في ES6

جاء في المستندات أن

باستخدام React ، ترتبط كل طريقة تلقائيًا بمثيلها المكون (باستثناء عند استخدام بناء جملة فئة ES6)

المشكلة هي أن this.handler.bind(this) !== this.handler لذلك عندما انتهيت من الحدث لا يمكنني إزالة المستمع لأنني لا أستطيع الاحتفاظ بمرجع إلى المعالج. يمكنني محاولة تغليف الوظيفة ، لكن وظيفة التغليف ستحتاج أيضًا إلى ربط. يمكنني محاولة تفوق المنشئ أيضًا ولكني لست متأكدًا من أن هذه فكرة جيدة ، بالإضافة إلى أنني لا أعرف الحجج التي تحتاجها. أنا متأكد تمامًا من أنني فقدت نقطة مهمة هنا.

أي مساعدة سيكون محل تقدير كبير !

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

شكرا على كل حال !

Question

التعليق الأكثر فائدة

أداة تعقب المشكلة مخصصة للأخطاء في React ، وليس للدعم العام. استخدم Stack Overflow أو IRC لذلك.

ومع ذلك ، فإن الحل العام لهذه المشكلة هو الاحتفاظ بإشارة إلى المعالج المنضم. على سبيل المثال ، يمكنك ربط الطريقة في المنشئ:

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

راجع أيضًا منشور المدونة الذي قدم الفصول الدراسية: https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html#autobinding .

ال 3 كومينتر

أداة تعقب المشكلة مخصصة للأخطاء في React ، وليس للدعم العام. استخدم Stack Overflow أو IRC لذلك.

ومع ذلك ، فإن الحل العام لهذه المشكلة هو الاحتفاظ بإشارة إلى المعالج المنضم. على سبيل المثال ، يمكنك ربط الطريقة في المنشئ:

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

راجع أيضًا منشور المدونة الذي قدم الفصول الدراسية: https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html#autobinding .

fkling هذا بالضبط ما كنت سأقوله: P. صحيح في جميع النقاط. شكر!

نأسف لذلك ، شكرا مرة أخرى!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات