简介

Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。Hook 是向下兼容的。
Hook 是一些可以让你在函数组件里“钩入” React state 及生命周期等特性的函数。Hook 不能在 class 组件中使用 —— 这使得你不使用 class 也能使用 React。

动机

在组件之间复用状态逻辑很难
React 没有提供将可复用性行为“附加”到组件的途径(例如,把组件连接到 store)。
你可以使用 Hook 从组件中提取状态逻辑,使得这些逻辑可以单独测试并复用。Hook 使你在无需修改组件结构的情况下复用状态逻辑。 这使得在组件间或社区内共享 Hook 变得更便捷。
复杂组件变得难以理解
我们经常维护一些组件,组件起初很简单,但是逐渐会被状态逻辑和副作用充斥。每个生命周期常常包含一些不相关的逻辑。
Hook 将组件中相互关联的部分拆分成更小的函数(比如设置订阅或请求数据),而并非强制按照生命周期划分。你还可以使用 reducer 来管理组件的内部状态,使其更加可预测。

难以理解的 class
你必须去理解 JavaScript 中 this 的工作方式,这与其他语言存在巨大差异。还不能忘记绑定事件处理器。
class 不能很好的压缩,并且会使热重载出现不稳定的情况。因此,我们想提供一个使代码更易于优化的 API。
为了解决这些问题,Hook 使你在非 class 的情况下可以使用更多的 React 特性。 从概念上讲,React 组件一直更像是函数。而 Hook 则拥抱了函数,同时也没有牺牲 React 的精神原则。Hook 提供了问题的解决方案,无需学习复杂的函数式或响应式编程技术。

Hooks API

  • 基础 Hook

    • useState
    • useEffect
    • useContext
  • 额外的 Hook
    • useReducer
    • useCallback
    • useMemo
    • useRef
    • useImperativeHandle
    • useLayoutEffect
    • useDebugValue

