[React]用 flushSync 同步更新 state

参考:使用 ref 操作 DOM -- React 中文文档

同时操作state和ref的情况还是有的,按我的原来的处理肯定是使用setTimeout了,看到官方有解决方案,摘录下来以便查看。

源代码就不完整贴了,直接看问题代码块:

javascript 复制代码
setTodos([ ...todos, newTodo]);
listRef.current.lastChild.scrollIntoView();

在 React 中,state 更新是排队进行的。在这个示例中会导致问题,因为 setTodos 不会立即更新 DOM。因此,当你将列表滚动到最后一个元素时,尚未添加待办事项。这就是为什么滚动总是"落后"一项的原因。

要解决此问题,你可以强制 React 同步更新("刷新")DOM。 为此,从 react-dom 导入 flushSync 并将 state 更新包裹 到 flushSync 调用中:

javascript 复制代码
flushSync(() => {
  setTodos([ ...todos, newTodo]);
});
listRef.current.lastChild.scrollIntoView();
相关推荐
掘金安东尼1 小时前
本周前端与 AI 技术情报|前端下一步 #462
前端·javascript·面试
赵庆明老师2 小时前
vben开发入门5:vite.config.ts
前端·html·vue3·vben
qq_12084093712 小时前
Three.js 工程向:实例化渲染 InstancedMesh 的批量优化
前端·javascript
起这个名字2 小时前
LangGraphJs 核心概念、工作流程理解及应用
前端·人工智能
小赵同学WoW2 小时前
vue组件基础知识
前端
牛奶2 小时前
浏览器藏了这么多神器,你居然不知道?
前端·chrome·api
WebInfra2 小时前
Rspack 2.0 正式发布!
前端·javascript·前端框架
极速蜗牛2 小时前
Cursor最近变傻了?
前端
码字小学妹2 小时前
Claude Opus 4.7 接入指南(2026):国内配置 + xhigh 推理 + 成本计算
前端
小赵同学WoW2 小时前
插槽【vue2】与 【vue3】对比
前端