React(Hook介绍)

2023-11-18

为什么要用Hook?

介绍Hooks之前,首先要给大家说一下React的组件创建方式,一种是类组件,一种是纯函数组件,并且React团队希望,组件不要变成复杂的容器,最好只是数据流的管道。开发者根据需要,组合管道即可。也就是说组件的最佳写法应该是函数,而不是类。。
Hook 解决了我们五年来编写和维护成千上万的组件时遇到的各种各样看起来不相关的问题。无论你正在学习 React,或每天使用,或者更愿尝试另一个和 React 有相似组件模型的框架,你都可能对这些问题似曾相识。
但是我们知道,在以往开发中类组件和纯函数组件的区别是很大的,纯函数组件有着类组件不具备的多种特点,简单列举几条

纯函数组件没有状态
纯函数组件没有生命周期
纯函数组件没有this
只能是纯函数

介绍

虽然hook有很多比class方便的更能但是并不建议它来重构项目,因为在react中的class并没有被弃用,因此我们不建议它来重构你原来的class项目.

Hook 是 React 16.8 的新增特性。它是完全可选的,并且100%向后兼容。它可以让你使用函数组件的方式,运用类组件以及 react 其他的一些特性,比如管理状态、生命周期钩子等。从概念上讲,React 组件一直更像是函数。而 Hook 则拥抱了函数,同时也没有牺牲 React 的精神原则。

流程

什么是Hooks?

'Hooks’的单词意思为“钩子”。
React Hooks 的意思是,组件尽量写成纯函数,如果需要外部功能和副作用,就用钩子把外部代码"钩"进来。而React Hooks 就是我们所说的“钩子”。
那么Hooks要怎么用呢?“你需要写什么功能,就用什么钩子”。对于常见的功能,React为我们提供了一些常用的钩子,当然有特殊需要,我们也可以写自己的钩子。下面是React为我们提供的默认的四种最常用钩子

useState()
userContext()
userReducer()
useEffect()

本质上的运作规则

Hook 将组件中相互关联的部分拆分成更小的函数,也就是搭积木,由更小的积木来搭建这个项目,它的灵活性很大,可以自由发挥

class的缺点和用hook的理由

除了代码复用和代码管理会遇到困难外,我们还发现 class 是学习 React 的一大屏障。你必须去理解 JavaScript 中 this 的工作方式,这与其他语言存在巨大差异。还不能忘记绑定事件处理器。没有稳定的语法提案,这些代码非常冗余。大家可以很好地理解 props,state 和自顶向下的数据流,但对 class 却一筹莫展。即便在有经验的 React 开发者之间,对于函数组件与 class 组件的差异也存在分歧,甚至还要区分两种组件的使用场景。

hook的优点:

  1. 代码可读性更强,原本同一块功能的代码逻辑被拆分在了不同的生命周期函数中,容易使开发者不利于维护和迭代,通过 React Hooks
    可以将功能代码聚合,方便阅读维护。例如,每个生命周期中常常会包含一些不相关的逻辑。一般我们都会在 componentDidMount 和
    componentDidUpdate 中获取数据。但是,同一个 componentDidMount
    中可能也包含很多其它的逻辑,如设置事件监听,而之后需在 componentWillUnmount
    中清除。相互关联且需要对照修改的代码被进行了拆分,而完全不相关的代码却在同一个方法中组合在一起。如此很容易产生
    bug,并且导致逻辑不一致。
  2. 组件树层级变浅。在原本的代码中,我们经常使用 HOC/render props
    等方式来复用组件的状态,增强功能等,无疑增加了组件树层数及渲染,在 React DevTools 中观察过 React 应用,你会发现由
    providers,consumers,高阶组件,render props 等其他抽象层组成的组件会形成“嵌套地狱”。而在 React
    Hooks 中,这些功能都可以通过强大的自定义的 Hooks 来实现。
  3. 不用再去考虑 this 的指向问题。在类组件中,你必须去理解 JavaScript 中 this 的工作方式

hook的缺点:

对一些钩子函数不支持。当下 v16.8 的版本中,还无法实现 getSnapshotBeforeUpdate 和 componentDidCatch 这两个在类组件中的生命周期函数。

Hook 规则

不在循环,条件或嵌套函数中调用 Hook, 确保总是在你的 React 函数的最顶层调用他们。
不在普通的 JavaScript 函数中调用 Hook,在 React 的函数组件或者自定义 Hook 中调用 Hook。

Hook API

名称 描述
useState 在函数组件中维护自己的状态
useEffect 在函数组件中实现生命周期钩子函数
useContext 用来处理多层级传递数据的方式,减少组件嵌套
useReducer 跟react-redux的使用方式一样,算是提供一个 mini 的 Redux 版本
useCallback 获得一个记忆函数,避免在某些情况下重新渲染子组件,用来做性能优化
useMemo 获得一个记忆组件,和useCallback非常类似,它适用于返回确定的值
useRef 生成对 DOM 对象的引用,它是一个真正的引用,而不是把值拷过去
useImperativeHandle 透传ref,用于让父组件获取子组件内的引用
useLayoutEffect 同步执行副作用,在页面完全渲染完成后,操作DOM

