2016-07-01 16 views
9

muszę zdławić mouseMove zdarzenie, i postępuj według wskazówek poniżej, aby zbudować metodę, ale nie działa: Perform debounce in React.jsReact.js udusić mouseMove zdarzenie zachować rzucanie event.persist() Błąd

Oto mój kod (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) 
    } 
} 

Jeśli trzymać mouseMove na tool__body, to będzie uzyskać wiele poniżej ostrzeżenia:

ostrzeżenie: s yntetyczne wydarzenie jest ponownie wykorzystywane ze względu na wydajność. Jeśli widzisz to, masz dostęp do usługi screenX w wydaniu syntetycznym wydanym/usuniętym. Ta wartość ma wartość NULL. Jeśli musisz zachować oryginalne wydarzenie syntetyczne, użyj event.persist(). Aby uzyskać więcej informacji, zobacz fb.me/react-event-pooling.

moich reagować wersję: "15.0.2"

Wydaje e.persist() nie działa dobrze. Dowolny pomysł? : D

+0

Wydaje mi się bardzo przydatny komunikat o błędzie. Czy postępowałeś zgodnie z sugerowanym linkiem https://facebook.github.io/react/docs/events.html#event-pooling? –

+0

tak, więc dodam 'e.persist()' w moim '_onMouseMove', ale nie działa – twxia

Odpowiedz

13

e.persist musi być wywoływany synchronicznie ze zdarzeniem, handler może być wywołany asynchronicznie. Oto dylemat:

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

Odpowiednia zmiana dzwoni _onMouseMove bezpośrednio z imprezy i utworzenie drugiej metody rzeczywiście obsłużyć zdarzenia, który został zdławiony.

+0

Wielkie dzięki: D, oficjalny dokument nie zauważa, że ​​ – twxia

+0

Cieszę się, że mogę pomóc. –

+0

Niezłe wyjaśnienie, nie doszedłem do wniosku, że najpierw trzeba wykonać program obsługi, a następnie przekazać ten sam obiekt do zdławionego programu obsługi, dzięki! –

Powiązane problemy