[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();
相关推荐
morethanilove8 分钟前
新建vue3 + ts +vite 项目
前端·javascript·vue.js
GISer_Jing9 分钟前
微软AI战略全景:从基础设施到智能体生态
前端·人工智能·microsoft
发际线向北11 分钟前
0x03 单元测试与Junit
前端·单元测试
忆往wu前12 分钟前
搞懂 SPA 再学路由!Vue Router 从0到完善 + 嵌套路由一次性梳理
前端·vue.js
小智社群13 分钟前
获取贝壳中介列表,并且自动导入excel
开发语言·javascript·ecmascript
Aliex_git13 分钟前
前端监控笔记(三)
前端·笔记·学习
布局呆星13 分钟前
Vue3 笔记:过渡动画与自定义指令
javascript·css·vue.js·python·es6·html5
M ? A14 分钟前
Vue Suspense 组件在 React 中,VuReact 会如何实现?
前端·javascript·vue.js·经验分享·react.js·面试·vureact
im_AMBER15 分钟前
Leetcode 159 无重复字符的最长子串 | 长度最小的子数组
javascript·数据结构·学习·算法·leetcode
天才熊猫君18 分钟前
通用 Loading 状态管理器
前端·javascript·vue.js