React Use Hook 尝鲜

news2024/9/23 14:10:23

React Use Hook 尝鲜

最近继续在找处理 React 异步调用的方式……主要是现在需求比较复杂,用 cache query 的方式去实现有那么一丢丢的麻烦,又不是很想用额外的包,所以就想看看有没有比较好的一些处理方式。

当然,可以用到生产环境上的没找到,不过找到了一个还在试验阶段的新功能——use hook,毫不夸张地说,这个 hook 打破了 React 既有的 hook 规范。

React 团队终于想不出什么正常点的名字,所以直接用 use 了吗

⚠️:还在试验阶段,未来不确定会不会被删除,友情提示不要用到生产环境

具体的 proposal 和 discussion 在这里: RFC: First class support for promises and async/await,里面还有一些挺有趣的 hooks 和用法,比如说已经被 merged 的 useSuspenseQuery现在不工作的 export default async function ServerComponent() {} 等,总之这个 thread 感觉还是可以看看的。

基础用法

使用这个功能之前需要将 react 的版本设置为 experimental:

{
  "dependencies": {
    "react": "experimental",
    "react-dom": "experimental"
  }
}

下面是一个基础的使用案例,目前在不借助第三方库的实现方式,异步的操作大概是借助 useEffectuseState 这样实现的:

import './App.css';
import { useEffect, useState } from 'react';

function App() {
  const [product, setProduct] = useState(null);
  const [loading, setLoading] = useState(false);

  useEffect(() => {
    setLoading(true);
    fetch('https://dummyjson.com/products/1')
      .then((res) => res.json())
      .then((json) => setProduct(json))
      .catch((e) => console.error(e))
      .finally(() => setLoading(false));
  }, []);

  return (
    <div className="App">
      {loading && <h1>Is Loading</h1>}
      {!loading && JSON.stringify(product)}
    </div>
  );
}

export default App;

在使用了 use 之后,可以简化成这样:

import './App.css';
import { use } from 'react';

const fetchProduct = fetch('https://dummyjson.com/products/1').then((res) =>
  res.json()
);

function App() {
  const product = use(fetchProduct);

  console.log(product);

  return <div className="App">{JSON.stringify(product)}</div>;
}

export default App;

我试着尝试了一下 log 了一下 product,然后发现,product 不存在先被设置为 undefined,随后在 API 调用成功后再被赋值的情况:

在这里插入图片描述

也就是说,使用 use hook 并不遵从 React 目前其他的 hook 的生命周期方式,即先渲染组件,再处理完异步操作后渲染页面的步骤,而是直接等待异步操作完成后,再渲染页面。

这也就是当我修改了一下 API,让异步调用失败的时候,页面直接就白屏的因素:

在这里插入图片描述

render 部分完全没有调用,API 一旦失败了,那么这个页面就挂了。

目前关于怎样正式处理 loading 和 error 还没有一个定论,只是其中一个成员是这么说的:

在这里插入图片描述

总结一下就是,当 use hook 处在一个薛定谔的状态时,会调用最近的 Suspense,当 use hook 调用失败时则会调用最近的 error boundary。

进阶之 Loading 与错误处理 的实现

使用 Suspense 和 error boundary 的部分,这里假设你知道 Suspense 和 error boundary,并知道怎么简单的实现这两个功能。

react 什么时候考虑吧 error boundary 的 hook 提上日程啊

loading 的处理

也就是利用 Suspense 的特性去实现,另外使用 Suspense 的好处在于,它会等到所有的 use hooks 都完成了之后,再渲染页面。

也就是说,并不需要使用 Promise.all(),只需要在 Suspense 中调用多个使用 use 的组件即可。

import './App.css';
import React, { use, Suspense } from 'react';

const fetchProduct = fetch('https://dummyjson.com/products/1').then((res) =>
  res.json()
);

const Data = () => {
  const product = use(fetchProduct);

  return <div>{JSON.stringify(product)}</div>;
};

export default Data;


function App() {
  return (
    <Suspense fallback={<div>loading</div>}>
      <Data />
    </Suspense>
  );
}

export default App;

效果如下:

在这里插入图片描述

这样的实现也有好有坏吧,官方说目前的操作是调用最近的 Suspense,这个也的确会让 灵活处理 loading 状态 这一需求变得有些麻烦。

比如说有些情况下只是需要将 loading 传入一些表单中,让 UI 库去模拟拉取的状态,如 <Form loading={loading}>, <Table loading={loading}> 这种情况。去梳理 DOM 树,并且在最近的结点处理或事创立 Suspense 可能会有些麻烦。

使用 error boundary

error boundary 甚至是一个 class based component 才有的功能:

class ErrorBoundry extends Component {
  state = { hasError: false, error: null };

  static getDerivedStateFromError(error) {
    return {
      hasError: true,
      error,
    };
  }

  render() {
    if (this.state.hasError) {
      return this.props.fallback;
    }

    return this.props.children;
  }
}

