React中 useState在合成事件中是异步的,怎么获取到useState 设置后的最新值,或者说setState中获取到最新值

2023-11-02

useState 在合成事件中是异步的

合成时间是什么呢

合成事件: 简单来说 比如onClick,或者 onChange 或者说是 Input之类的事件

所以一个情景是这样的

当你在onClick 中这样设置了状态,并赋值上去,但是打印的值是上一次的值。

附代码一份

function App() {
  const [state, setstate]: {} = useState(0);
  const count: number = 0;

  const setT = () => {
    setstate(++count);
    console.log(state)
  };

  return (
    <div>
        <button onClick={setT}>点击+1</button>
	</div>
  );
}

这时候打印出来的state 是0 并不是1

怎么解决呢

我这里使用自定义Hooks 来解决,实现方式是这样

function App() {
  const [state, setstate]: {} = useState(0);
  const count: number = 0;

  // 自定义hooks
  const useSyncCallback = callback => {
    const [proxyState, setProxyState] = useState({ current: false });

    const Func = useCallback(() => {
      setProxyState({ current: true });
    }, [proxyState]);

    useEffect(() => {
      if (proxyState.current === true) {
        setProxyState({ current: false });
      }
    }, [proxyState]);

    useEffect(() => {
      proxyState.current && callback();
    });
    return Func;
  };
  
  const func = useSyncCallback(() => {
    console.log(state);
  });

  const setT = () => {
    setstate(++count);
    func()
  };

  return (
    <div>
        <button onClick={setT}>点击+1</button>
	</div>
  );
}

今天是2022年1月31日补充

