我需要限制mousemove事件,我按照下面的提示构建方法,但不起作用: Perform debounce in React.js
这是我的代码(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
上,它会发出以下警告:
警告:出于性能原因,会重复使用此合成事件。如果您看到此消息,则您在已发布/无效的合成事件上访问属性
screenX
。这被设置为null。如果必须保留原始合成事件,请使用event.persist()。有关更多信息,请参见fb.me/react-event-pooling。
我的反应版本:&#34; 15.0.2&#34;
似乎e.persist()
效果不佳。任何的想法? :d
答案 0 :(得分:15)
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,并设置第二种方法来实际处理被限制的事件。
答案 1 :(得分:3)
带钩子:
const Tool = () => {
const onMouseMove = useMemo(() => {
const throttled = _.throttle(e => console.log(e.screenX), 300);
return e => {
e.persist();
return throttled(e);
};
}, []);
return (
<div className="tool">
<div className="tool__body" onMouseMove={onMouseMove}>
Content
</div>
</div>
);
};