const Data = () => {
  const product = use(fetchProduct);

  return <div>{JSON.stringify(product)}</div>;
};

export default Data;


function App() {
  return (
    <ErrorBoundry fallback={<div>Error</div>}>
      <Suspense fallback={<div>loading</div>}>
        <Data />
      </Suspense>
    </ErrorBoundry>
  );
}

export default App;

在这里插入图片描述

同理,去梳理 DOM 树,并且在最近的结点处理或事创立 error boundary 也可能会有些麻烦。

另一个不遵从常规的特性

React 官方文档中单独分出一个节点说在顶部使用 hooks:Only Call Hooks at the Top Level,原文如下:

Don’t call Hooks inside loops, conditions, or nested functions. Instead, always use Hooks at the top level of your React function, before any early returns. By following this rule, you ensure that Hooks are called in the same order each time a component renders.

但是 use hook 打破了这条规范,如下面就是将 use hook 放在了 if 中:

import React, { use } from 'react';

const fetchProduct = fetch('https://dummyjson.com/pdd/1').then((res) =>
  res.json()
);

const Data = () => {
  const bool = false;
  if (bool) {
    const product = use(fetchProduct);

    return <div>{JSON.stringify(product)}</div>;
  }

  return 'not fatched';
};

export default Data;

在这里插入图片描述

这其实也是另外一个我不太确定 use hook 到底什么时候会被并入到生产阶段的原因,就是这个 hook 确实会完全打破 React 之前固有的 hook 规范。

当然,对于开发来说,这也更加的灵活,使用起来更方便就是了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/372559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

tkinter界面的TCP通信/tkinter开启线程接收TCP

前言 用简洁的语言写一个可以与TCP客户端实时通信的界面。之前做了一个项目是要与PLC进行信息交互的界面&#xff0c;在测试的时候就利用TCP客户端来实验&#xff0c;文末会附上TCP客户端。本文分为三部分&#xff0c;第一部分是在界面向TCP发送数据&#xff0c;第二部分是接收…

Linux基础命令-dd拷贝、转换文件

文章目录 dd 命令介绍 语法格式 基本参数 参考实例 1&#xff09;生成一个200M的新文件 2&#xff09;拷贝文件的100个字节 3&#xff09;将文件的字母全部转换成大写 4&#xff09;将linux自带的光盘制作成iso格式的镜像文件 5&#xff09;使用dd命令制作1G的交换分…

软考中级-操作系统

1 操作系统地位计算机系统由硬件和软件组成&#xff0c;未配置软件的称为裸机&#xff0c;但这会导致效率低下。操作系统是为弥补用户与硬件之间的鸿沟的一种系统软件&#xff0c;汇编、编译、解释、数据库管理系统等系统软件和其他应用软件都在此基础。2 进程管理又称处理机管…

Linux Ubuntu配置国内源

因为众所周知的原因&#xff0c;国外的很多网站在国内是访问不了或者访问极慢的&#xff0c;这其中就包括了Ubuntu的官方源。 所以&#xff0c;想要流畅的使用apt安装应用&#xff0c;就需要配置国内源的镜像。 市面上Ubuntu的国内镜像源非常多&#xff0c;比较有代表性的有清华…

pytorch学习日记之激活函数

常用的激活函数为S型&#xff08;sigmoid&#xff09;激活函数、双曲正切&#xff08;Tanh&#xff09;激活函数、线性修正单元&#xff08;ReLU&#xff09;激活函数等&#xff0c;对应Pytorch的函数如下所示 层对应的种类功能torch.nn.SigmoidSigmoid激活函数torch.nn.TanhT…

_vue-3

Vue3有了解过吗&#xff1f;能说说跟vue2的区别吗&#xff1f; 1. 哪些变化 从上图中&#xff0c;我们可以概览Vue3的新特性&#xff0c;如下&#xff1a; 速度更快体积减少更易维护更接近原生更易使用 1.1 速度更快 vue3相比vue2 重写了虚拟Dom实现编译模板的优化更高效的…

数据挖掘概述

目录1、数据挖掘概述2、数据挖掘常用库3、模型介绍3.1 分类3.2 聚类3.3 回归3.4 关联3.5 模型集成4、模型评估ROC 曲线5、模型应用1、数据挖掘概述 数据挖掘&#xff1a;寻找数据中隐含的知识并用于产生商业价值 数据挖掘产生原因&#xff1a;海量数据、维度众多、问题复杂 数…

直接拿项目运行npm start 会出现’react-scripts’ 不是内部或外部命令,也不是可运行的程序或批处理文件错误

目录 解决方案 原因 解决方案 npm install react-scripts或npm install安装完成后再次运行 npm start 即可 原因 create-react-app有丢包的缺陷&#xff0c;手动安装包后&#xff0c;需要重新npm install一下&#xff0c;这样node_modules/.bin/目录下才会重新出现react-s…

