在React的组件加载中,存在的生命周期函数会被调用,类似于一个生命的历程,其中生命周期的函数是否只会被调用一次?
在React的组件加载中,存在的生命周期函数会被调用,类似于一个生命的历程,其中生命周期的函数是否只会被调用一次?
不一定,在fiber架构之后,像componentWillMount()、componentWillUpdate()以及componentWillReceiveProps()都可能被调用多次。
在React15.x版本及其之前,React组件从创建,存在,销毁三个过程,除了存在时候的更新生命周期会被多次调用(接受到来自父组件的props),其他两个阶段的生命周期钩子,只会被执行一次。
在React16.x版本,通过引入了fiber,优化底层在渲染组件的过程,将原来React15.x版本一旦收到更新,就不遗余力的必须渲染出页面才结束的任务进行了分片处理。即在渲染的组件的整个过程中,会分成多个时间片任务,每个时间片执行结束后,会将当前主线程的控制权拿出来,交给React判断,当前是否还有更为紧急的任务,如果由先执行其他任务。而之前时间未执行完的任务会被废弃,重新开始执行,这样也就造就了一些生命周期函数会多次执行的情况。
fiber会将生命周期钩子分为两个部分
reconciliation phase和commit phase
reconciliation phase
:
componentWillMount
componentWillReceiveProps
shouldComponentUpdate
componentWillUpdate
commit phase
:
componentDidMount
componentDidUpdate
componentWillUnmount
reconciliation阶段的生命钩子有可能会被多次调用
可以参考React Fiber是什么
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
6 回答2.2k 阅读
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.7k 阅读✓ 已解决
推荐看这篇教程
这个教程虽说有点过时,有些api以后会逐渐被废弃。但是实际上生命周期这个概念一直没有变。重点是最后面那个图。
一个组件从创建到销毁很明显分三个阶段:实例化-存在期-销毁期。
react中 实例化期间的生命周期函数只会在实例化时执行一次。存在期的生命周期函数会随着组件每次重新刷新(比方说setState)重复刷新。销毁期同理,销毁期的生命周期函数只在最后组件被销毁时执行一次