【发布时间】:2018-03-05 17:19:28
【问题描述】:
有一个我经常使用的模式,我觉得它一定是一个反模式,但我不知道更好的替代方案。
有时我的组件可能会收到一个或多个事件,这意味着需要重新渲染。有时我不知道事件处理程序将被调用多少次。为了防止由于多次调用处理程序而导致多次重新渲染,我做了这样的事情:
_myEventHandler() { // may be called multiple times between renders
if (!this._updateQueued) {
this._updateQueued = true;
this._updateTimer = setTimeout(() => {
this._updateQueued = false;
this.forceUpdate();
}, 0);
}
}
这里的问题是,由于代码停止和事件循环启动之间的延迟,我觉得它无法执行。
一个真实的例子是,当我使用 react-visibility-sensor 并且我有多个元素同时更改它们的可见性时,我不想为每个元素重新渲染,而是只想要一个重新-在收到所有更新后渲染。
还有其他更好的方法来处理多个调用吗?
顺便说一句:如果您要使用上述技巧,请不要忘记在您的 componentWillUnmount 中调用 clearTimout(this._updateQueued)
【问题讨论】:
-
实现去抖动
-
使用去抖动实际上与上面相同。在引擎盖下,去抖动正在使用 setTimeout
-
请查看
shouldComponentUpdate(nextProps, nextState) {return true or false;} -
@fungusanthrax 我看不出这有什么帮助?
-
如果问题在于获取组件以防止重新渲染,这绝对是您想要采取的路线。您能否提供更多关于这不相关的信息?
标签: reactjs settimeout anti-patterns