2016-04-07 15 views
2

DOMにli要素の束を添付するReactコンポーネントがあります。そしてそれらの一部にはクリックイベントリスナーがあります。ユーザーがliという特殊なものをクリックした後にイベントリスナーを無効にしようとしていますが、event.currentTarget.removeEventListener('click', this.handleMouse) for thatを使用していますが、動作していません。ここでは、コードの関連部分です:コールバックのremoveEventListenerが機能しない

編集した
var DisplayList = React.createClass({ 

[...] 

handleMouse: function(event){ 

    event.currentTarget.style.backgroundColor = 'white'; 

    this.props.changeCounts(-1); 

    event.currentTarget.removeEventListener('click', this.handleMouse); //NOT WORKING 
    }, 

[...] 

    render: function(){ 
    var self = this; 
    return(
     <div id = "listing-boxes-wrapper"> 
      { 

      this.props.sortedList.map(function(item, index){ 
       if (self.state.changedHabit.indexOf(item.habitid) > -1) { 
       return <li key={index} style={{backgroundColor: '#ccc'}} className = "text-center" onClick={self.handleMouse}>{item.description} 
         </li> 
       }else{ 
       return <li key={index} className =" text-center">{item.description} 
         </li> 
       } 
      }) 
      } 
     </div> 
    ) 

:バックhandleMousethisを追加しましたが、それでも

+0

私はあなたが古い学校のHTML属性を経由して追加されたイベントのためにremoveEventListenerを使用することができるとは思いません。 addEventListenerを使用してハンドラを適切な方法で追加するだけで、正常に動作するはずです。 – CBroe

+0

@CBroeこれは「古い学校のHTML属性」ではなく、HTMLでさえありません。 – zerkms

答えて

2

reactjs作業イマイチ(特にthisundefinedだろう)ハンドラにコンテキストをバインドするFunction.prototype.bindを使用しています。

だから何ボンネットの下に起こることのようなものです:あなたはそれがリスナーないthis.handleMouseに追加し、別の機能です見ることができるように

element.addEventListener('click', this.handleMouse.bind(this)); 

、。

その後、添付されていないので、削除することはできません。

リアクションウェイの解決策は、ハンドラを使わずに再度要素を再描画するだけで、反応がハンドラ自体を切り離すことになります。

Relevant反応のコード(?):

/** 
* Binds a method to the component. 
* 
* @param {object} component Component whose method is going to be bound. 
* @param {function} method Method to be bound. 
* @return {function} The bound method. 
*/ 
function bindAutoBindMethod(component, method) { 
    var boundMethod = method.bind(component); 
    if (__DEV__) { 
    // stripped as irrelevant 
    } 
    return boundMethod; 
} 

/** 
* Binds all auto-bound methods in a component. 
* 
* @param {object} component Component whose method is going to be bound. 
*/ 
function bindAutoBindMethods(component) { 
    var pairs = component.__reactAutoBindPairs; 
    for (var i = 0; i < pairs.length; i += 2) { 
    var autoBindKey = pairs[i]; 
    var method = pairs[i + 1]; 
    component[autoBindKey] = bindAutoBindMethod(
     component, 
     method 
    ); 
    } 
} 
+0

その場合、そのonclickコールバック関数にパラメータを渡す必要があります。しかし、コールバックに渡されるイベントオブジェクトも必要です。 'self.handleMouse.bind(self、myParameter)'、イベントオブジェクトを受け取る方法は?私はバインドを使用するので、それがクリックされるまで自動的に関数を実行しませんでした。ありがとう – user308553

+0

まあ、あなたはそれを必要としません - ハンドラなしで要素を再レンダリングするだけです。そしてreactjsはあなたのためにそれをデタッチします。 – zerkms

+0

私の場合は可能かどうかわかりません。私はいくつかの詳細を元のポストにURの名前の下で働いています、あなたは見てみることができますか?ありがとう – user308553

関連する問題