function App() {
  const [state, setstate]: {} = useState(0);
  const count: number = 0;

  const setT = () => {
    setstate(++count);
    console.log(state, '这里是SetT'); // 这里打印出来的是旧值,获取不到最新的
  };
useEffect(() => {
	console.log(state, '最新的state'); // 这里便能够打印最新的state
}, [state])

  return (
    <div>
        <button onClick={setT}>点击+1</button>
	</div>
  );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React中 useState在合成事件中是异步的,怎么获取到useState 设置后的最新值,或者说setState中获取到最新值 的相关文章

  • 非常基本的 JS 编码,是否有 SoundManager2?

    我想在我的网站上包含一个具有以下属性的音频 可能的视频播放器 必须可通过 div 通过 CSS 设计样式 可以读取所有ID3信息 可以从数据库中提取文件 可能是 GoDaddy 的 Easy Database 无闪光 可转移至智能手机等 我
  • ScrollTop 在 Chrome/Safari 中不起作用

    我的网站上有一个循环内的表单 当有人提交表单时 查询字符串会添加到 URL 中 例如 updated 111 然后 我的 JQuery 脚本检查数字的 url 并在提交表单并重新加载页面后滚动到该 div 该脚本在 Firefox 中运行良
  • 如果Functions是javascript中的对象,为什么function.constructor指向Function而不是Object?

    当像这样从窗口对象创建以下函数时 function userInfo 既然函数是对象 为什么 userInfo constructor 显示 Function 而不是 Object 当使用以下内容时 它甚至显示函数而不是对象 Functio
  • 如何使用 Underscore 获取 JavaScript 数组中的重复项

    我有一个数组 我需要重复的项目并根据特定属性打印这些项目 我知道如何使用 underscore js 获取唯一项目 但我需要找到重复项而不是唯一值 var somevalue name john country spain name jan
  • 如何根据另一个动态下拉列表的值创建动态下拉列表?

    我有一个下拉菜单 当我选择一个选项时 它会创建一个动态下拉菜单 到目前为止 一切都很好 但我想创建另一个动态下拉列表 现在基于另一个动态下拉列表的值 我该怎么做 第一个动态下拉列表有效 我猜第二个无效 因为动态变量 div 没有静态 ID
  • 为什么我的箭头函数有原型属性?

    正如文档中提到的https developer mozilla org en docs Web JavaScript Reference Functions Arrow functions https developer mozilla o
  • 如何使用 console.log 省略文件/行号

    如今 您可以在 Chrome 的控制台中编写非常好的东西 查看this https developer chrome com devtools docs tips and tricks关联 我也做了一个截图 正如您在屏幕截图中看到的那样 文
  • 如何在Javascript中声明静态变量[重复]

    这个问题在这里已经有答案了 在下面的代码中 我希望有一个计数器来跟踪创建的 Person 对象的数量 这段代码没有这样做 我该如何实现呢 function Person this name Peter this counter this c
  • Chart.js - 如何将数组集合推入数据集

    我一直在尝试多种方法将数组集合推送到数据集中 任何人都可以帮助我根据下面的代码将数组推入堆积图表中 这是例子 Codepen 堆叠栏 https codepen io narendrajadhav pen abzpWam JavaScrip
  • 将其作为参数传递给 addEventListener()

    我想添加change一组复选框的事件 我如何访问this在我的事件函数中 这样当我执行事件时我可以访问复选框的值 这是我当前的代码 var checkboxes document getElementsByClassName cb Arra
  • 按日期对 JSON 进行排序

    我知道这一定相对简单 但我有一个 JSON 数据集 我想按日期排序 到目前为止 我每次都会遇到问题 现在我将日期存储为this lastUpdated 如果有帮助的话 我可以访问 jquery 但我意识到 sort 是本机 JS 提前致谢
  • 内联执行生成的汇编程序

    我正在阅读以下演示文稿 http wingolog org pub qc 2012 js slides pdf http wingolog org pub qc 2012 js slides pdf其中讨论了 4 10 19 内联 ASM
  • 如何垂直打印数组中的字符串元素? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个数组 我想垂直打印每个元素 例如 myArr abc def ghi 输出应该是 a d g b e h c f
  • 'DOMException:使用'option:selected'选择器时无法在'Element'上执行'querySelectorAll'

    我正在运行一个页面 该页面在以下行中引发错误 var label select find option selected html select find option first html 为了完整起见 这里是完整的 jQuery 函数
  • 谷歌浏览器如何启动桌面应用程序?

    我真的不知道术语 所以我将从一个例子开始 如果我点击磁力链接 Google Chrome 会询问我是否要启动 torrent 客户端 我单击 确定 chrome 启动该应用程序 该应用程序根据链接执行一些操作 现在有办法查看应用程序如何从
  • 如何在 Next.js 中正确使用 Mongoose 模型?

    我正在使用 TypeScript 和 MongoDB Mongoose 构建 Next js 应用程序 我在使用 Mongoose 模型时开始遇到错误 这导致它们在每次使用模型时都尝试覆盖模型 导致模型覆盖错误的代码 import mong
  • 调用不带括号的 javascript 函数

    以下 renderChat 函数用于将消息和图像渲染到聊天板上 该函数内部还有另一个函数 var onComplete function 它完成创建列表元素并将其附加到聊天列表的所有工作 onComplete函数之后就只有这三行代码 img
  • Bootstrap 3 - 模态背景不会根据模态对话框的高度调整大小?

    我将一个表单放入模式中 并尝试在用户触发单选按钮时显示表单的一些隐藏字段 显示隐藏字段后 模态自动重新缩放的高度 但模态背景的高度不能用作模态对话框 我该如何解决它 div class modal fade div class modal
  • 限制线的长度

    我正在尝试画一条代表 弹弓 的线 并且希望它具有最大拉伸长度 在 p5 中 我在位置和位置之间画了一条线 line posA x posA y posB x posB y posA 是鼠标 x 和 y posB 是画布上圆的位置 我想要做的
  • 如何使用react-router将this.state和this.props传递给路由

    我不知道如何从我的父 ReactJS 组件访问方法post路线和组件 使用react router 这是在

随机推荐

  • Web Workers API

    Web Workers API 一个worker是使用一个构造函数创建的一个对象 e g Worker 运行一个命名的JavaScript文件 这个文件包含将在工作线程中运行的代码 workers 运行在另一个全局上下文中 不同于当前的wi
  • 常见损失函数 & 损失函数选择方法

    文章目录 0 定义 1 均方误差 2 交叉熵误差 3 mini batch中的损失函数 4 损失函数选择方法 神经网络的学习通过某个指标表示现在的状态 然后以这个指标为基准 寻找最优权重参数 这个指标就是损失函数 loss function
  • STM32(一)STM32简介

    大家好 今天我跟大家分享一下学习STM32的一些收获 希望对初学STM32的同学有所启示 当然 本人也是一名初学者 如果有谈论不妥之处 还望您能够批评指正 不吝赐教 本人将非常感激 如果有什么问题 欢迎您到http www openedv
  • 若依ruoyi 数据库字段驼峰命名 生成代码全部被转换为了小写

    vue前后端分离版 ruoyi common模块 com ruoyi common utils StringUtils 类的toCamelCase 对不包含下划线的字段不做处理 如果原字段不包含下划线 则返回原字段 不做后续处理 if s
  • jupyter notebook 配置虚拟环境(非conda)

    预先准备工作 创建虚拟环境 如 nlp 终端执行 python m ipykernel install user name 虚拟环境名 nlp display name Jupyter中要显示的名字 nlp 修改文件 Users admin
  • mysql 数据类型 (最大值 和 最小值)

    https blog csdn net zh521zh article details 51190365 utm source blogxgwz8 1 整型 MySQL数据类型 含义 有符号 tinyint m 1个字节 范围 128 12
  • C++_从流(stream)向文件保存多个数组的元素

    本文的目的是为了介绍如何将多个具有相同结构的数组元素 保存进一个txt文件中 float x 50 一大堆元素 float y 50 一大堆元素 float Z 50 一大堆元素 float w 50 一大堆元素 此处我想把几组数组内的值
  • GPSD如何设置固定波特率

    Gpsd设置固定波特率 修改 etc init d gpsd 支持 etc init d gpsd start stop restart bin sh BEGIN INIT INFO Provides gpsd Required Start
  • 【项目实战】基于Python实现时间序列分析建模(ARIMA模型)项目实战

    说明 这是一个机器学习实战项目 附带数据 代码 文档 代码讲解 如需数据 代码 文档 代码讲解可以直接到文章最后获取 1 项目背景 当今世界正处于一个数据信息时代 随着后续互联网的发展各行各业都会产生越来越多的数据 包括不限于商店 超市 便
  • 电子科技大学人工智能期末复习笔记(四):概率与贝叶斯网络

    目录 前言 概率 概率公式 贝叶斯公式 链式条件概率 例题 1 求联合概率分布 边缘概率分布 条件概率分布 2 灵活运用贝叶斯公式 概率总结 贝叶斯网络 判断独立性 两个事件独立的判断 条件独立性的判断 假设条件独立的链式法则 Active
  • RMAN删除过期的归档日志

    用rman进入把归档日志删除 1 命令 gt rman target 2 命令 gt crosscheck archivelog all 3 命令 gt delete expired archivelog all 4 命令 gt exit
  • 【LeetCode算法系列题解】第31~35题

    CONTENTS LeetCode 31 下一个排列 中等 LeetCode 32 最长有效括号 困难 LeetCode 33 搜索旋转排序数组 中等 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置 中等 LeetCod
  • 代理IP与Socks5代理:跨界电商战略的数据智慧与隐私守护

    一 代理IP 跨界电商战略的数据引擎 多地区数据采集 跨界电商需要获取各地区的市场数据和竞争情报 代理IP允许模拟不同地区的IP地址 轻松实现多地区数据采集 为决策提供多维度的数据支持 规避反爬虫机制 代理IP的IP轮换能够规避网站的反爬虫
  • 如何在eclipse开发平台上运行静态网页

    1 先打开eclipse 新建一个Static Web Project工程 如下图 2 在此工程目录下的WebContent中建一个index html文件 此文件必须是index命名 因为服务器会自动寻找工程的主页 不然会出现下图 3 在
  • 正则应用之——日期正则表达式

    1 概述 首先需要说明的一点 无论是Winform 还是Webform 都有很成熟的日历控件 无论从易用性还是可扩展性上看 日期的选择和校验还是用日历控件来实现比较好 前几天在CSDN多个版块看到需要日期正则的帖子 所以整理了这篇文章 和大
  • 魔幻矩阵全解(有全部代码说明)

    无意间看到了关于魔幻矩阵的一篇博客 感觉挺有意思的 于是便编程分别实现了三种魔幻矩阵的c程序 下面是关于魔幻矩阵的一篇很详细的解释说明 看代码之前 务必先去了解了解 http blog csdn net northwolves articl
  • 二叉树前中后层次遍历,递归实现

    文章目录 前序遍历 代码 Python 代码 C 中序遍历 代码 Python 代码 C 后序遍历 代码 Python 代码 C 层序遍历 代码 Python 代码 C 反向层序遍历 代码 Python 代码 C 总结 前序遍历 题目链接
  • Go 字符串

    Go 字符串 01 Go 字符串简介 02 Go 支持的字面值 1 解释字符串 2 非解释字符串 03 Go 字符串常用操作 1 strings 包 1 判断字符串的前缀和后缀 2 判断字符串的包含关系 3 判断子串出现的位置 索引 3 字
  • 通过 docker-compose 快速部署 DolphinScheduler 保姆级教程

    文章目录 一 概述 二 前期准备 1 部署 docker 2 部署 docker compose 三 安装 MySQL 数据库 四 安装注册中心 Zookeeper 五 Apache DolphinScheduler 编排部署 1 下载 D
  • React中 useState在合成事件中是异步的,怎么获取到useState 设置后的最新值,或者说setState中获取到最新值

    useState 在合成事件中是异步的 合成时间是什么呢 合成事件 简单来说 比如onClick 或者 onChange 或者说是 Input之类的事件 所以一个情景是这样的 当你在onClick 中这样设置了状态 并赋值上去 但是打印的值