React基础 第十三章(State更新队列)

React中的批处理机制

当我们在事件处理函数中连续调用setState方法时,React会将这些更新合并成一个更新来进行处理,这就是所谓的批处理机制。这意味着无论我们调用了多少次setState,实际上组件只会重新渲染一次,这有助于提高应用程序的性能。

然而,这里有一个常见的误区。如果我们在事件处理函数中连续多次更新同一个state,而且是基于当前state的值来更新,那么我们可能不会得到预期的结果。

技巧

  • 利用React的事件处理机制,将多个state更新放在一个事件处理函数中。

示例

jsx 复制代码
function Counter() {
  const [number, setNumber] = useState(0);

  function handleIncrement() {
    // 这里尝试将number+1连续执行3次,但实际上只会执行1次setNumber(number + 1);
    setNumber(number + 1);
    setNumber(number + 1);
    setNumber(number + 1);
  }

  return (
    <>
      <h1>{number}</h1>
      <button onClick={handleIncrement}>+3</button>
    </>
  );
}

在上面的示例中,尽管我们调用了三次setNumber(number + 1),但由于React的批处理机制,这三次更新会被合并,而且每次更新都是基于同一个number值,最终number只会增加1而不是3。

注意事项

  • 注意每次渲染的state值是固定的,多次调用setNumber(number + 1)会基于同一个number值。

修复后的代码

jsx 复制代码
function Counter() {
  const [number, setNumber] = useState(0);

  function handleIncrement() {
    // 使用函数式更新,每次都基于最新的state值
    setNumber(prevNumber => prevNumber + 1);
    setNumber(prevNumber => prevNumber + 1);
    setNumber(prevNumber => prevNumber + 1);
  }

  return (
    <>
      <h1>{number}</h1>
      <button onClick={handleIncrement}>+3</button>
    </>
  );
}

在修复后的示例中,我们使用了函数式更新,即setNumber(prevNumber => prevNumber + 1)。这样,每次更新都会基于上一次更新后的state值,确保了number最终会正确增加3。

命名惯例

为了代码的可读性,更新函数的参数通常以state变量的第一个字母命名。

技巧

  • 使用简短的参数名。

示例

jsx 复制代码
setEnabled(e => !e);
setLastName(ln => ln.reverse());
setFriendCount(fc => fc * 2);

注意事项

  • 保持命名的一致性,使代码更易于理解。

记住,合理地使用React的批处理机制和更新函数,可以大幅提升应用的响应速度和用户体验。

相关推荐
前端老兵AI13 分钟前
前端工程化实战:Vite + ESLint + Prettier + Husky 从零配置(2026最新版)
前端·vite
bluceli14 分钟前
浏览器渲染原理与性能优化实战指南
前端·性能优化
张元清14 分钟前
Astro 6.0:被 Cloudflare 收购两个月后,这个"静态框架"要重新定义全栈了
前端·javascript·面试
码路飞16 分钟前
团队 AI 写了 3 个月 React,代码差点烂掉 —— 5 个坑 + 自动化防线
react.js
凉拌西红柿16 分钟前
如何用工具定位性能瓶颈
前端
青青家的小灰灰17 分钟前
深入理解 async/await:现代异步编程的终极解决方案
前端·javascript·面试
阿懂在掘金19 分钟前
早点下班(Vue2.7版):旧项目也能少写 40%+ 异步代码
前端·vue.js·开源
Mintopia19 分钟前
Web性能测试流程全解析:从概念到落地的完整指南
前端·性能优化·测试
Qinana41 分钟前
第一次用向量数据库!手搓《天龙八部》RAG助手,让AI真正“懂”你
前端·数据库·后端
忆江南42 分钟前
# Flutter Engine、Dart VM、Runner、iOS 进程与线程 —— 深度解析
前端