就像 Android 开发中的 View 同样,React Native(RN) 中的组件也有生命周期(Lifecycle)。所谓生命周期,就是一个对象从开始生成到最后消亡所经历的状态,理解生命周期,是合理开发的关键。RN 组件的生命周期整理以下图:安全
如图,能够把组件生命周期大体分为三个阶段:网络
下面来详细介绍生命周期中的各回调函数。框架
在组件建立以前,会先调用 getDefaultProps()
,这是全局调用一次,严格地来讲,这不是组件的生命周期的一部分。在组件被建立并加载候,首先调用 getInitialState()
,来初始化组件的状态。函数
而后,准备加载组件,会调用 componentWillMount()
,其原型以下:性能
void componentWillMount()
这个函数调用时机是在组件建立,并初始化了状态以后,在第一次绘制 render()
以前。能够在这里作一些业务初始化操做,也能够设置组件状态。这个函数在整个生命周期中只被调用一次。this
在组件第一次绘制以后,会调用 componentDidMount()
,通知组件已经加载完成。函数原型以下:spa
void componentDidMount()
这个函数调用的时候,其虚拟 DOM 已经构建完成,你能够在这个函数开始获取其中的元素或者子组件了。须要注意的是,RN 框架是先调用子组件的 componentDidMount()
,而后调用父组件的函数。从这个函数开始,就能够和 JS 其余框架交互了,例如设置计时 setTimeout
或者 setInterval
,或者发起网络请求。这个函数也是只被调用一次。这个函数以后,就进入了稳定运行状态,等待事件触发。code
若是组件收到新的属性(props),就会调用 componentWillReceiveProps()
,其原型以下:component
void componentWillReceiveProps( object nextProps )
输入参数 nextProps
是即将被设置的属性,旧的属性仍是能够经过 this.props
来获取。在这个回调函数里面,你能够根据属性的变化,经过调用 this.setState()
来更新你的组件状态,这里调用更新状态是安全的,并不会触发额外的 render()
调用。以下:对象
componentWillReceiveProps: function(nextProps) { this.setState({ likesIncreasing: nextProps.likeCount > this.props.likeCount }); }
当组件接收到新的属性和状态改变的话,都会触发调用 shouldComponentUpdate(...)
,函数原型以下:
boolean shouldComponentUpdate( object nextProps, object nextState )
输入参数 nextProps
和上面的 componentWillReceiveProps
函数同样,nextState
表示组件即将更新的状态值。这个函数的返回值决定是否须要更新组件,若是 true
表示须要更新,继续走后面的更新流程。否者,则不更新,直接进入等待状态。
默认状况下,这个函数永远返回 true
用来保证数据变化的时候 UI 可以同步更新。在大型项目中,你能够本身重载这个函数,经过检查变化先后属性和状态,来决定 UI 是否须要更新,能有效提升应用性能。
若是组件状态或者属性改变,而且上面的 shouldComponentUpdate(...)
返回为 true
,就会开始准更新组件,并调用 componentWillUpdate()
,其函数原型以下:
void componentWillUpdate( object nextProps, object nextState )
输入参数与 shouldComponentUpdate
同样,在这个回调中,能够作一些在更新界面以前要作的事情。须要特别注意的是,在这个函数里面,你就不能使用 this.setState
来修改状态。这个函数调用以后,就会把 nextProps
和 nextState
分别设置到 this.props
和 this.state
中。紧接着这个函数,就会调用 render()
来更新界面了。
调用了 render()
更新完成界面以后,会调用 componentDidUpdate()
来获得通知,其函数原型以下:
void componentDidUpdate( object prevProps, object prevState )
由于到这里已经完成了属性和状态的更新了,此函数的输入参数变成了 prevProps
和 prevState
。
当组件要被从界面上移除的时候,就会调用 componentWillUnmount()
,其函数原型以下:
void componentWillUnmount()
在这个函数中,能够作一些组件相关的清理工做,例如取消计时器、网络请求等。
到这里,RN 的组件的完整的生命都介绍完了,在回头来看一下前面的图,就比较清晰了,把生命周期的回调函数总结成以下表格:
生命周期 | 调用次数 | 可否使用 setSate() |
---|---|---|
getDefaultProps | 1(全局调用一次) | 否 |
getInitialState | 1 | 否 |
componentWillMount | 1 | 是 |
render | >=1 | 否 |
componentDidMount | 1 | 是 |
componentWillReceiveProps | >=0 | 是 |
shouldComponentUpdate | >=0 | 否 |
componentWillUpdate | >=0 | 否 |
componentDidUpdate | >=0 | 否 |
componentWillUnmount | 1 | 否 |