2013-10-14 1 views
3

Я использую эту простую функцию визуализации с несколькими обработчиками:Как удалить конкретный слушатель событий из react.js элемента

render:function(){ 
     return (
      <div id="all-highlights" class="highlight-container" onMouseDown={this.drag} onMouseUp={this.dragEnd} onMouseMove={this.moving}> 
       <div class="highlight"> 

       </div> 
      </div> 
     ); 
    } 

В функции React.createClass, используя что-то вроде: this.removeTheListener функции, как я мог бы удалить конкретную функцию mouseMove? Независимо от производительности функции mouseMove, я знаю, что ее ресурс тяжелый, но для чего я делаю его идеальное событие.

Можно ли удалить только определенного слушателя, а затем удалить его обратно в другой момент времени?

ответ

6

В React, если вы хотите что-то изменить (атрибут, прослушиватель и т. Д.), Вы должны принудительно перенастроить компонент, обновив состояние. Затем вы создаете на основе этого состояния.

Вот кусок кода, который должен работать для вас:

var DraggableComponent = React.createClass({ 

    getInitialState: function() { 
    return { 
    dragging: false 
    }; 
    }, 

    render: function(){ 
    var onDrag = this.state.dragging ? this.onDrag : null; 
    return (
     <div 
     className="highlight-container" 
     onMouseDown={this.dragStart} 
     onMouseUp={this.dragEnd} 
     onMouseMove={onDrag}> 
     <div className="highlight"> 
      {this.props.children} 
     </div> 
     </div> 
    ); 
    }, 

    dragStart: function() { 
    this.setState({dragging: true}); 
    }, 

    dragEnd: function() { 
    this.setState({dragging: false}); 
    }, 

    onDrag: function() { 
    // ... 
    } 

}); 
+0

, что вы писали довольно много, как я установить мину, я сменил утративший this.moving функции Бен вокруг. И это трюк. Оба эти являются хорошими ответами, но ваш добавляет больше контекста, который я чувствую – asherrard

8

Как и все в Реагировании, ключ должен мыслить декларативно. Самый простой способ сделать это - сохранить некоторое состояние, соответствующее тому, хотите ли вы привязать событие. (Вы, возможно, уже есть такой флаг!) Затем вы можете сделать что-то вроде:

onMouseMove={this.state.dragging ? null : this.moving} 

, а затем просто написать

this.setState({dragging: true}); 

в обработчике MouseDown.

Смежные вопросы