useState
在类组件中,我们使用 this.state来保存组件状态,并对其修改触发组件重新渲染。而在函数组件中,由于没有 this 这个黑魔法,可能通过 useState 来帮我们保存组件的状态。

import React, { useState } from "react";

export default function Button() {
  const [buttonText, setButtonText] = useState("Click me, please");

  function handleClick() {
    return setButtonText("Thanks, been clicked!");
  }

  return <button onClick={handleClick}>{buttonText}</button>;
}

useState(),返回一个 state,以及更新 state 的函数。
useState() 中第一个参数是值或者对象,初始渲染期间,返回的状态 (state) 是传入的第一个参数相同。
如果依赖于先前的state,在第二个参数中接收先前的 state,并返回一个更新后的值。
注意:与类组件中的 setState 方法不同,useState 不会自动合并更新对象。当第一个参数是一个对象时,你可以用函数式的 setState 结合展开运算符来达到合并更新对象的效果。

useEffect
语法:useEffect(fn,Array)

第一个参数传递函数,可以用来做一些副作用比如异步请求,修改外部参数等行为。
第二个参数是个数组,数组中的值发生变化才会触发 useEffect 第一个参数中的函数。
如果第二个参数是个空数组的话,默认会在页面加载后执行一次。
如果第一个参数有返回值,会在组件销毁或者调用函数前调用。
可以使用useEffect模拟componentDidMount、 componentDidMount 和 componentWillUnmount钩子函数。

useContext
用来处理多层级传递数据的方式,使用 useContext 可以解决 Consumer 多状态嵌套的问题

useReducer
useReducer 这个 Hooks 在使用上几乎跟 React-Redux 一模一样,唯一缺少的就是无法使用 redux 提供的中间件,算是提供一个 mini 的 Redux 版本。

useCallback
通过 useCallback 获得一个记忆后的函数,避免函数组件在每次渲染的时候如果有传递函数的话,重新渲染子组件。用来做性能优化。

useMemo
记忆组件,和useCallback类似,不同的是:useCallback 不会执行第一个参数函数,而是将它返回给你,而 useMemo 会执行第一个函数并且将函数执行结果返回给你。所以在前面的例子中,可以返回 handleClick 来达到存储函数的目的。

所以 useCallback 常用记忆事件函数,生成记忆后的事件函数并传递给子组件使用。而 useMemo 更适合经过函数计算得到一个确定的值,比如记忆组件。

useRef
跟 createRef 类似,都可以用来生成对 DOM 对象的引用。不同点在于,它是一个真正的引用,而不是把值拷过去。

useImperativeHandle
透传ref,用于让父组件获取子组件内的引用。

useLayoutEffect
大部分情况下,使用 useEffect 就可以帮我们处理组件的副作用,但是如果想要同步调用一些副作用,比如对 DOM 的操作,就需要使用 useLayoutEffect,useLayoutEffect 中的副作用会在 DOM 更新之后同步执行。

在上面的例子中,useLayoutEffect 会在 render,DOM 更新之后同步触发函数,会优于 useEffect 异步触发函数。

自定义Hook
demo

总结:

Hook是
完全可选的。 你无需重写任何已有代码就可以在一些组件中尝试 Hook。但是如果你不想,你不必现在就去学习或使用 Hook。
100% 向后兼容的。 Hook 不包含任何破坏性改动。
现在可用。 Hook 已发布于 v16.8.0。
没有计划从 React 中移除 class。
Hook 不会影响你对 React 概念的理解。 恰恰相反,Hook 为已知的 React 概念提供了更直接的 API:props, state,context,refs 以及生命周期。

今天就到这里了,喜欢的话可以三连哦

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React(Hook介绍) 的相关文章

  • Pytorch学习(二)使用 torchvision

    Pytorch学习 二 使用 torchvision 训练图像分类器 准备数据集 torchvision 一 导入torchvision的库 二 使用datasets CIFAR10 函数加载数据库 三 DataLoader用多进程加速ba

