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

React19 useOptimistic 用法

用法


乐观更新

  • 发起异步请求时,先假设请求会成功
  • 立即更新 UI 给用户反馈
  • 若请求最终失败,再将 UI 恢复到之前的状态

const [optimisticState, addOptimistic] = useOptimistic(state, updateFn)

参数
state:实际值,可以是 useStateuseReduceruseContextprops
updateFn:纯函数

  • currentState
  • optimisticValue

返回值
optimisticState:乐观值

  • 正常情况下:和 state 实际值一致
  • 调用 addOptimistic 后,是 updateFn 的返回值

addOptimistic:调用updateFn,接收任意类型的 optimisticValue


注意点

  1. 要在 form ActionstartTransition 里面调用 addOptimistic
  2. 异步操作结束(无论成功还是失败),乐观值都会自动恢复成 state
    异步操作成功,需要手动 setState 更新实际值,从而更新 useOptimisticstate
    异步操作失败,不用管

测试代码

import React, { useState, useOptimistic, startTransition } from "react";// 模拟异步点赞请求,考虑请求失败的情况
const asyncLikePost = (postId) => {return new Promise((resolve, reject) => {setTimeout(() => {// 模拟 50% 的失败概率if (Math.random() < 0.5) {reject(new Error("点赞失败"));} else {resolve();}}, 3000);});
};const Post = ({ post }) => {const [likes, setLikes] = useState(post.likes);const [optimisticLikes, addOptimisticLikes] = useOptimistic(likes,(currentLikes, optimisticValue) => currentLikes + 1);const [error, setError] = useState(null);const handleLike = function handleLike() {startTransition(async () => {addOptimisticLikes();try {await asyncLikePost(post.id);setLikes((prevLikes) => prevLikes + 1);setError(null);} catch (error) {setError(error.message);}});};return (<div><p>{post.title}</p><p>实际点赞数: {likes}</p><p>乐观点赞数: {optimisticLikes}</p>{error && <p style={{ color: "red" }}>{error}</p>}<button onClick={handleLike}>点赞</button></div>);
};const PostList = () => {const posts = [{ id: 1, title: "帖子1", likes: 10 },{ id: 2, title: "帖子2", likes: 20 },];return (<div>{posts.map((post) => (<Post key={post.id} post={post} />))}</div>);
};export default function App() {return (<div><h1>帖子列表</h1><PostList /></div>);
}
http://www.xdnf.cn/news/2432.html

相关文章:

  • 文字光影扫过动效
  • 1999-2022年各省研究与试验发展经费内部支出数据/研发经费内部支出数据/RD经费内部支出数据
  • 鸿蒙NEXT开发正则工具类(ArkTs)
  • Qt/C++开发监控GB28181系统/设备注册/设备注销/密码认证/心跳保活/校时
  • [MCU]SRAM
  • JVM指令手册:深入理解字节码执行机制
  • 图像生成新势力:GPT-Image-1 与 GPT-4o 在智创聚合 API 的较量
  • 大数据学习栈记——Hive4.0.1安装
  • 整合 | 大模型时代:微调技术在医疗智能问答矩阵的实战应用20250427
  • 正则表达式详解
  • π0.5:带开放世界泛化的视觉-语言-动作模型
  • C++学习:六个月从基础到就业——模板编程:模板特化
  • web字符转义
  • Maven概述
  • Leetcode837.新21点
  • GRS认证审核内容?GRS认证基本概述?GRS认证的好处?
  • 【应用密码学】实验二 分组密码(2)
  • 「浏览器即OS」:WebVM技术栈如何用Wasm字节码重构冯·诺依曼体系?
  • 革新桌面自动化:微软UFO²操作系统深度解析与未来展望
  • C++笔记-模板进阶和继承(上)
  • 最佳实践-HENGSHI SENSE 可视化创作中如何引入数据集市的成果
  • 企业数据赋能 | 应用模板分享:汽车销售仪表板
  • Ubuntu下MySQL的安装
  • 前端高频面试题day2
  • 【MySQL】表的CRUD
  • 第1讲、#PyTorch教学环境搭建与Tensor基础操作详解
  • 计算机网络学习笔记 4-6章
  • 量子网络:构建未来通信的超高速“高速公路”
  • css面板视觉高度
  • 爬虫技术入门:基本原理、数据抓取与动态页面处理