[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();
相关推荐
gyx_这个杀手不太冷静12 小时前
OpenCode 深度解析:架构设计、工具链集成与工程化实践
前端·架构·ai编程
m0_4592524612 小时前
fastadmin动态渲染统计信息
开发语言·前端·javascript·php
该怎么办呢12 小时前
Source/Core/Matrix4.js
前端·javascript
小江的记录本12 小时前
【MyBatis-Plus】Spring Boot + MyBatis-Plus 进行各种数据库操作(附完整 CRUD 项目代码示例)
java·前端·数据库·spring boot·后端·sql·mybatis
于慨13 小时前
Capacitor
前端
该怎么办呢13 小时前
Source/Core/Event.js
开发语言·javascript·ecmascript·cesium
IT凝冬13 小时前
liunx 的 centos7 安装ngin
前端
赵锦川13 小时前
大屏比例缩放
前端·javascript·html
该怎么办呢13 小时前
Source/Core/DeveloperError.js
开发语言·javascript·ecmascript
于慨14 小时前
tauri
java·服务器·前端