写一个react hook:useLoading
在写业务的过程中,我们总是会遇到这样的需求,在请求时显示一个 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的更多相关文章
- [翻译]怎么写一个React组件库(二)
本文同步发布于知乎专栏 https://zhuanlan.zhihu.com/p/27434018,喜欢本文的就去知乎点个赞支持下吧- 引言 该系列文章将通过创建一个组件库来引导你学习如何构建自己的组 ...
- [翻译]怎么写一个React组件库(一)
本文同步发布于知乎专栏 https://zhuanlan.zhihu.com/p/27401329,喜欢本文的就去知乎点个赞支持下吧- 引言 该系列文章将通过创建一个组件库来引导你学习如何构建自己的组 ...
- (24/24) webpack小案例--自己动手用webpack构建一个React的开发环境
通过前面的学习,对webpack有了更深的认识,故此节我们就利用前面相关知识自己动手用webpack构建一个React的开发环境,就算是一个小案例吧. 注:此处使用的开发工具是Webstorm. 1. ...
- 手写一个React-Redux,玩转React的Context API
上一篇文章我们手写了一个Redux,但是单纯的Redux只是一个状态机,是没有UI呈现的,所以一般我们使用的时候都会配合一个UI库,比如在React中使用Redux就会用到React-Redux这个库 ...
- 深入浅出React Native 3: 从零开始写一个Hello World
这是深入浅出React Native的第三篇文章. 1. 环境配置 2. 我的第一个应用 将index.ios.js中的代码全部删掉,为什么要删掉呢?因为我们准备从零开始写一个应用~学习技术最好的方式 ...
- [闲的蛋疼系列]从零开始用TypeScript写React的UI组件(0)-先写一个Button??
0.咸鱼要说的 一入前端深似海,咸鱼入海更加咸. 最近闲的蛋疼,手上年前的事也完成了7788了,借助[PG1]的话来说,我们要keep real. 咸鱼肯定不real 了,因为我们都活在梦里,所以咱们 ...
- 放弃antd table,基于React手写一个虚拟滚动的表格
缘起 标题有点夸张,并不是完全放弃antd-table,毕竟在react的生态圈里,对国人来说,比较好用的PC端组件库,也就antd了.即便经历了2018年圣诞彩蛋事件,antd的使用者也不仅不减,反 ...
- 用 nodejs 写一个命令行工具 :创建 react 组件的命令行工具
用 nodejs 写一个命令行工具 :创建 react 组件的命令行工具 前言 上周,同事抱怨说 react 怎么不能像 angular 那样,使用命令行工具来生成一个组件.对呀,平时工作时,想要创建 ...
- React学习及实例开发(二)——用Ant Design写一个简单页面
本文基于React v16.4.1 初学react,有理解不对的地方,欢迎批评指正^_^ 一.引入Ant Design 1.安装antd yarn add antd 2.引入 react-app-re ...
随机推荐
- luogu P6835 概率DP 期望
luogu P6835 概率DP 期望 洛谷 P6835 原题链接 题意 n + 1个节点,第i个节点都有指向i + 1的一条单向路,现在给他们添加m条边,每条边都从一个节点指向小于等于自己的一个节点 ...
- CF1400F - x-prime Substrings
1400F - x-prime Substrings 首先发现 \(x\) 很小,所以发现对应的 x-prime 字符串数也很少,最多的情况是 \(x = 19\),有 2399 个,先爆搜出来. 现 ...
- GYM100526I Interesting Integers
题目大意 定义一种 \(Gabonacci\) 数列: \[\begin{array}{c} G_1=a\\ G_2=b\\ G_i=G_{i-1}+G_{i-2} \end{array} \] 给定 ...
- 一个最简单的typescript工程
初级: 1.新建一个文件夹~/a/ 2.cd ~/a/ 3.npm init -y 生成package.json 4.新建index.ts,内容:console.log(" ...
- Python最会变魔术的魔术方法,我觉得是它!
在上篇文章中,我有一个核心的发现:Python 内置类型的特殊方法(含魔术方法与其它方法)由 C 语言独立实现,在 Python 层面不存在调用关系. 但是,文中也提到了一个例外:一个非常神秘的魔术方 ...
- 学习笔记——JS语言精粹
JS作用域是基于词法作用域的顶级对象. JS是一门弱类型语言,强类型能在编译时检测错误. JS是唯一一门所有浏览器都能识别的语言. 块注释对于被注释的代码是不安全的,例如/* var rm=/a*/ ...
- CI/CD持续集成方案
一,CI/CD流程和持续交付简介 CI(Continuous Integration)持续集成 CD(Continuous Deployment)持续部署 CD(Continuous delive ...
- PB级大规模Elasticsearch集群运维与调优实践【>>戳文章免费体验Elasticsearch服务30天】
[活动]Elasticsearch Service免费体验馆>> Elasticsearch Service自建迁移特惠政策>>Elasticsearch Service新用户 ...
- 面试 HTTP和HTML 浏览器
HTTP和HTML 浏览器 #说一下http和https #参考回答: https的SSL加密是在传输层实现的. (1)http和https的基本概念 http: 超文本传输协议,是互联网上应用最为广 ...
- [GXYCTF2019]禁止套娃(无参RCE)
[GXYCTF2019]禁止套娃 1.扫描目录 扫描之后发现git泄漏 使用githack读取泄漏文件 <?php include "flag.php"; echo &quo ...