react18中如何实现同步的setState来实现所见即所得的效果

devtools/2024/10/22 13:25:17/

在react项目中,实现添加列表项,最后一项自动显示在可视区域范围!!

实现效果请添加图片描述

代码实现

import { useState, useRef } from "react";
import { flushSync } from "react-dom";
function FlushSyncRef() {const [msgLists, setMsgList] = useState([]);const [msg, setMsg] = useState("");const ulRef = useRef(null);const handleAdd = (e) => {e.preventDefault();setMsg("");setMsgList((prev) => {console.log(prev);return [...prev, msg];});ulRef.current.lastChild.scrollIntoView({behavior: "smooth",block: "end",});console.log("🚀 ~ handleAdd ~ ulRef.current:", ulRef.current.lastChild);};function handleChangeText(e) {setMsg(e.target.value);}return (<div><inputtype="text"placeholder="Enter your msg"value={msg}onChange={handleChangeText}/><button onClick={handleAdd}>添加</button><hr /><ulstyle={{ height: "90px", border: "1px solid red", overflow: "auto" }}ref={ulRef}>{msgLists.map((item, index) => {return (<li key={index}>这是第{index}{item}</li>);})}</ul></div>);
}export default FlushSyncRef;

测试发现,组件崩溃了!!!!!

在这里插入图片描述
意思就是没有找到要滚动的元素,元素为null,上面不存在这个scroll方法。
在默认数据改造下
请添加图片描述
可以发现,最后一项始终慢了一步,不能同步的显示到可视区域。
为啥为这样呢?

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

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

  • 修复后的代码
const [msgLists, setMsgList] = useState(["test0000"]);
// ....
const handleAdd = (e) => {e.preventDefault();flushSync(() => {setMsg("");setMsgList((prev) => {console.log(prev);return [...prev, msg];});});ulRef.current?.lastChild?.scrollIntoView({behavior: "smooth",block: "end",});console.log("🚀 ~ handleAdd ~ ulRef.current:", ulRef.current.lastChild);};// ....

这样,再测试就实现了我们的需求了。


http://www.ppmy.cn/devtools/127844.html

相关文章

怎么快速定位bug?怎么编写测试用例?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 作为一名测试人员如果连常见的系统问题都不知道如何分析&#xff0c;频繁将前端人员问题指派给后端人员&#xff0c;后端人员问题指派给前端人员&#xff0c;那么在…

【Linux系列】在 Linux 中使用 `watch` 命令监控 Docker 容器状态

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

图纸管理软件哪个好用?三品图纸管理系统怎么样?

在现代企业与机构中&#xff0c;图纸管理是一项至关重要的任务。传统纸质图纸容易丢失、破损&#xff0c;并且难以进行高效的版本控制和协作。随着数字化技术的不断进步&#xff0c;图纸管理软件已成为企业提高管理效率、确保数据安全的关键工具。然而&#xff0c;市场上的图纸…

(六) 进程控制

(六) 进程控制 ps(1) 命令可以帮助我们分析本章中的一些示例&#xff0c;所以简单介绍一些参数的组合方式&#xff0c;更详细的信息请查阅 man 手册。 ps axf 主要用于查看当前系统中进程的 PID 以及执行终端(tty)和状态等信息&#xff0c;更重要的是它能显示出进程的父子关系…

掌握Go语言`runtime`包:性能优化与实战指南

掌握Go语言runtime包&#xff1a;性能优化与实战指南 引言第一部分&#xff1a;初识runtime包runtime包概述runtime包的核心功能 第二部分&#xff1a;常用功能详解Goroutine管理runtime.Goexitruntime.Goschedruntime.NumGoroutine 内存管理runtime.MemStatsruntime.GC 系统信…

python 爬虫 入门 四、线程,进程,协程

线程和进程大部分人估计都知道&#xff0c;但协程就不一定了。 一、进程 进程是操作系统分配资源和调度的基本单位&#xff0c;一个程序开始运行时&#xff0c;操作系统会给他分配一块独立的内存空间并分配一个PCB作为唯一标识。初始化内存空间后进程进入就绪态&#xff0c;PC…

关于Qt中进行输出的方式及对比分析

本文详细介绍了在Qt框架和C标准库中可用的多种输出流方式&#xff0c;主要分为标准C输出和Qt输出两大类。 摘要 标准C输出 std::cout&#xff1a;用于标准输出&#xff0c;支持多种数据类型&#xff0c;是C最常用的输出流。结合std::string、QString&#xff08;需转换&#…

迅为RK3562开发板/核心板240PIN引脚全部引出,产品升级自如

可应用于人脸跟踪、身体跟踪、视频监控、自动语音识别(ASR)、图像分类驾驶员辅助系统(ADAS)、车牌识别、物体识别等。 iTOP-3562开发板/核心板采用瑞芯微RK3562处理器&#xff0c;内部集成了四核A53Mali G52架构&#xff0c;主频2GHZ&#xff0c;内置1TOPSNPU算力&#xff0c;R…