[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();
相关推荐
重庆穿山甲4 分钟前
从零到精通:OpenClaw完整生命周期指南
前端·后端·架构
浏览器API调用工程师_Taylor7 分钟前
web逆向之小红书无水印图片提取工具
前端·javascript·逆向
程序员阿峰8 分钟前
【JavaScript面试题-作用域与闭包】什么是闭包?闭包在实际开发中有什么应用和潜在问题(如内存泄漏)?
前端·面试
yuki_uix10 分钟前
性能指标与优化:从 Core Web Vitals 到实战
前端·javascript
简单不容易11 分钟前
vue一次解决监听H5软键盘弹出和收起的兼容问题
javascript·vue.js
Oneslide16 分钟前
flex布局实现水平和垂直对齐
前端
滕青山18 分钟前
在线图片压缩工具核心JS实现
前端·javascript·vue.js
进击的尘埃19 分钟前
低代码组件通信:`EventBus`和响应式数据流,到底该选哪个
javascript
好事发生19 分钟前
Elpis-core 学习
前端
代码煮茶20 分钟前
Pinia 状态管理实战 | 从 0 到 1 搭建 Vue3 项目状态层(附模块化 / 持久化)
前端·vue.js