React Hooks 核心原理与实战
王沛
eBay 中国研发中心资深技术专家
10740 人已学习
新⼈⾸单¥59
登录后,你可以任选2讲全文学习
课程目录
已完结/共 25 讲
React Hooks 核心原理与实战
15
15
1.0x
00:00/00:00
登录|注册

09|异步处理:如何向服务器端发送请求?

你好,我是王沛。这节课我们来学习如何在 React Hooks 中处理 Rest API 请求。
我遇到很多 React 的初学者,刚把 Hello World 跑起来,问的第一个问题就是:我该怎么发请求拿数据呢?
可见,这是最为常见也是最为重要的一个需求。毕竟 90% 以上的前端 App 都是和服务器端打交道,然后通过各种 API 完成各种功能。
虽然发请求拿数据有很多做法,但基本上都会遵循一定的规律,而这正是咱们这节课要介绍的内容。
其实在第一讲,我们就已经看到了异步请求的一个实例,当时我们在一个组件内直接发起了一个请求,并处理了返回结果。但这个简单的例子只是演示了组件中发请求的基本流程,在实际的项目中我们很少会直接这么写,因为还需要考虑更多的逻辑
比如说,如何给所有请求都带上一个 Token 供服务器端验证?如何发起并发请求?等等。此外,咱们整个课程都是从 Hooks 角度去思考问题,那么 Hooks 又能给异步逻辑处理带来怎样的优化?这些都是接下来要具体介绍的内容。

实现自己的 API Client

无论大小项目,在开始实现第一个请求的时候,通常我们要做的第一件事应该都是创建一个自己的 API Client,之后所有的请求都通过这个 Client 发出去。而不是上来就用 fetch 或者是 axios 去直接发起请求,因为那会造成大量的重复代码。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

React Hooks中处理Rest API请求的方法是本文的主题。作者首先强调了创建自己的API Client的重要性,并提供了使用axios创建API Client的示例。文章讨论了如何使用Hooks思考异步请求,将远程资源封装成Hooks,使得使用远程API变得非常方便。作者展示了如何将获取文章的API封装成一个远程资源Hook,并在使用时展示了如何将数据映射到JSX并显示出来。最后,作者解释了为什么要给每个请求定义一个Hook,以及如何保证每个Hook足够简单和清晰。通过具体的代码示例和解释,读者可以了解在React Hooks中处理Rest API请求的方法,以及如何使用Hooks思考异步请求的优势。文章还探讨了如何从Hooks的角度组织异步请求,定义API Client,利用Hooks让数据源变得可绑定,并利用状态的组合变化来实现并发和串行请求。这篇文章对于想要深入了解React Hooks中处理Rest API请求的读者来说是一份有价值的技术指南。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《React Hooks 核心原理与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(26)

  • 最新
  • 精选
  • 李亚方
    置顶
    const useClick = (id) => { const [data, setData] = useState(null); const [loading, setLoading] = useState(null); const [error, setError] = useState(null); const exeFun = useCallback(() => { setLoading(true); setData(null); setError(null); apiClient .get(`/posts/${id}`) .then((res) => { setLoading(false) setData(res.data) }) .catch((err) => { setLoading(false) setError(err); }) }, []); return { exeFun, data, loading, error } } const { exeFun, data:comm } = useClick(1); <button onClick={()=>{exeFun("1")}}>点击发送请求</button> 按照老师之前写的逻辑,用这种方式也可以点击按钮后去发送请求获取数据
    2021-06-27
    1
    11
  • Isaac
    置顶
    思考题: 1. useArticle Hook 可以提供一个参数,用来标记本地调用是否默认触发副作用去获取数据;对于点击按钮才触发请求的功能,可以在 Hook 中将获取数据的方法 retrn 出去,供外部自由调用。 2. 可以借助 redux,配合 useContext 等 api ,将状态数据存储至全局中。
    2021-06-15
    1
    10
  • 江谢木
    老师,article?.userId和article&&article.userId的作用是一样的?第一次见这种写法,感觉好简洁

    作者回复: 这是新的 js 的标准 叫做 optional chaining:https://github.com/tc39/proposal-optional-chaining ,目前已经到 stage 4 完成状态。 在处理 article 可能是 undefine的 的情况时,两者是等价的。但如果 article 还可能是 0,false,null 这样的 falsy 的值时,两者的返回值会不一样。article && article.userId 返回 0, false 或者 null,而 article?.userId 返回 undefined。 所以一般情况下,我们都可以用 ?. 来简化一些条件判断。

    2021-06-20
    4
    8
  • 1830
    老师,关于串行请求我有些想法,对于多个串行请求它们在逻辑上本身具有连续性,而我们强行把它们分散到单个的hook中是不是加大了代码复杂程度和日后逻辑的理解难度。就是感觉有点重hook的语法形式而忽律了原本的关联性

    作者回复: 这里倒没有“强行”,例子中的 article 和 user 是两个不同的数据源,所以根据状态分别获取应该比较容易理解。如果两个请求总是在一起使用,那么其实可以封装成一个方法去获取两个请求,这样在使用的时候就等价于一个异步请求了。

    2021-07-29
  • 🌵小畅叙
    老师,对于 loading 和错误处理,我们项目是在全局处理的,且 loading 是通过 redux 管理的,想咨询一下,跟您的方法相比,应该用哪种方法呢?
    2021-06-17
    4
  • L
    1. hooks提供一个函数出来用来主动调用 2. redux或者context等内容,对接口调用进行一次改造,先判断是否有缓存,再来决定是否调用接口
    2021-06-15
    4
  • Free fall
    const defaultResult = { error: null, data: null, loading: false, } const useArticle = ({ id, isAutoFetch = true }) => { const [result, setResult] = useState(defaultResult) const fetch = (id) => { apiClient .get(`/posts/${id}`) .then((res) => { setResult({ ...defaultResult, loading: false, data: res.data }) }) .catch((err) => { setResult({ ...defaultResult, loading: false, error: err }) }) } useEffect(() => { if (!id) return if (!isAutoFetch) return setResult({ ...defaultResult, loading: true }) fetch(id) }, [id, isAutoFetch]) return isAutoFetch ? result : { ...result, fetch } }
    2021-06-15
    3
  • INFRA_UEX
    React 18 应该是不推荐使用 useEffect 加载 sync 的数据源了。应该是使用 useSyncExternalStore。
    2022-11-07归属地:天津
    2
  • 花儿与少年
    老师能讲解下思考题吗
    2021-08-07
    2
  • 琪琪
    老师,请问需要封装一个需要发送post请求的自定义hooks应该如何封装呢?
    2021-06-17
    2
收起评论
显示
设置
留言
26
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部