reactjs - 使用 setTimeout 避免 React 中的重新渲染

标签 reactjs settimeout anti-patterns

我经常使用一种模式,我觉得它一定是反模式,但我不知道更好的选择。

有时,我的组件可能会收到一个或多个事件,这意味着需要重新渲染。有时我不知道事件处理程序将被调用多少次。为了防止由于多次调用处理程序而导致多次重新渲染,我做了如下操作:

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

最佳答案

去抖会减少特定代码段的运行次数,无论调用的频率如何。这是一个相当简单的实现。

const debounce = (callable, time) => {
  let timeout;

  return function() {
    const functionCall = () => callable.apply(this, arguments);

    clearTimeout(timeout);
    timeout = setTimeout(functionCall, time);
  };
};

这就是如何使用它。

const debouncedIteration = debouce(() => {
   console.log("Iteration"); // This will be called once every 1000 milliseconds.
}, 1000);

while (true) {
   debouncedIteration();
}

关于reactjs - 使用 setTimeout 避免 React 中的重新渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49116045/

相关文章:

javascript - JS - 如何在特定时间段内随机时间重复触发函数

c# - 单一范式 OOP 会导致抽象反转吗?

javascript - 如何使用 React MUI 覆盖 TextField 组件的宽度?

reactjs - 我如何使用 Jest 和 React 测试库来测试它?

asynchronous - Rust编译wasm(webassembly)时,怎么休眠10毫秒?

objective-c - 根据维基百科,为什么 "call super"被视为反模式?

performance - 最差抽象反转

javascript - CSS更改屏幕文本框的大小

reactjs - 在 Material-UI 容器中使用断点

javascript - 为什么 setTimeout 和 setInterval 在浏览器和 Node.js 中的工作方式不同?