第三期:ahooks全讲解-Part2(useRequest)

234 阅读3分钟

hello,我是海海

这一期我们继续ahooks之旅。阅读时间5分钟。

由于ahooks内容比较多,我将拆分成几个章节,本期我们开始讲解历经数次迭代的useRequest,由于useRquest比较复杂,会适当分成几个章节讲述

不同于其他介绍ahooks的文章,本系列会对每一个hookwhat(是什么)、how(怎么用)、why(实现原理)、when(啥时候用)做全方面的讲解。

欢迎转载,请注明原文和作者

有任何不对的地方,欢迎底部发消息给我。

前文链接: 第三期:ahooks全讲解-Part1


本期大纲:

  • 前言:整体看看useRequest
  • useRequest的核心能力
  • PART-1:核心属性的实现

funny.gif

前言:整体看看useRequest

useRequest使用起来确实是一个方便的hook,但是越是使用简单的东西,内部的实现越是复杂。我们可以看下useRequest的如下框架。

如图1-1所示。主要分三层:核心能力、落地业务场景、插件。

这似乎和文档的分类差不多,但是如果你看过源码的话,可以发现:

作为入参的都是服务落地业务场景的(或者说useRequest更加细粒度的控制)

而作为返回值的都是useRequest的核心能力。

插件plugins在源码中是useRequest的一个扩展参数。(这我们在下一期说明)

图1-1 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实现的,useRequestImplementahooks的实现的一个内部类。不过,这并不重要,我们接着往下看。

useRequest中,核心能力的实现是基于一个重要的类Fetch。这个Fetch不是es6fetch-api。它是ahooks的实现的一个类。本质上来讲,useRequest透出的属性和方法都是Fetch实例的属性和方法。

属性上,data; loading; error; params 是fetch的state。对属性而言,透出直接通过fetchInstance[key]。

方法上,setState; runPluginHandler...等等都是fetch的实例方法。对方法而言,透出却通过useMemoizedFn缓存函数(useMemoizedFn可以永久缓存函数地址),并绑定fetchInstance作为方法的this

图1-2 useRequest核心能力

图1-2 useRequest核心能力

PART-1:核心属性的实现

核心属性包括了data; loading; error; params。

这一部分我们简单了解下它们的流程图和实现。

data:异步的数据

图1-3 data的流程图.png

图1-3 data的流程图.png

error:错误

图1-4 error的流程图.png

图1-4 error的流程图.png

params:参数

图1-5 params的流程图.png

图1-5 params的流程图.png

loading:请求状态

图1-6 loading的流程图.png

图1-6 loading的流程图.png

好了,今天的旅程到这里就结束了,谢谢你的陪伴!


感谢你的耐心阅读,如果觉得好的话,可以给我点个赞吗

hello.gif

创作不易,感谢你的支持!

本文使用 markdown.com.cn 排版