现代 React Web 开发实战
宋一玮
FreeWheel 中国研发中心前端架构师
16115 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 31 讲
现代 React Web 开发实战
15
15
1.0x
00:00/00:00
登录|注册

09|React Hooks(上):为什么说在React中函数组件和Hooks是绝配?

你好,我是宋一玮,欢迎回到 React 应用开发的学习。
上节课我们学习了 React 组件的生命周期,包括组件层面的挂载、更新、卸载、错误处理四个阶段,以及框架层面的渲染和提交这两个阶段。
在这些阶段中,我们列举了类组件的 rendercomponentDidMountcomponentWillUnmount 等生命周期方法,以及这些方法执行的先后顺序,也对比了函数组件中的 Hooks 是如何参与组件生命周期的。最后,我们利用 useEffect Hooks 函数,为 oh-my-kanban 项目新加了一个定时更新卡片显示时间的功能。
敏锐的你可能发现了,上节课中你只为函数组件写了 Hooks 代码,而类组件的生命周期方法仅是介绍而已。还有就是截止目前,oh-my-kanban项目里只有函数组件,一个类组件都没有——同样是组件,类组件怎么就被区别对待了呢?其实不是类组件掉了链子,只是函数组件加 Hooks 这对黄金搭档后来居上,抢了类组件的风头。
接下来你可能还会有疑问:
Hooks 到底是什么?怎么用?
函数组件加 Hooks 可以完全替代类组件吗?
还有必要学习类组件吗?
这节课和下节课,我们将学习 React 自 v16.8.0 版本加入的 Hooks API。当你完成这两节课的学习,相信在掌握 Hooks 使用的同时,也会对函数组件和类组件在今后 React 应用开发中的地位,拥有自己的独立判断。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

React Hooks是React v16.8.0版本引入的一种重要的组件逻辑实现方式,它可以用于操作state、定义副作用,并支持开发者自定义Hooks。Hooks借鉴自函数式编程,使得函数组件能够更加贴近React理想模型`UI=f(state)`。本文深入浅出地介绍了React Hooks的概念和使用方法,对于想要深入学习React应用开发的读者来说,是一篇值得阅读的文章。 文章介绍了基础Hooks和其他变体,包括useState、useEffect、useContext等。此外,还讨论了useState的使用方法和性能优化,以及useReducer和更新state的自动批处理。通过本文,读者可以快速了解React Hooks的基本概念和使用技巧,为进一步学习和应用React Hooks打下基础。 在具体内容方面,文章通过实例介绍了在组件内使用可变值的方法,引入了useRef这个Hook,并结合实际案例展示了其用法。同时,文章还提出了思考题,引导读者深入思考和实践,以加深对Hooks的理解。 总的来说,本文通过清晰的讲解和实例演示,使读者能够快速了解React Hooks的基本概念和使用技巧,为进一步学习和应用React Hooks打下基础。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《现代 React Web 开发实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • 🐑
    置顶
    你好,我是《现代React Web开发实战》的编辑辰洋,这是👇项目的源代码链接,供你学习与参考: https://gitee.com/evisong/geektime-column-oh-my-kanban/releases/tag/v0.9.0
    2022-09-14归属地:北京
    1
    1
  • 若川
    1. React官方文档:Hook 规则 https://zh-hans.reactjs.org/docs/hooks-rules.html 1.1 只在最顶层使用 Hook。不要在循环,条件或嵌套函数中调用 Hook。 1.2 只在 React 函数中调用 Hook。不要在普通的 JavaScript 函数中调用 Hook。 因为本质是链表。在各种判断中写 Hook 会导致节点错乱。 2. useRef 中值变化是不会触发重新渲染。useState 中则是会触发渲染。

    作者回复: 你好,若川,很棒的答案!

    2022-09-12归属地:北京
    7
    16
  • 01
    18 批处理依托的 它的调度器。 可中断。 进入commit 阶段 则不可中断。 是否只渲染一次 这个不一定吧

    作者回复: 你好,01,我赞同你说的。调度器会根据各个state updater的优先级,调整执行顺序,如果这一轮更新不超时,所有队列里的state updater都能执行完,那就一次渲染搞定;如果更新超时,则把未完成的updater留到下次渲染,这就造成了多次渲染的情况(为了保证state结果一致,有时还需要把上一次渲染中已经执行过的高优先级updater再重复执行一遍)。

    2022-09-20归属地:北京
    1
  • __Initial
    我想问一下:在state自动批处理时,为什么使用函数参数就可以保证更新函数使用最新的state

    作者回复: 你好,__Initial,在React 18的Fiber协调引擎中,state的更新会被加入到一个名为updateQueue的单向链表中,当顺序执行更新时,如果当前更新就是一个state值,则记录这个值为newState,执行入下一个更新;如果当前更新是一个函数,则把上一个更新时记录的newState值传给函数作为参数,更新函数执行的结果会覆盖newState值,然后继续执行下一个更新。 如果你感兴趣可以读一下这部分的React源码: https://github.com/facebook/react/blob/v18.2.0/packages/react-reconciler/src/ReactFiberClassUpdateQueue.old.js#L573-L580

    2022-09-19归属地:北京
    1
  • 风太大太大
    1. 函数组件之外的一个普通函数中调用 useState 不会生效 2. 函数组件内部加一个 if 条件语句,在满足条件时才去调用 useState 不会生效。 3. 在这个函数内部调用 useState,再在函数组件内调用这个函数。 useState 不会生效

    作者回复: 你好,风太大太大,很棒的答案!正如你所回答的,这些就是第10讲会讲到的React Hooks的使用规则。 另外在开发模式下,当开发者违反了使用规则时,React的Lint规则会提示错误,同时编译工具也会报错,如: Compiled with problems: ERROR src/KanbanNewCard.js Line 17:15: React Hook "useEffect" is called conditionally. React Hooks must be called in the exact same order in every component render react-hooks/rules-of-hooks 这是很好的开发者体验。

    2022-09-16归属地:北京
    1
  • joel
    useRef 来代替 useState 吗? 不能,这两个是不同的使用场景,usestate 是可以出发react 的协调过程,useref 不能

    作者回复: 你好,joel,很棒的答案。更具体来说,调用 useState返回的state更新函数会触发React的协调过程,而为useRef返回的ref.current赋值并不会。

    2022-09-15归属地:北京
    1
  • 学习前端-react
    隔了好久,回答第二个问题。 useRef 的使用方式是用用会存放一个最新的值即 current,每次修改也不会触发当前组件的render,这个应该就区别于 useState 了,因为setState 会触发当前组件的render。

    作者回复: 你好,学习前端-react,赞,很棒的答案。

    2022-09-17归属地:北京
  • 奕晨
    Hook 在使用中都会有哪些限制: 1. 在函数组件之外的一个普通函数中调用 useState; 在函数组件之外的普通函数不能调用 useState; 2. 在函数组件内部加一个 if 条件语句,在满足条件时才去调用 useState; 不能 3. 在函数组件内部定义一个函数,在这个函数内部调用 useState,再在函数组件内调用这个函数。 不能 只能在React函数中调用Hook。 可以用 useRef 来代替 useState 吗? 不可以,useState会重新渲染,useRef 值发生变化,不会重新渲染。
    2023-01-11归属地:山东
    1
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部