2016-07-01 70 views
9

我需要節流mousemove事件,我按照下面的提示,以構建方法,但不工作: Perform debounce in React.jsReact.js油門mousemove事件不斷拋出event.persist()錯誤

這裏我的代碼(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) 
    } 
} 

如果你把鼠標移動的tool__body,它會得到很多下面的警告:

警告:這個S-由於性能原因重新使用合成事件。如果你看到這個,你正在發佈/無效的合成事件中訪問屬性screenX。這被設置爲空。如果您必須保留原始合成事件,請使用event.persist()。有關更多信息,請參閱fb.me/react-event-pooling。

我反應過來的版本: 「15.0.2」

似乎e.persist()不能很好地工作。任何想法? :D

+0

似乎很有用的錯誤信息給我。你有沒有按照建議的鏈接https://facebook.github.io/react/docs/events.html#event-pooling? –

+0

是的,所以我在我的'_onMouseMove'中添加'e.persist()',但不工作 – twxia

回答

13

e.persist需要與事件同步調用,可以異步調用處理程序。這裏是一個修復:

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

相關的變化是直接從事件調用_onMouseMove,並建立實際處理一個已經節流事件的第二種方法。

+0

非常感謝:D,官方文檔沒有注意到 – twxia

+0

很高興我能幫上忙。 –

+0

很好的解釋,我還沒有想到你需要先執行處理程序,然後將同一個對象傳遞給throttled處理程序,謝謝! –