hello,我是海海
这一期我们继续
ahooks之旅。阅读时间5分钟。由于
ahooks内容比较多,我将拆分成几个章节,本期我们开始讲解历经数次迭代的useRequest,由于useRquest比较复杂,会适当分成几个章节讲述不同于其他介绍
ahooks的文章,本系列会对每一个hook从what(是什么)、how(怎么用)、why(实现原理)、when(啥时候用)做全方面的讲解。欢迎转载,请注明原文和作者
有任何不对的地方,欢迎底部发消息给我。
前文链接: 第三期:ahooks全讲解-Part1
本期大纲:
- 前言:整体看看useRequest
- useRequest的核心能力
- PART-1:核心属性的实现
前言:整体看看useRequest
useRequest使用起来确实是一个方便的hook,但是越是使用简单的东西,内部的实现越是复杂。我们可以看下useRequest的如下框架。
如图1-1所示。主要分三层:核心能力、落地业务场景、插件。
这似乎和文档的分类差不多,但是如果你看过源码的话,可以发现:
作为入参的都是服务落地业务场景的(或者说useRequest更加细粒度的控制)
而作为返回值的都是useRequest的核心能力。
插件plugins在源码中是useRequest的一个扩展参数。(这我们在下一期说明)
图1-1 useRequest框架
useRequest的核心能力
这一part,我们着重关注useRequest的核心能力的实现。核心能力包括了两大部分:
- 属性:data; loading; error; params;
- 方法:setState; runPluginHandler; runAsync; run; cancel; refreesh; refreshAsync; mutate;
如图1-2所示。useRequest本质是一个函数,接受三个参数:service, options, plugins。
service是异步函数,options是可选参数,plugins是插件。
在源码中,useRequest是间接通过useRequestImplement实现的,useRequestImplement是ahooks的实现的一个内部类。不过,这并不重要,我们接着往下看。
在useRequest中,核心能力的实现是基于一个重要的类Fetch。这个Fetch不是es6的fetch-api。它是ahooks的实现的一个类。本质上来讲,useRequest透出的属性和方法都是Fetch实例的属性和方法。
属性上,data; loading; error; params 是fetch的state。对属性而言,透出直接通过fetchInstance[key]。
方法上,setState; runPluginHandler...等等都是fetch的实例方法。对方法而言,透出却通过useMemoizedFn缓存函数(useMemoizedFn可以永久缓存函数地址),并绑定fetchInstance作为方法的this。
图1-2 useRequest核心能力
PART-1:核心属性的实现
核心属性包括了data; loading; error; params。
这一部分我们简单了解下它们的流程图和实现。
data:异步的数据
图1-3 data的流程图.png
error:错误
图1-4 error的流程图.png
params:参数
图1-5 params的流程图.png
loading:请求状态
图1-6 loading的流程图.png
好了,今天的旅程到这里就结束了,谢谢你的陪伴!
感谢你的耐心阅读,如果觉得好的话,可以给我点个赞吗
创作不易,感谢你的支持!
本文使用 markdown.com.cn 排版