在写业务的过程中,我们总是会遇到这样的需求,在请求时显示一个 loading,然后请求结束后展示数据。以一个是不是 vip 的场景为例,如果不加入 loading 状态,页面可能在未请求的时候显示非 vip,数据请求完成之后,发现是 vip,再改成 vip。这样无疑体验较差,但是我们又不希望一直使用 useState 来声明 loading 状态,这无疑是乏味的:

const [loading, setLoading] = useState(false);
...

所以,不如使用 hooks 来封装这部分逻辑,来实现一个 useLoading hook。

在写这个 hook 之前,我们要先理清楚这个 hook 的入参和出参。我们希望这个 hook 有这样的效果,我们传入一个请求的函数,得到这个函数是否在 loading,以及一个包装后的请求函数。代码如下:

const [isLoading, wrappedAjax] = useLoading(ajax);

实现

直接上代码:

import { useState, useCallback } from "react";
export default function useLoading(req) {
const [loading, setLoading] = useState(false);
const wrapReq = useCallback(
(...args) => {
setLoading(true);
return req(...args).then((data) => {
setLoading(false);
return Promise.resolve(data);
});
},
[req]
);
return [loading, wrapReq];
}

代码也很简单,就是对原先的 api 请求进行了包装,在调用前,设置 loading 为 true,拿到数据之后,设置 loading 为 false。调用方式如下:

  const [loading, req] = useLoading(checkVip);
useEffect(() => {
req().then(({ vip }) => {
console.log(vip);
setVip(vip);
}).catch((err) => alert(err));
}, [req]);

下面是一个简单的 demo(没看到效果请点击刷新按钮)。可以看到,当不设置 loading 状态的时候,页面是由 no vip 跳到 vip 的,体验是比较差的。

why not React Query

当我们只是需要一个 loading 状态,而又不想写重复的 useState 来管理 loading 状态时,上面这个小 hook 就显得更轻量了。但是如果需要一整套完整的解决方案,使用 React Query 则是更好的选择。(本文完)

写一个react hook:useLoading的更多相关文章

  1. [翻译]怎么写一个React组件库(二)

    本文同步发布于知乎专栏 https://zhuanlan.zhihu.com/p/27434018,喜欢本文的就去知乎点个赞支持下吧- 引言 该系列文章将通过创建一个组件库来引导你学习如何构建自己的组 ...

  2. [翻译]怎么写一个React组件库(一)

    本文同步发布于知乎专栏 https://zhuanlan.zhihu.com/p/27401329,喜欢本文的就去知乎点个赞支持下吧- 引言 该系列文章将通过创建一个组件库来引导你学习如何构建自己的组 ...

  3. (24/24) webpack小案例--自己动手用webpack构建一个React的开发环境

    通过前面的学习,对webpack有了更深的认识,故此节我们就利用前面相关知识自己动手用webpack构建一个React的开发环境,就算是一个小案例吧. 注:此处使用的开发工具是Webstorm. 1. ...

  4. 手写一个React-Redux,玩转React的Context API

    上一篇文章我们手写了一个Redux,但是单纯的Redux只是一个状态机,是没有UI呈现的,所以一般我们使用的时候都会配合一个UI库,比如在React中使用Redux就会用到React-Redux这个库 ...

  5. 深入浅出React Native 3: 从零开始写一个Hello World

    这是深入浅出React Native的第三篇文章. 1. 环境配置 2. 我的第一个应用 将index.ios.js中的代码全部删掉,为什么要删掉呢?因为我们准备从零开始写一个应用~学习技术最好的方式 ...

  6. [闲的蛋疼系列]从零开始用TypeScript写React的UI组件(0)-先写一个Button??

    0.咸鱼要说的 一入前端深似海,咸鱼入海更加咸. 最近闲的蛋疼,手上年前的事也完成了7788了,借助[PG1]的话来说,我们要keep real. 咸鱼肯定不real 了,因为我们都活在梦里,所以咱们 ...

  7. 放弃antd table,基于React手写一个虚拟滚动的表格

    缘起 标题有点夸张,并不是完全放弃antd-table,毕竟在react的生态圈里,对国人来说,比较好用的PC端组件库,也就antd了.即便经历了2018年圣诞彩蛋事件,antd的使用者也不仅不减,反 ...

  8. 用 nodejs 写一个命令行工具 :创建 react 组件的命令行工具

    用 nodejs 写一个命令行工具 :创建 react 组件的命令行工具 前言 上周,同事抱怨说 react 怎么不能像 angular 那样,使用命令行工具来生成一个组件.对呀,平时工作时,想要创建 ...

  9. React学习及实例开发(二)——用Ant Design写一个简单页面

    本文基于React v16.4.1 初学react,有理解不对的地方,欢迎批评指正^_^ 一.引入Ant Design 1.安装antd yarn add antd 2.引入 react-app-re ...

随机推荐

  1. VS Code 搭建 Rust 开发环境

    VS Code 搭建 Rust 开发环境 上一篇文章安装和配置好了 Rust 环境后,我们是使用的是简单的文本工具编写 Hello World 入门代码,但是为了提高我们的学习效率,下面安利大家 VS ...

  2. git 常用命令 command

    git config --list //查看配置信息   git config user.name //查看用户名  git config user.email //查看用户邮箱 从远程克隆到本地仓库 ...

  3. x++ 和 ++x的区别

    很多编程语言都会有x++和++x的问题,两个到底是怎么回事? 一个先执行一个后执行的区别 var x = 0; console.log(x++);//0 遇到x++当前执行值不变 console.lo ...

  4. 题解-FJOI2018 领导集团问题

    题面 FJOI2018 领导集团问题 给一棵树 \(T(|T|=n)\),每个点有个权值 \(w_i\),从中选出一个子点集 \(P=\{x\in {\rm node}|x\in T\}\),使得 \ ...

  5. Codeforces Edu Round 56 A-D

    A. Dice Rolling 把\(x\)分解为\(a * 6 + b\),其中\(a\)是满6数,\(b\)满足\(1 <= b < 6\),即可... #include <io ...

  6. php curl的使用心得

    php的curl有很多参数,整理一下其中的常用参数的作用 1.CURLOPT_SSL_VERIFYHOST 设置为 1 是检查服务器SSL证书中是否存在一个公用名(common name).译者注:公 ...

  7. 使用git客户端免密码进行拉取等相关操作

    前言 如果使用git客户端进行pull或push操作时,遇到有权限的项目总要输入用户名密码,真的是太麻烦了,因此需要稍作修改,然后就可以免密码操作啦! 方法: 进入C盘->用户->你的主机 ...

  8. antDesign获取表单组件的值

    子组件中:  getFormValue是在点击确定按钮获取表单值得事件函数,一旦执行就会执行里边的validate()回调函数 返回的数据中有error和value两种,如果存在error那就是其中某 ...

  9. Java 8 新特性:日期处理

    1.  Java 8 日期处理新特性 Java 8基于ISO标准日期系统,提供了java.time包来处理时间日期,且该包下的所有类都是不可变类型而且线程安全. 2.  关键类 Instant:瞬时实 ...

  10. Java基础语法吐血整理

    前言 自己的Java理论知识方面一直都不是很好,决定从0开始好好总结下,把想到的和以前不确定的(查阅资料确定)的知识整理一下,加油!!坚持!!! Java概述 Java三大体系 1.JavaSE 标准 ...