State Hook
useState 会返回一对值:当前(状态和一个让你更新它的函数。它类似 class 组件的 this.setState,但是它不会把新的 state 和旧的 state 进行合并。
useState 唯一的参数就是初始 state
可以在一个组件中多次使用 State Hook
数组解构的语法让我们在调用 useState 时可以给 state 变量取不同的名字。

Effect Hook
useEffect 就是一个 Effect Hook,给函数组件增加了操作副作用的能力。它跟 class 组件中的 componentDidMount、componentDidUpdate 和 componentWillUnmount 具有相同的用途,只不过被合并成了一个 API。
由于Effects函数是在组件内声明的,所以它们可以访问到组件的 props 和 state。
默认情况下,React 会在每次渲染后调用Effects函数 —— 包括第一次渲染的时候。
Effects函数还可以通过返回一个函数来指定如何“清除”副作用。
通过使用 Hook,你可以把组件内相关的副作用组织在一起,而不要把它们拆分到不同的生命周期函数里。
其他Hook:
useContext():让你不使用组件嵌套就可以订阅 React 的 Context。
useReducer():可以让你通过 reducer 来管理组件本地的复杂 state。

Hook 使用规则

  • Hook 就是 JavaScript 函数,但是使用它们会有两个额外的规则:
  • 只能在函数最外层调用 Hook。不要在循环、条件判断或者子函数中调用。只能在 React 的函数组件中调用 Hook。不要在其他 JavaScript 函数中调用。(还有一个地方可以调用 Hook —— 就是自定义的 Hook 中,我们稍后会学习到。)

提问

React 是如何把对 Hook 的调用和组件联系起来的?
React 保持对当前渲染中的组件的追踪。每个组件内部都有一个「记忆单元格」列表。它们只不过是我们用来存储一些数据的 JavaScript 对象。当你用 useState() 调用一个 Hook 的时候,它会读取当前的单元格(或在首次渲染时将其初始化),然后把指针移动到下一个。这就是多个 useState() 调用会得到各自独立的本地 state 的原因。

Hook 会因为在渲染时创建函数而变慢吗?
不会。在现代浏览器中,闭包和类的原始性能只有在极端场景下才会有明显的差别。
除此之外,可以认为 Hook 的设计在某些方面更加高效:1. Hook 避免了 class 需要的额外开支,像是创建类实例和在构造函数中绑定事件处理器的成本。2. 符合语言习惯的代码在使用 Hook 时不需要很深的组件树嵌套。这个现象在使用高阶组件、render props、和 context 的代码库中非常普遍。组件树小了,React 的工作量也随之减少。
传统上认为,在 React 中使用内联函数对性能的影响,与每次渲染都传递新的回调会如何破坏子组件的 shouldComponentUpdate 优化有关。Hook 从三个方面解决了这个问题。

  1. useCallback Hook 允许你在重新渲染之间保持对相同的回调引用以使得 shouldComponentUpdate 继续工作:
// 除非 `a` 或 `b` 改变,否则不会变
const memoizedCallback = useCallback(() => {doSomething(a, b);
}, [a, b]);
  1. useMemo Hook 使得控制具体子节点何时更新变得更容易,减少了对纯组件的需要。
  2. useReducer Hook 减少了对深层传递回调的依赖,正如下面解释的那样。

总结,引用转载自官网
https://react.docschina.org/docs/hooks-intro.html#no-breaking-changes

Hook是什么,React为什么要引入Hook相关推荐

  1. 这可能是你们都在找的:React 纯原生纯hook多标签微前端

    项目地址:https://github.com/X-neuron/antdFront.git 项目特点:     1.采用webpack.babel.antd 等较为原生的配置和函数组件搭建,支持pw ...

  2. react 进阶必学 hook (三):useContext 面馆分店开张了

    系列文章传送门: react 进阶必学 hook (一):useState 来一碗大碗宽面 react 进阶必学 hook (二):useEffect 专治不吃宽面 react 进阶必学 hook ( ...

  3. react 进阶必学 hook (一):useState 来一碗大碗宽面

    系列文章传送门: react 进阶必学 hook (一):useState 来一碗大碗宽面 react 进阶必学 hook (二):useEffect 专治不吃宽面 react 进阶必学 hook ( ...

  4. [react] 在React中如何引入图片?哪种方式更好?

    [react] 在React中如何引入图片?哪种方式更好? 第一种导入: import Img from "./images/1.png" 第二种直接获取图片: <img s ...

  5. Hook技术之消息拦截(Windows Hook )

    首先来说说windows 消息Hook,这个消息Hook就是我们常用的通过SetWindowsHookEx来设置一个Hook,这个函数通过将这个Hook插入到Hook链的最前端,而发送给我们已经Hoo ...

  6. android hook 第三方app_基于 VirtualApp 结合 whale hook框架实现hook第三方应用

    要点 1. whale hook framework 使用示例: 2. 参考项目:VirtualHook: 3. 按照 VirtualHook 修改 VirtualApp: 4. 编写 hook pl ...

  7. react css 模块引入

    原文链接: react css 模块引入 上一篇: react todos 简单实现 下一篇: react input 双向绑定 style 行内设置.传递一个对象 <div style={{h ...

  8. react如何使用@引入文件路径?

    react如何使用@引入文件路径? 问题: 最近忙于毕设,使用react脚手架搭建的项目,在引入文件时出现了下面的情况: 预期效果: 这样大大提升了代码的美观度,而且简洁明了. 1.暴露配置文件 re ...

  9. React项目中引入图片

    React项目中引入图片 一.场景描述 二.import 三.require 一.场景描述 当我们在react项目中使用img标签时,活着style中使用背景图片时,直接使用相对路径会无法引入图片. ...

最新文章

  1. Module not found: Can‘t resolve ‘@babel/runtime/helpers/esm/extends‘ in ‘C:\Users\wdg\Desktop\Ant-De
  2. Linux记录-普通用户下执行sudo xxx 找不到命令解决方案
  3. java汽车租赁系统_汽车租赁公司全网低价
  4. @webservice报错org.apache.cxf.common.i18n.UncheckedException: No operation was found with
  5. 内核并发控制---顺序锁 (来自网易)
  6. paip.输入法编程---输入法ATIaN历史记录 v8b
  7. 小京东商城用什么版本的php,小京东2018多用户通用商城网源码商城带手机版ecshop源码程序...
  8. 安卓版本客户端2.1
  9. 大白话理解后端CRUD
  10. 计算机发展史的十大成就,我国在自然科学领域的十大成就都有哪些?
  11. 50个最受欢迎的大数据面试问题
  12. Unity支持的C#版本
  13. OpenStack 快速进阶教程
  14. Java 基础接口——fly
  15. Paper Reading Notes
  16. 【操作系统知识】段页式存储管理
  17. iOS UILabel 单词自动换行
  18. CSAPP Lab3: Buffer Bomb
  19. 服务器维修合同样本,最新在线维修服务协议
  20. ganache-cli命令行参数

热门文章

  1. Google Earth Engine(GEE)——下载2020-2021年的NDBI
  2. 中国锂电池粘结剂行业发展现状分析,主要为PVDF「图」
  3. u-boot中的usb命令
  4. VS2017初学者如何打开右侧的解决方案资源管理器
  5. openldap用法
  6. 从企业钉钉的接口获取数据
  7. 常用html/css/js学习(会持续更新)
  8. 程序员用代码写合租广告,网友神评亮了
  9. 第五章第三题(将千克转换成磅)(Conversion from kilogram to pound)
  10. 【计算机科学基础】计算理论基础