当前位置: 首页 > news >正文

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

在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.lryc.cn/news/466734.html

相关文章:

  • 深入理解MVP架构模式
  • Java面试题七
  • linux网络编程3——http服务器的实现和性能测试
  • Docker部署Kamailio,并使用LinPhone实现网络通话
  • JAVA-石头迷阵小游戏
  • 鸿蒙--进度条通知
  • 搜维尔科技:varjo xr-4开箱测评,工业用途头显,一流视觉保真度
  • mysql数据量分库分表
  • Vite创建Vue3项目以及Vue3相关基础知识
  • Elasticsearch封装公共索引增删改查
  • Python异常检测:Isolation Forest与局部异常因子(LOF)详解
  • Git的原理和使用(二)
  • docker 发布镜像
  • 投了15亿美元,芯片创新公司Ampere为何成了Oracle真爱?
  • vue 报告标题时间来自 elementUI的 el-date-picker 有开始时间和结束时间
  • 简单几何问题的通解
  • DBeaver导出数据表结构和数据,导入到另一个环境数据库进行数据更新
  • 【Golang】合理运用泛型,简化开发流程
  • OpenCV单目相机内参标定C++
  • 基于MATLAB(DCT DWT)
  • 渗透基础-rcube_webmail版本探测
  • linux下编译鸿蒙版boost库
  • 滚雪球学Redis[6.3讲]:Redis分布式锁的实战指南:从基础到Redlock算法
  • springboot二手汽车交易平台-计算机毕业设计源码82053
  • typescript 中的类型推断
  • linux 隐藏文件
  • 【网络协议栈】Tcp协议(上)结构的解析 和 Tcp中的滑动窗口(32位确认序号、32位序号、4位首部长度、6位标记位、16为窗口大小、16位紧急指针)
  • 手表玻璃盖板视觉贴合
  • 电信和互联网行业数据安全评估师CCRC-DSA人才强基计划
  • MQTTnet 4.3.7.1207 (最新版)使用体验,做成在线客服聊天功能,实现Cefsharp的物联的功能(如远程打开新网址)