随机推荐

  • tensorflow历史版本源码下载地址

    最近在tensorflow对应的网站上找到了tensorflow历史版本源码的下载地址 tensorflow历史版本下载地址
  • 导入MDF文件到数据库

    1 导入脚本 EXEC sp attach db dbname yhzm filename1 d jspyhzm mdf filename2 d jspyhzm log ldf 2 Microsoft SQL Server删除数据库提示出错
  • inno setup制作的安装包,安装后以管理员身份启动

    添加管理员权限 1 在 Setup 节点添加 PrivilegesRequired admin 2 进入安装目录 找到文件SetupLdr e32 这是一个二进制配置文件 需要用到ResHacker exe这个工具修改 找到
  • Win10 WSL2-CentOS7开启systemctl命令(2022-11-18更新)

    Win10 WSL2 CentOS7开启systemctl命令 2022 11 18更新 概述 文章基于如下环境 已开启WSL2的win10或者win11 WSL2下的CentOS7 下载地址为 CentOS7 自从win10支持WSL2以
  • lanelet安装

    1 https github com KIT MRT mrt cmake modules 2 sudo apt get install libpugixml dev sudo apt get install libpugixml1v5 3
  • 群体遗传学---admixture软件快速群体分群

    群体遗传学中测的很多个个体 得到了最终的SNP vcf文件 需要将其分成群体 看那几个物种聚在一起 一般使用的软件就是STRUCTURE 但是STREUTURE运行速度极慢 后面frappe软件提升了速度 但是也不是很快 admixture
  • php 解析 %e5%80%aa%e9%a3%9e,content.json

    title Linux安装Docker date 2020 11 08T14 54 29 000Z path 2020 11 08 Linux安装Docker tags name Linux Docker slug Linux Docker
  • loC和AOP使用扩展

    6 1多种方式实现依赖注入 6 1 1构造注入 6 1 2技能训练1 6 1 3使用p命名空间实现属性注入 Spring配置文件从2 0版本开始采用schema形式 使用不同的命名空间管理不同类型的配置使得配置文件更具扩展性 列如 我们曾使
  • [Python]pip查找包的历史版本

    pip查找包的历史版本 场景 在一些时候通过pip install xxx 安装第三方库的时候默认情况下安装最新版本 由于是最新版本有个稳定性就不得不考虑其中 所以部分场景会存在一些bug这就要求我们安装历史版本 对一些更新频率比较高的三方
  • Window&linux使用换行符的问题总结

    1 Window使用Git时 设置换行符格式 参见 https www jianshu com p 6ef90ce18ba2 2 vi下设置回车换行符等特殊符号 换行方式 在早期的打印机时代 开始新的一行要占用两个字符的时间 如果到了一行的
  • java.lang.UnsatisfiedLinkError

    java lang UnsatisfiedLinkError 原因 jni注册的时候匹配写错了 I B B 如下 static JNINativeMethod methods native getSps I B B void Native
  • Keras保存模型并载入模型继续训练

    我们以MNIST手写数字识别为例 import numpy as np from keras datasets import mnist from keras utils import np utils from keras models
  • PyQt5中的按钮3-QCommandLinkButton

    PyQt5中的按钮3 QCommandLinkButton QCommandLinkButton介绍 QCommandLinkButton举例 QCommandLinkButton介绍 CommandLinkButton 外观像是一个被设置
  • verilog赋多位值_关于verilog 赋值

    1 wire表示直通 即只要输入有变化 输出马上无条件地反映 reg表示一定要有触发 输出才会反映输入 2 只有 lt 表示非阻塞 给沿触发的寄存器赋值 是阻塞赋值 给电平触发的信号赋值 3 不指定就默认为1位wire类型 专门指定出wir
  • 计算机视觉论文-2021-07-19

    本专栏是计算机视觉方向论文收集积累 时间 2021年7月19日 来源 paper digest 欢迎关注原创公众号 计算机视觉联盟 回复 西瓜书手推笔记 可获取我的机器学习纯手推笔记 直达笔记地址 机器学习手推笔记 GitHub地址 1 T
  • 在struts1.1框架下,利用smartupload实现文件的上传(可以是多个文件)

    1 前端页面upload jsp 后台处理程序UplodAction java 2 struts config的配置参数如下 没有设置 ActionForm
  • JAVA的WebService规范(支持)

    SOA Service Oriented Architecture 面向服务架构是一种思想 它将应用程序的不同功能单元通过中立的契约 独立于硬件平台 操作系统和编程语言 联系起来 使得各种形式的功能单元更好的集成 目前来说 WebServi
  • windows7旗舰版 appium环境搭建

    1 安装jdk 8u171 windows x64 exe 注意配置环境变量 参考资料 https jingyan baidu com article 6dad5075d1dc40a123e36ea3 html java version 查
  • Modbus RTU协议各知识点入门 + 实例

    文章目录 1 起因 2 几个重点 2 1 一些难懂的概念 2 2 CRC的高低位 2 3 其他 3 介绍 3 1 起源 3 2 分类 4 格式 4 1 串口协议 4 2 帧格式 5 数据类型 6 功能码 7 CRC16 modbus 8 实
  • React(Hook介绍)

    为什么要用Hook 介绍Hooks之前 首先要给大家说一下React的组件创建方式 一种是类组件 一种是纯函数组件 并且React团队希望 组件不要变成复杂的容器 最好只是数据流的管道 开发者根据需要 组合管道即可 也就是说组件的最佳写法应