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

useOptimistic介绍和使用闭坑

1. useOptimistic 和 useState有啥区别吗?

useOptimistic 是 useState 在‌异步交互场景‌的强化扩展,它允许你在异步操作完成前,先更新 UI 状态,然后等待异步操作完成。通过乐观更新机制显著优化了异步交互体验。

useOptimistic 最佳场景‌:
网络延迟敏感的场景(点赞、收藏、评论、表单提交---常见于移动端),需要即时视觉反馈的 UI(如购物车增减)。使用时,需要搭配useState使用,可以将其视为是state属性的强化。

2. 给我来个useOptimistic的使用示例: 比如我要实现点赞功能, 通过promise settimeout resolve模拟接口请求, 你帮我写下代码。 我需要接口返回成功和返回失败的两种结果。

注意:必须要加上startTransition。否则乐观更新数只会快速抖动,数值不变,等接口返回结果之后才更新。

startTransition 的核心作用是为更新划分优先级,原理如下:

1. 更新优先级划分

startTransition(async () => {

addOptimisticLike(1); // 高优先级更新(同步执行)

await fetchUpdate(); // 低优先级更新(异步执行)

});

2. 渲染批次控制

更新类型

执行方式

渲染批次

乐观更新

同步触发

立即渲染

实际更新

异步队列

下一帧渲染

3. 异步更新隔离 :
通过 startTransition 包裹的异步流程会与乐观更新形成「渲染隔离」,这使得:

  • 用户点击后立即显示 addOptimisticLike(1) 的更新
  • 接口请求完成后 setLikes 的更新不会冲掉已显示的乐观状态
import { useOptimistic, useState, startTransition } from "react";const LikeButton = () => {const [likes, setLikes] = useState(0);const [optimisticLikes, addOptimisticLike] = useOptimistic(likes,(current, amount: any) => {return current + amount;});// 模拟点赞接口const likePost = async (): Promise<boolean> => {return new Promise((resolve) => {setTimeout(() => {// 随机模拟成功或失败const isSuccess = Math.random() > 0.1;resolve(isSuccess);}, 5000);});};const handleClick = async () => {// 开始显式过渡startTransition(async () => {// 立即触发乐观更新addOptimisticLike(1);try {const isSuccess = await likePost();if (!isSuccess) {addOptimisticLike(-1);alert("点赞失败,请重试");} else {// 如果成功,更新实际点赞数setLikes((prev) => {return prev + 1;});alert("点赞成功");}} catch (error) {console.error("请求失败:", error);addOptimisticLike(-1);}});};return (<div><button onClick={handleClick}>乐观点赞 ({optimisticLikes}){likes !== optimisticLikes && (<span style={{ color: "red", marginLeft: 8 }}>更新中...</span>)}</button><div style={{ marginTop: 20 }}><p>实际值: {likes}</p></div></div>);
};
export default LikeButton;

http://www.dtcms.com/a/293294.html

相关文章:

  • 机器学习/归一化
  • MS523NA非接触式读卡器 IC
  • 如何在 Windows 10 下部署多个 PHP 版本7.4,8.2
  • adb的使用
  • Java(Set接口和HashSet的分析)
  • SpringBoot全局异常报错处理和信息返回
  • 米家打印机驱动:Wi-Fi 无线打印丝滑顺畅不卡顿,从此告别对打印机干瞪眼
  • Java基础 7.22
  • 原型模式及优化
  • C++11相关知识点
  • 自动化测试报告生成【Allure】
  • Linux--指令初识
  • 一文读懂DQN改进算法(Double DQN+Dueling DQN)—强化学习(7)
  • Docker实战系列:使用Docker部署AI SSH客户端工具IntelliSSH
  • MCP消息协议和传输协议(Java角度)
  • 航班调度优化策略全局概览
  • TCP day39
  • 帆软实现审批流配置
  • C++ 模板库map数据结构的概念和使用案例
  • Rabbit安装
  • vben ruoyi 数据字典解决方案
  • 16.多生成树MSTP
  • Linux文件系统理解1
  • Selenium+Java 自动化测试入门到实践:从环境搭建到元素操作
  • ubuntu22.04 录视屏软件推荐
  • Three.js 实现梦幻星河流光粒子特效原理与实践
  • Redis 5.0中的 Stream是什么?
  • C语言(20250722)
  • 21. `taskSlotTable`和`jobLeaderService`启动
  • 使用空间数据训练机器学习模型的实用工作流程