作者回复: 你好,Geek_8aba0d,非常棒的答案。 父子组件均为类组件时,生命周期方法的执行顺序正如你所描述的。至于函数组件+Hooks,如果你感兴趣,可以加入一些useEffect(虽然第10节课才会讲)打console.log来观察一下。 Fiber协调引擎里有一些有趣的细节,我争取在最近的课程加餐中安排进来。
作者回复: 你好,Geek_8aba0d,你的感觉跟很多人是一样的,包括刚接触Hooks时的我。 useEffect的详细内容在后面第10节课会讲,到放在这节课有点超纲,不过在这里我可以先剧透一下。 这里之所以大家会认为反直觉,很大程度上是因为大家把componentDidMount 和 componentWillUnmount 这一对类组件的生命周期方法当作了参照物。如果这样看的话,仿佛是在说同一个组件的 componentWillUnmount 发生在了 componentDidMount 之前,不合逻辑,理应出错的。 我建议这里先暂时不要考虑类组件,直接用副作用这个概念来理解。useEffect为函数组件声明了副作用,在不加入第二个参数(依赖值数组)的前提下,每次组件渲染都会执行,即每次渲染都会产生新的副作用(包含新的闭包),并留到这次的提交阶段执行,当执行的返回值是一个函数的时候,这个函数就是这次副作用的清理函数。 如第N次渲染,就会在提交阶段执行第N次副作用,返回第N次副作用的清理函数;下次第N+1次渲染,会在提交阶段先执行第N次副作用的清理函数,然后才是执行第N+1次副作用,返回第N+1次的清理函数;以此类推。
作者回复: 你好,CondorHero,收到,看来文稿里应该用全小写的“antd”,谢谢指正。我和专栏编辑先记录一下,下次一起更新文稿。
作者回复: 你好,01,你说得对。在Fiber协调引擎中,真正主导的生命周期其实就是渲染阶段和提交阶段,所有组件完成渲染阶段才能进入提交阶段,完成提交阶段才进入下一轮渲染阶段。从这个角度看,传统的挂载、更新、卸载三个组件生命周期,在父子组件间确实是交叉进行的。 不过如果把视角放回单个组件上,挂载、更新、卸载三个生命周期可以对应到不少Fiber在组件层面的内部实现,还是有掌握的必要的。 正如你所说,在提交阶段,useLayoutEffect的副作用回调和清除函数是同步执行的,而useEffect的的副作用回调和清除函数是异步执行的。我已经更新了文稿中的配图,虽然依旧省略了一些细节,但比之前的版本更准确地表达了useEffect执行的时机。
作者回复: 你好,船长,你的理解从概念上是对的。父子组件生命周期方法或Hooks的执行遵守这个顺序。Fiber协调引擎里有一些有趣的细节,我争取在最近的课程加餐中安排进来。