React Hooks 核心原理与实战
王沛
eBay 中国研发中心资深技术专家
10740 人已学习
新⼈⾸单¥59
登录后,你可以任选2讲全文学习
课程目录
已完结/共 25 讲
React Hooks 核心原理与实战
15
15
1.0x
00:00/00:00
登录|注册

05|进一步认识 Hooks :如何正确理解函数组件的生命周期?

你好,我是王沛。今天我们来聊聊 React 组件的生命周期。
这一讲我会带你从 Hooks 的角度进一步理解 React 函数组件的生命周期。你可能会有疑问,前面几节课我们已经学习了 Hooks 的概念和内置 Hooks 的用法,那为什么还会有专门一讲来进一步介绍 Hooks 呢?
原因主要有两个。一方面,如果你已经熟悉了 Class 组件的生命周期,那么还需要一个转换编程思想到 Hooks 的过程,这样才能避免表面上用了 Hooks,却仍然用 Class 组件的方式思考问题。
另一方面,如果你是新接触 React,那么这一讲也能帮你了解原来 Class 组件的工作方式,从而如果看到或接手已有的 React 项目,也能从容应对。

忘掉 Class 组件的生命周期

基于 Class 的组件作为 React 诞生之处就存在的机制,它的用法早已深入人心,甚至至今为止 React 的官方文档中仍然是以 Class 组件为基础的,而函数组件和 Hooks 则是作为新特性做了补充说明和解释。
这其实有两个原因:
一是 React 团队尽最大努力保持 API 的稳定,不希望给你造成一种 Class 组件将被废弃的感觉;
二是大量的存量应用其实还都是用 Class 组件实现的,无论是对于维护者还是加入者来说,了解 Class 组件都是很有必要的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

React Hooks是React函数组件中的重要特性,本文从Hooks的角度深入探讨了React函数组件的生命周期。作者强调了忘记Class组件的生命周期是使用Hooks的关键,因为函数组件和Class组件的开发思路有很大不同。在函数组件中,通过useEffect这个Hook来描述副作用,而不再需要手动判断Props或State的变化。函数组件中没有构造函数的概念,但可以利用useRef来实现一次性的初始化逻辑。通过对比Class组件和函数组件的生命周期机制,帮助读者更好地理解和使用Hooks,从而更自然地解决问题。Hooks的机制更具有语义化,使得代码更加自然和合理。文章还提到了已有应用是否应该迁移到Hooks的问题,强调了类组件和函数组件可以共存,并且在实现具体的业务功能时,应该尽量从Hooks的语义角度出发去思考组件是如何展现和交互的。文章内容深入浅出,对于React开发者来说具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《React Hooks 核心原理与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(18)

  • 最新
  • 精选
  • Ada
    如果想要实现只执行一次的功能,用useEffect,依赖项传空数组,不是可以实现吗? 为什么要写一个自定义钩子?

    作者回复: 因为需要在函数体执行之前执行。useEffect 是在 render 完后执行。

    2021-06-03
    3
    56
  • 毛毛开飞机
    useEffect(() => { return () => { // 这里只会在组件销毁前(componentWillUnmount)执行一次 } }, [])

    作者回复: 正确~

    2021-06-03
    31
  • 海洋
    useEffect 第二个参数传入空,就只在组件初始化时和销毁前分别执行一次

    作者回复: 没错~ 传入空数组就可以了。

    2021-06-03
    2
    7
  • Geek_12f953
    老师,useSingleton这个Hook里面使用useRef来定义called标记而不是用useState,是因为called并不会影响UI渲染吗?我尝试了用useState好像也可以实现只执行一次的效果

    作者回复: 确实如此,useState 会导致多余的渲染。

    2021-08-03
    4
  • 花儿与少年
    请教: 以下代码不是每次render后都会执行吗,return的函数在每次effect执行前执行? useEffect(() => { return () => { // 这里只会在组件销毁前(componentWillUnmount)执行一次 } }, [])

    作者回复: useEffect 接收的 callback 是在 依赖发生变化以及第一次时执行,return 的函数是在下一次 callback 执行之前执行,或者销毁时执行。这段代码的 依赖项为空,所以只会在最后组件销毁时执行。

    2021-08-02
    4
  • Isaac
    老师,useEffect 的执行时机是 DOM 渲染完毕后执行,还是依赖发生变化,不管 DOM 有没有更新完毕就立即执行?

    作者回复: DOM 渲染后执行。

    2021-06-09
    4
  • 大大小小
    BlogView那个例子,为什么要把useCallback返回的函数作为useEffect的依赖呢?是要达到什么目的吗?

    作者回复: 所有在 useEffect 中用到的变量都应该被作为依赖的参数,这样在 useEffect 执行的时候才会执行正确的回调函数。

    2021-06-03
    3
    4
  • Geek_sky
    老师,我看到useRef的用法有一个疑问:例子中useSingleton包含了一个useRef的定义为false,如果我在MyComp中定义多个useSingleton,程序在启动的时候第二次及之后的调用useRef是怎么确认需要创建新的还是使用之前的?那么界面在刷新之后,useSingleton会再次被调用,那时会有多个useRef的检查,那么程序又是如何判定的?

    作者回复: useRef 是定义一个当前组件实例上的一个变量。所以组件重新 mount,或者多实例,是互不相关的。

    2021-06-09
    3
  • Joseph😈
    请问下老师,如果只是为了做初始化工作,即只在首次render前执行一次。useSingleton这个自定义hook似乎换成useState或useEffect似乎都能做呀,跟useRef相比有没有什么优劣呢?

    作者回复: useEffect 是在组件 render 完后才执行的,这里的 useSingleton 可以在函数体内直接执行,而不是 render 完之后。

    2021-06-06
    3
    1
  • 浩然
    useEffect(() => { return () => { // 组件销毁时执行 } }, [])

    作者回复: 正确!

    2021-06-03
    1
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部