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

news2024/10/19 8:53:43

在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>
      <input
        type="text"
        placeholder="Enter your msg"
        value={msg}
        onChange={handleChangeText}
      />
      <button onClick={handleAdd}>添加</button>
      <hr />
      <ul
        style={{ 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.coloradmin.cn/o/2217480.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL面试专题-索引

一、MySQL为什么要选择B树来存储索引&#xff1f; MySQL的索引选择B树作为数据结构来进行存储&#xff0c;其本质原因在于可以减少IO次数&#xff0c;提高查询效率&#xff0c;简单来说就是保证在树的高度不变的情况下可以存储更多的数据。 &#xff08;一&#xff09;IO角度 在…

【状态机DP】【记忆化搜索及翻译递推】【空间优化】力扣3290. 最高乘法得分

给你一个大小为 4 的整数数组 a 和一个大小 至少为 4 的整数数组 b。 你需要从数组 b 中选择四个下标 i0, i1, i2, 和 i3&#xff0c;并满足 i0 < i1 < i2 < i3。你的得分将是 a[0] * b[i0] a[1] * b[i1] a[2] * b[i2] a[3] * b[i3] 的值。 返回你能够获得的 最大…

Chromium form表单post提交过程分析c++

form表单get提交参考之前文章Chromium 前端form表单提交过程分析c-CSDN博客 一、表单post提交测试例子&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head&…

【C++11】可变模板参数详解

个人主页&#xff1a;chian-ocean 文章专栏 C 可变模板参数详解 1. 引言 C模板是现代C编程中一个非常强大且灵活的工具。在C11标准中&#xff0c;引入了可变模板参数&#xff08;variadic templates&#xff09;&#xff0c;它为模板编程带来了革命性改变。它的出现允许我们…

第五课:Python学习之if语句

判断&#xff08;if&#xff09;语句 目标 开发中的应用场景if 语句体验if 语句进阶综合应用 01. 开发中的应用场景 生活中的判断几乎是无所不在的&#xff0c;我们每天都在做各种各样的选择&#xff0c;如果这样&#xff1f;如果那样&#xff1f;…… 程序中的判断 # 定义…

faust,一个神奇的 Python 库!

大家好&#xff0c;今天为大家分享一个神奇的 Python 库 - faust。 Github地址&#xff1a;https://github.com/robinhood/faust 在分布式系统和实时数据处理的世界里&#xff0c;消息流处理&#xff08;Stream Processing&#xff09;变得越来越重要。Faust 是一个 Python 库…

Linux 命令:每日一学,一文说尽打包压缩工具实践

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 文章目录&#xff1a; 0x00 前言简述 前面&#xff0c;我们介绍了Linux中文件查找find命令以及与之联用最勤的xargs命令&#xff0c;作者以一个个简单的实例给各位看友展示了在运维中两个命令的使…

智慧供排水管网在线监测为城市安全保驾护航

一、方案背景 随着城市化进程的不断推进&#xff0c;城市供排水管网作为城市基础设施的关键组成部分&#xff0c;其安全稳定的运行对于确保城市居民的日常生活、工业生产活动以及整个生态环境的健康具有至关重要的作用。近年来&#xff0c;由于各种原因&#xff0c;城市供排水管…

Python基础:16、Python数据容器

1&#xff09;数据容器入门 一种可以存储多个元素的Python数据类型 数据容器&#xff1a;一种可以存储多个元素的Python数据类型数据容器包括&#xff1a;list&#xff08;列表&#xff09;、tuple&#xff08;元组&#xff09;、str&#xff08;字符串&#xff09;、set&…

k8s的安装与部署

一、部署 1、实验环境 k8s-master172.25.254.200k8s-node1172.25.254.10k8s-node2172.25.254.20docker-node1 172.25.254.100(harbor仓库&#xff09; 2、相关操作 1.基础配置 所有节点关闭selinux和防火墙 systemctl disabled firewalld systemctl stop firewalld grubb…

商贸物流产业大脑:打造“产-供-销,仓-运-配”全流程供应链

商贸物流产业大脑&#xff1a;打造“产-供-销&#xff0c;仓-运-配”全流程供应链 在全球化竞争日益激烈的今天&#xff0c;商贸物流产业的效率和创新力成为企业能否脱颖而出的关键因素。然而&#xff0c;信息不对称、资源配套不准确、系统独立运作等痛点严重阻碍了商贸物流产…

# LangGraph 入门(二)- ChatBot demo

在这个快速入门 demo 中&#xff0c;我们将会使用 langGraph 构建一个基本的对话机器人和可是使用网络搜索的机器人。通过这个 demo 我们来快速对 langgraph 有一定感知。 概念补充 顾名思义langGraph是基于图&#xff08;Graph Theory&#xff09;的&#xff0c;如果你学过图…

【算法】约瑟夫环问题

据说著名的犹太历史学家Josephus有过以下故事&#xff0c; 罗马人占领乔塔帕特&#xff0c; 39个犹太人与Josephus和他的朋友躲在洞中&#xff0c;其中39个犹太人决定自杀&#xff0c; &#xff0c;他们的自杀方式是41个人绕成一圈&#xff0c;第一个人报数1&#xff0c;报数到…

RK3588的demo板学习

表层的线宽是3.8mil: 换层之后线宽变成了4.2mil: (说明对于一根线&#xff0c;不同层线宽不同) 经典&#xff1a; 开窗加锡&#xff0c;增强散热&#xff0c;扩大电流&#xff1a; R14的作用&#xff1a;与LDO进行分压&#xff0c;降低LDOP的压差从而减小其散热&#xff1a;第…

如何系统的从0到1学习大模型?有哪些书籍推荐?

大模型应用得好&#xff0c;不仅需要海量的基础数据、大规模算力、综合人工智能发展成果的技术&#xff0c;还需要政产学研用各方的共同推进。 大模型不仅能生成结果、生成数据&#xff0c;更能传递价值观。应用于我国的大模型需要懂中文、懂中国文化、懂中国国情。大模型是全…

【Linux系统编程】环境基础开发工具使用

目录 1、Linux软件包管理器yum 1.1 什么是软件包 1.2 安装软件 1.3 查看软件包 1.4 卸载软件 2、Linux编辑器-vim 2.1 vim的概念 2.2 vim的基本操作 2.3 vim的配置 3、Linux编译器-gcc/g 3.1 gcc编译的过程​编辑​编辑​编辑 3.2 详解链接 动态链接 静态链接 4…

纯HTML实现标签页切换

纯HTML实现标签页切换 实现原理&#xff1a; HTML结构&#xff1a; 使用无序列表&#xff08;<ul>&#xff09;创建标签导航。每个标签是一个列表项&#xff08;<li>&#xff09;&#xff0c;包含一个链接&#xff08;<a>&#xff09;。每个链接指向对应的内…

商品计划:零售企业的痛点破解与运营优化指南

在现代零售业的激烈竞争中&#xff0c;商品计划不仅是企业盈利的关键&#xff0c;更是解决众多痛点的有效途径。零售企业在运营过程中常常面临各种挑战&#xff0c;如财务问题、库存管理、市场分析等。而科学、系统的商品计划可以帮助企业有效应对这些挑战&#xff0c;提升整体…

气膜:冰雪产业的创新解决方案—轻空间

随着冰雪运动的普及和发展&#xff0c;如何在不同季节和地区有效开展冰雪项目&#xff0c;成为了行业内的一个重要课题。气膜作为一种新兴的建筑形式&#xff0c;凭借其独特的优势&#xff0c;正在逐渐成为冰雪产业的创新解决方案。 优越的建筑特性 气膜建筑以其轻便、快速搭建…

Web Storage:数据储存机制

前言 在HTML5之前&#xff0c;开发人员一般是通过使用Cookie在客户端保存一些简单的信息的。在HTML5发布后&#xff0c;提供了一种新的客户端本地保存数据的方法&#xff0c;那就是Web Storage&#xff0c;它也被分为&#xff1a;LocalStorage和SessionStorage&#xff0c;它允…