在React中,组件的生命周期函数在一次加载或更新过程中只会调用一次吗?

在React的组件加载中,存在的生命周期函数会被调用,类似于一个生命的历程,其中生命周期的函数是否只会被调用一次?

阅读 5.8k
5 个回答

推荐看这篇教程
这个教程虽说有点过时,有些api以后会逐渐被废弃。但是实际上生命周期这个概念一直没有变。重点是最后面那个图
一个组件从创建到销毁很明显分三个阶段:实例化-存在期-销毁期
react中 实例化期间的生命周期函数只会在实例化时执行一次。存在期的生命周期函数会随着组件每次重新刷新(比方说setState)重复刷新。销毁期同理,销毁期的生命周期函数只在最后组件被销毁时执行一次

不一定,在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是什么

参考 Dan Abramov 做的图

React Lifecycle

推荐问题
宣传栏