1. 引言

工具型文章要跳读,而文学经典就要反复研读。如果说 React 0.14 版本带来的各种生命周期可以类比到工具型文章,那么 16.7 带来的 Hooks 就要像文学经典一样反复研读。

Hooks API 无论从简洁程度,还是使用深度角度来看,都大大优于之前生命周期的 API,所以必须反复理解,反复实践,否则只能停留在表面原地踏步。

相比 useState 或者自定义 Hooks 而言,最有理解难度的是 useEffect 这个工具,希望借着 a-complete-guide-to-useeffect 一文,深入理解 useEffect

原文非常长,所以概述是笔者精简后的。作者是 Dan Abramov,React 核心开发者。

2. 概述

unLearning,也就是学会忘记。你之前的学习经验会阻碍你进一步学习。

想要理解好 useEffect 就必须先深入理解 Function Component 的渲染机制,Function Component 与 Class Component 功能上的不同在上一期精读 精读《Function VS Class 组件》 已经介绍,而他们还存在思维上的不同:

Function Component 是更彻底的状态驱动抽象,甚至没有 Class Component 生命周期的概念,只有一个状态,而 React 负责同步到 DOM。 这是理解 Function Component 以及 useEffect 的关键,后面还会详细介绍。

由于原文非常非常的长,所以笔者精简下内容再重新整理一遍。原文非常长的另一个原因是采用了启发式思考与逐层递进的方式写作,笔者最大程度保留这个思维框架。

从几个疑问开始

假设读者有比较丰富的前端 & React 开发经验,并且写过一些 Hooks。那么你也许觉得 Function Component 很好用,但美中不足的是,总有一些疑惑萦绕在心中,比如:

  • 精读《useEffect 完全指南》的更多相关文章

    1. 精读《V8 引擎 Lazy Parsing》

      1. 引言 本周精读的文章是 V8 引擎 Lazy Parsing,看看 V8 引擎为了优化性能,做了怎样的尝试吧! 这篇文章介绍的优化技术叫 preparser,是通过跳过不必要函数编译的方式优化性 ...

    2. 深入浏览器工作原理和JS引擎(V8引擎为例)

      浏览器工作原理和JS引擎 1.浏览器工作原理 在浏览器中输入查找内容,浏览器是怎样将页面加载出来的?以及JavaScript代码在浏览器中是如何被执行的? 大概流程可观察以下图: 首先,用户在浏览器搜 ...

    3. [翻译] V8引擎的解析

      原文:Parsing in V8 explained 本文档介绍了 V8 引擎是如何解析 JavaScript 源代码的,以及我们将改进它的计划. 动机 我们有个解析器和一个更快的预解析器(~2x), ...

    4. 一文搞懂V8引擎的垃圾回收

      引言 作为目前最流行的JavaScript引擎,V8引擎从出现的那一刻起便广泛受到人们的关注,我们知道,JavaScript可以高效地运行在浏览器和Nodejs这两大宿主环境中,也是因为背后有强大的V ...

    5. Chrome V8引擎系列随笔 (1):Math.Random()函数概览

      先让大家来看一幅图,这幅图是V8引擎4.7版本和4.9版本Math.Random()函数的值的分布图,我可以这么理解 .从下图中,也许你会认为这是个二维码?其实这幅图告诉我们一个道理,第二张图的点的分 ...

    6. (译)V8引擎介绍

      V8是什么? V8是谷歌在德国研发中心开发的一个JavaScript引擎.开源并且用C++实现.可以用于运行于客户端和服务端的Javascript程序. V8设计的初衷是为了提高浏览器上JavaScr ...

    7. 浅谈Chrome V8引擎中的垃圾回收机制

      垃圾回收器 JavaScript的垃圾回收器 JavaScript使用垃圾回收机制来自动管理内存.垃圾回收是一把双刃剑,其好处是可以大幅简化程序的内存管理代码,降低程序员的负担,减少因 长时间运转而带 ...

    8. V8引擎嵌入指南

      如果已读过V8编程入门那你已经熟悉了如句柄(handle).作用域(scope)和上下文(context)之类的关键概念,以及如何将V8引擎作为一个独立的虚拟机来使用.本文将进一步讨论这些概念,并介绍 ...

    9. 浅谈V8引擎中的垃圾回收机制

      最近在看<深入浅出nodejs>关于V8垃圾回收机制的章节,转自:http://blog.segmentfault.com/skyinlayer/1190000000440270 这篇文章 ...

    10. 深入出不来nodejs源码-V8引擎初探

      原本打算是把node源码看得差不多了再去深入V8的,但是这两者基本上没办法分开讲. 与express是基于node的封装不同,node是基于V8的一个应用,源码内容已经渗透到V8层面,因此这章简述一下 ...

    随机推荐

    1. Mac上使用jenkins+git持续集成浅析

      本文旨在让同学们明白如何让jenkis在mac笔记本上运行,并实际与一个最简单的git地址交互并执行简单的jenkins任务,如果学习本文,需要先按照https://www.cnblogs.com/x ...

    2. Python-写文件

      写文件需要三步:打开文件写入内容关闭文件 写入内容一般要选择打开的模式:f = open('out.txt','w')此处的w就是writing,代表以写入文件的模式打开,原文件里的内容会被新写入覆盖 ...

    3. On the Optimal Approach of Survivable Virtual Network Embedding in Virtualized SDN

      Introduction and related work 云数据中心对于虚拟技术是理想的创新地方. 可生存性虚拟网络映射(surviavable virtual network embedding ...

    4. 解决iPhone Safari 兼容性CSS背景显示不全问题

      https://jingyan.baidu.com/article/ca2d939d014ccbeb6c31ceb7.html 看到了这个文章解决的.中心部分小于980的时候回出现.苹果手机中的saf ...

    5. 解决fastJson无序问题

      对外提供接口,第三方传过来的参数没问题.可是用fastJson 转换的出现 参数顺序不一致,导致 验签失败 解决fastJosn 转换无序问题 https://github.com/alibaba/f ...

    6. Linux系统如何添加IP别名

      IP别名可以在一块物理网卡上绑定多个IP地址,这样就能够在使用单一网卡的同一个服务器上运行多个基于IP的虚拟主机,简单来说,IP别名就是一张物理网卡上配置多个IP,实现类似子接口之类的功能. 那么IP ...

    7. 数据库mysql大全(高级版)

      1.说明:创建数据库 CREATE DATABASE database-name .说明:删除数据库 drop database dbname .说明:备份sql server --- 创建 备份数据 ...

    8. sublime No packages available for installation

      package control user-setting 中添加: "channels": [ "C:\\channel_v3.json" ], channel ...

    9. js 阻止事件执行

      三种阻止事件执行的方式 event.preventDefault() event.stopPropagation() return false event.preventDefault() 阻止特定事 ...

    10. Portainer介绍

      Portainer是Docker的图形化管理工具,提供状态显示面板.应用模板快速部署.容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作).事件日志显示.容器控制台操作.Swarm集群和服 ...