【论文阅读】基于LevelDB的分布式数据库研究

基于LevelDB的分布式数据库研究 基于LevelDB的分布式数据库的研究与实现 - 中国知网 (cnki.net) 实现了什么&#xff1f; 基于键值型NoSQL数据库LevelDB&#xff0c;并与数据一致性算法Raft、 数据分片和负载均衡相结合&#xff0c;设计并实现基于LevelDB的分布式数据库。 主要…

Wireshark “偷窥”浏览器与服务器三次握手

本文使用的是Wireshark 4.0.3, Java 11 编写简易服务器&#xff0c;客户端使用Chrome浏览器移动端开发或是前、后端开发又或是高大上的云计算都脱离不了网络&#xff0c;离开了网络的计算机就是一个孤岛&#xff0c;快速上手开发、背面试八股文固然有些急功近利&#xff0c;但确…

jstatd的启动方式与关闭方式

启动方式与注意事项&#xff1a; 启动方式&#xff1a; 前台启动不打印日志&#xff1a; jstatd -J-Djava.security.policyjstatd.all.policy -J-Djava.rmi.server.hostname服务器IP 前台启动并打印日志&#xff1a; ./jstatd -J-Djava.security.policyjstatd.all.policy -…

傻瓜式minio使用指南

傻瓜式minio使用指南1. docker部署minio1.1 docker拉取minio镜像1.2 创建docker容器1.3 查看docker容器是否启动正常2.登陆minio2.1 账户、密码为原先设置minioadmin2.2 创建桶2.3 设置桶属性3.Java客户端使用3.1引入依赖3.2 使用3.3 结果1. docker部署minio 1.1 docker拉取mi…

你应该知道的ChatGPT提示语

ChatGPT 自上线以来&#xff0c;凭借其优异的自然语言理解和输出能力&#xff0c;仅花 5天就成为了活跃用户过百万的现象级产品。而上一个现象级产品 instagram 花了 2 个半月。到目前为止 ChatGPT 在全球累计用户数量已经过亿&#xff0c;相信现在也有很多人在跟 ChatGPT 聊过…

Acwing 蓝桥杯 第二章 二分与前缀和

今天来补一下之前没写的总结&#xff0c;题是写完了&#xff0c;但是总结没写感觉没什么好总结的啊&#xff0c;就当打卡了789. 数的范围 - AcWing题库思路&#xff1a;一眼二分&#xff0c;典中典先排个序&#xff0c;再用lower_bound和upper_bound维护相同的数的左界和右界就…

Google Guice 4:Bindings(2)

4 Scopes (实例的作用域&#xff09; 4.1 默认规则&#xff1a;unreuse instance 到目前为止&#xff0c;通过bind().to()和Provides定义的binding&#xff0c;每次需要注入实例对象时&#xff0c;Guice都会创建一个新的实例 // 修改DatabaseTransactionLog&#xff0c;使其打…

【python学习笔记】:SQL常用脚本(二)

11、四舍五入ROUND函数 ROUND ( numeric_expression , length [ ,function ] ) function 必须为 tinyint、smallint 或 int。 如果省略 function 或其值为 0&#xff08;默认值&#xff09;&#xff0c;则将舍入 numeric_expression。 如果指定了0以外的值&#xff0c;则将截…

TypeScript笔记-进行中

学习来源&#xff1a; 本笔记由尚硅谷教学视频整理而来 文章目录学习来源&#xff1a;一.TS简介TypeScript是什么TypeScript增加了什么二环境搭建安装nvm环境搭建二.TypeScript中的基本类型类型声明类型类型示例代码三.编译配置自动编译文件自动编译整个项目四.使用webpack打包…

一文掌握如何轻松稿定项目风险管理【静说】

风险管理对于每个项目经理和PMO都非常重要&#xff0c;如果管理不当会出现很多问题&#xff0c;咱们以前分享过很多风险管理的内容&#xff1a; 风险无处不在&#xff0c;一旦发生&#xff0c;会对一个或多个项目目标产生积极或消极影响的确定事件或条件。那么接下来介绍下五大…

在成都想转行IT,选择什么专业比较好?

很多创新型的互联网服务公司的核心其实都是软件&#xff0c;创新的基础、运行的支撑都是软件。例如&#xff0c;软件应用到了出租车行业&#xff0c;就形成了巅覆行业的滴滴;软件应用到了金融领域&#xff0c;就形成互联网金融;软件运用到餐饮行业&#xff0c;就形成美团;软件运…

学渣适用版——Transformer理论和代码以及注意力机制attention的学习

参考一篇玩具级别不错的代码和案例 自注意力机制 注意力机制是为了transform打基础。 参考这个自注意力机制的讲解流程很详细&#xff0c; 但是学渣一般不知道 key&#xff0c;query&#xff0c;value是啥。 结合B站和GPT理解 注意力机制是一种常见的神经网络结构&#xff0…