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

【safari】react在safari浏览器中,遇到异步时间差的问题,导致状态没有及时更新到state,引起传参错误。如何解决

在safari浏览器中,可能会遇到异步时间差的问题,导致状态没有及时更新到state,引起传参错误。

PS:由于useState是一个普通的函数, 定义为() => void;因此此处不能用await/async替代setTimeout,只能用在返回值为Promise时

有问题的代码:

我们可以看到,setTimeout只传0,这个时候在谷歌浏览器是有效果的,能确保顺序正确,但是在safari浏览器下,obj的值没有办法及时更新上state。

const columnsChange = ({ key, val }: { key: string | number; val: any }) => {const obj = {[key]: Array.isArray(val) && val?.length > 0 ? val : undefined};setFilters((f) => ({ ...f, ...obj }));setPagination({ pageNo: 1, pageSize: PAGE_SIZE });setTimeout(() => {run();}, 0);};

修改后的代码:

于是,我们尝试使用await/async去处理异步,但是由于setState是一个普通的函数, 定义为() => void;因此此处不能用await/async替代setTimeout,只能用在返回值为Promise时。因此不能这样做!

const columnsChange = async ({ key, val }: { key: string | number; val: any }) => {const obj = {[key]: Array.isArray(val) && val?.length > 0 ? val : undefined};// 由于setState是一个普通的函数, 定义为() => void;因此此处不能用await/async替代setTimeout,只能用在返回值为Promise时await setFilters((f) => ({ ...f, ...obj }));setPagination({ pageNo: 1, pageSize: PAGE_SIZE });run();};
验证:我们通过查看useState的定义,查看Dispatch、SetStateAction的定义,可以看到都是() => void或者返回泛型S(这意味着如果我们要变更的状态不是promise,也不适用await写法)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

正确的代码:

将异步时间微调大一些200ms

const columnsChange = ({ key, val }: { key: string | number; val: any }) => {const obj = {[key]: Array.isArray(val) && val?.length > 0 ? val : undefined};// 由于setState是一个普通的函数, 定义为() => void;因此此处不能用await/async替代setTimeout,只能用在返回值为Promise时setFilters((f) => ({ ...f, ...obj }));setPagination({ pageNo: 1, pageSize: PAGE_SIZE });setTimeout(() => {run();}, 200);};
http://www.lryc.cn/news/405009.html

相关文章:

  • 京准:GPS北斗卫星授时信号安全隔离防护装置
  • 解决方案架构师系列 - AWS - Pinpoint
  • MF173:将多个工作表转换成PDF文件
  • Docker、containerd、CRI-O 和 runc 之间的区别
  • PRISM-Python 中的规则一个简单的 Python 规则感应系统
  • DB-GPT:LLM应用的集大成者
  • 汉明权重(Hamming Weight)(统计数据中1的个数)VP-SWAR算法
  • 基于 PyTorch 的模型瘦身三部曲:量化、剪枝和蒸馏,让模型更短小精悍!
  • 二、原型模式
  • 【目标检测】Anaconda+PyTorch(GPU)+PyCharm(Yolo5)配置
  • Django实战项目之进销存数据分析报表——第二天:项目创建和 PyCharm 配置
  • 静态路由实验
  • VSCode STM32嵌入式开发插件记录
  • linux cpu 占用超100% 分析。
  • 自然学习法和科学学习法
  • 力扣第二十四题——两两交换链表中的节点
  • C语言柔性数组详解
  • 自动驾驶---视觉Transformer的应用
  • 预训练语言模型实践笔记
  • Perl 哈希
  • Linux之Mysql索引和优化
  • springboot业务逻辑写在controller层吗
  • Ubuntu 24.04 LTS 桌面安装MT4或MT5 (MetaTrader)教程
  • Go基础编程 - 12 -流程控制
  • 汽车信息安全--TLS,OpenSSL
  • 深入探索 SQL 中的 LIKE 右模糊匹配(LIKE RIGHT)与左模糊匹配(LIKE LEFT)
  • mybatis 多数据源 TDataSource required a single bean, but 2 were found
  • Dubbo SPI 之路由器
  • Python深度学习环境配置(Pytorch、CUDA、cuDNN),包括Anaconda搭配Pycharm的环境搭建以及基础使用教程(保姆级教程,适合小白、深度学习零基础入门)
  • 月影护眼大路灯怎么样?书客|月影|霍尼韦尔超硬核实力性能测评pk!