2016-07-01 15 views
9

ich die mousemove- Ereignis drosseln müssen, und ich folgen Sie den nachstehenden Tipps, um die Methode zu bauen, aber nicht funktioniert: Perform debounce in React.jsReact.js drosseln mousemove- Ereignis halten werfen event.persist() Fehler

Hier mein Code (http://jsbin.com/binesofepo/edit?js,console,output):

class Tool extends Component { 
    constructor(props) { 
    super(props); 
    this._onMouseMove = _.throttle(this._onMouseMove.bind(this), 1000) 
    } 

    render() {  
    return (

     <div ref="tool" className="tool"> 
     <div ref="toolBody" 
      className="tool__body" 
      onMouseMove={this._onMouseMove}></div> 
     </div> 
    ) 
    } 
    _onMouseMove(e) { 
    e.persist() 
    console.log(e.screenX) 
    } 
} 

Wenn Sie mousemove- auf dem tool__body halten, es werden viele unter Warnung erhalten:

Achtung: s Dieses Ereignis wird aus Leistungsgründen erneut verwendet. Wenn Sie dies sehen, greifen Sie auf die Eigenschaft screenX bei einem freigegebenen/annullierten synthetischen Ereignis zu. Dies wird auf null gesetzt. Wenn Sie das ursprüngliche synthetische Ereignis beibehalten müssen, verwenden Sie event.persist(). Weitere Informationen finden Sie unter fb.me/react-event-pooling.

meine Version reagieren: "15.0.2"

Scheint e.persist() nicht gut funktioniert. Irgendeine Idee? : D

+0

Scheint ziemlich nützlich Fehlermeldung an mich. Haben Sie den vorgeschlagenen Link https://facebook.github.io/react/docs/events.html#event-pooling verfolgt? ja –

+0

, so füge ich 'e.persist()' in meinem '_onMouseMove', aber funktionieren nicht – twxia

Antwort

13

e.persist synchron mit dem Ereignis aufgerufen werden muss, kann der Handler asynchron aufgerufen werden. Hier ist ein fix:

class Tool extends React.Component { 
    constructor(props) { 
    super(props); 
    this._throttledMouseMove = _.throttle(this._throttledMouseMove.bind(this), 2000); 
    } 

    _throttledMouseMove = (e) => { 
    console.log(e.screenX); 
    } 

    render() {  
    return (
     <div ref="tool" className="tool"> 
     <div ref="toolBody" 
      className="tool__body" 
      onMouseMove={this._onMouseMove}> 
     </div> 
     </div> 
    ) 
    } 

    _onMouseMove = (e) => { 
    e.persist(); 
    this._throttledMouseMove(e); 

    } 
} 
ReactDOM.render(<Tool/>, document.querySelector('.main')) 

Die entsprechende Änderung _onMouseMove direkt von der Veranstaltung ruft, und ein zweites Verfahren einrichten, um tatsächlich Ereignis zu behandeln, die gedrosselt worden ist.

+0

Vielen Dank: D, das offizielle Dokument nicht merkt, dass – twxia

+0

Froh, dass ich helfen konnte. –

+0

Nizza Erklärung habe ich nicht gedacht, dass Sie das gleiche Objekt in die gedrosselte Handler ausführen müssen, übergeben Sie den Handler zuerst und dann, danke! –