0

0

我对 use() 钩子的思考——深入探讨 React 的最新实验功能

聖光之護

聖光之護

发布时间:2024-11-22 08:29:00

|

594人浏览过

|

来源于dev.to

转载

我对 use() 钩子的思考——深入探讨 react 的最新实验功能

react 19 已经发布了,它带来了许多新功能,例如服务器组件、指令(使用客户端和使用服务器)、新钩子(例如 useoptimistic()、useformstatus() 和实验性 use()) hook,这就是我今天要讲的内容。

什么是 use() 挂钩?

use() 钩子是一项新功能,可让您直接在组件中处理 promise。它本质上是一种在组件内部解开 promise 并更简洁地处理异步数据的方法。

import { use } from 'react';
// example async function
async function fetchuserdetails(id) {
const response = await fetch(`localhost:3000/api/users/${id}`);
return response.json();
}
function userprofile({ id }) {
// use() will suspend the component while the promise resolves
const user = use(fetchuser(id));
return 
hello, {user.name}!
; }

use() 钩子代表了 react 处理异步数据方式的重大转变,使其更加直观并降低了管理异步状态的复杂性。

use() 钩子的主要特点:

  • promise 处理:use() 可以处理组件中任何级别的 promise。它会在等待 promise 解决时自动挂起组件,并且与 react 的 suspense 边界配合使用。

  • 错误处理更直观:

try {
const data = use(riskyoperation());
return ;
} catch (error) {
return ;
}
  • 资源缓存:react 自动缓存 use() 的结果 — 不会不必要地重新获取相同的 promise,从而以更少的代码行优化性能。

比较 use() 与 usestate() useeffect() 模式

假设我们有一个 api 获取函数来获取用户帖子,我们需要在应用程序中全局访问帖子。

// global api fetch function
async function fetchuserposts(userid: string) {
const response = await fetch(`/api/users/${userid}/posts`);
return response.json();
}

以下是如何在用户配置文件组件中获取帖子,并使用 usestate 挂钩和 useeffect 挂钩将其数据作为帖子状态传递,同时必须具有我们习惯的加载状态和错误状态。

// example 1: basic data fetching
// traditional approach using usestate and useeffect
function userprofilepost({ postid }: { postid: string }) {
const [post, setpost] = usestate(null);
const [isloading, setisloading] = usestate(true);
const [error, seterror] = usestate(null);

useeffect(() => {
setisloading(true);
seterror(null);
fetchuserposts(userid)
.then(data => {
setpost(data);
})
.catch(err => {
seterror(err);
})
.finally(() => {
setisloading(false);
});
}, [userid]);

if (isloading) return 
; if (error) return
; if (!post) return null; return (

{post.title}

{post.author}

); }

以下是我们如何使用 use() 钩子以更少的代码行完成同样的事情,消除了使用 usestate 和 useeffect 钩子来获取数据、加载状态和错误状态的需要,同时仍然实现资源缓存以改进表演。

// modern approach with use()
function userprofilepost{ postid }: { postid: string }) {
const post= use(fetchuserpost(postid));
return (
>
>

{post.title}

{post.author}

); }

现在让我们看另一个稍微复杂一点的示例。

// form submission with loading states
// traditional approach using usestate and useeffect
function submitformtraditional() {
const [issubmitting, setissubmitting] = usestate(false);
const [error, seterror] = usestate(null);
const [success, setsuccess] = usestate(false);

async function handlesubmit(formdata: formdata) {
setissubmitting(true);
seterror(null);
setsuccess(false);

try {
await fetch('localhost:3000/api/submit', {
method: 'post',
body: formdata
});
setsuccess(true);
} catch (err: any) {
seterror(err);
} finally {
setissubmitting(false);
}
}

return (
{ e.preventdefault(); handlesubmit(new formdata(e.currenttarget)); }}> {/* form fields */} {error &&
} {success &&
}
); }

下面是我们如何使用 use() 钩子做同样的事情。

Cutout.Pro抠图
Cutout.Pro抠图

AI批量抠图去背景

下载
// modern approach with use()
async function submitform(formdata: formdata) {
const response = await fetch('localhost:3000/api/submit', {
method: 'post',
body: formdata
});
return response.json();
}

function submitform() {
const [formstate, setformstate] = usestate | null>(null);
return (
{ e.preventdefault(); setformstate(submitform(new formdata(e.currenttarget))); }}> {/* form fields */} {formstate && ( submitting…
}> )} ); } function formresult({ promise }: { promise: promise }) { const result = use(promise); return
submitted successfully: {result.id}
; }

use() 钩子方法的主要区别和优点:

1. 简化的代码结构

还记得所有那些加载、错误和数据的状态变量吗?使用 use() 后,它们就消失了。您的组件变得更加简洁和直接。这不仅仅是编写更少的代码,而是编写更易于维护、可读的代码,以更好地表达您的意图。 use() 钩子消除了手动编排加载状态和错误处理的需要,减少了管理异步操作的认知开销。

2.更好的错误处理

分散的 try-catch 块和手动错误状态管理的日子已经一去不复返了。使用 use(),错误处理通过错误边界变得声明性:

errorboundary fallback={}>


此方法可确保整个应用程序中错误处理的一致性,并使错误恢复更加可预测和可管理。

3. 自动加载状态

还记得玩弄加载标志吗? use() 钩子与 suspense 结合,自动处理这个问题:

}>


这种加载状态的声明性方法可以更轻松地在应用程序中创建一致的加载体验。

结论

use() 钩子代表了 react 处理异步操作的重要一步。虽然它需要我们对应用程序的思考和结构进行一些调整,但更干净的代码、更好的错误处理和改进的加载状态的好处使其成为 react 工具包中引人注目的补充。

通过采用这种新模式,我们可以编写更可维护、更高性能的应用程序,并且减少样板文件和潜在错误。随着 react 生态系统继续围绕这个新范式发展,我们可以期待看到更强大的模式和实践的出现。

请记住,虽然 use() 挂钩可能看起来是一个巨大的变化,但它最终是为了让我们作为开发人员的生活更轻松,让我们的应用程序变得更好。无论您是开始一个新项目还是维护现有项目,理解和采用这种模式对于现代 react 开发都至关重要。

注意:我不建议在生产中使用它,因为它仍处于实验阶段,因此在未来的更新中正式采用 react 之前,我不会在生产中使用它,但它很适合用于个人项目。

您对 use() 挂钩有何看法?您开始在项目中使用它了吗?在下面的评论中分享您的经验和想法!

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
promise的用法
promise的用法

“promise” 是一种用于处理异步操作的编程概念,它可以用来表示一个异步操作的最终结果。Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。Promise的用法主要包括构造函数、实例方法(then、catch、finally)和状态转换。

306

2023.10.12

html文本框类型介绍
html文本框类型介绍

html文本框类型有单行文本框、密码文本框、数字文本框、日期文本框、时间文本框、文件上传文本框、多行文本框等等。详细介绍:1、单行文本框是最常见的文本框类型,用于接受单行文本输入,用户可以在文本框中输入任意文本,例如用户名、密码、电子邮件地址等;2、密码文本框用于接受密码输入,用户在输入密码时,文本框中的内容会被隐藏,以保护用户的隐私;3、数字文本框等等。

406

2023.10.12

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

63

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

70

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号