学习一门语言,我觉得首先要了解它的运行机制,要知道它在哪里干什么事,什么时候开始创建,又什么时候消亡,即生命周期。PC也好,手机也好,内存都是固定的,只有这么多,运行在上面的软件不可能一直都占有着内存,肯定有释放的时候。现在就在此记录下在React Native中组件的生命周期。
可以把组件的生命周期分为三个阶段:
- 是组件第一次绘制阶段,如图中的上面虚线框内在这里完成了组件的加载和初始化。
- 是组件在运行和交互阶段,如图中左下方虚线框内这个阶段组件完成用户交互,或者接收事件更新界面。
- 是组件消亡的阶段如图右下角的虚线框内,这里做一些组件的清理工作。
最常用的是第一阶段。第一阶段功能分析
getDefaultProps函数
在组件创建之前会调用该函数,该函数用于初始化一些默认的属性,通常会将固定的内容放在这个函数中初始化和赋值。
在组件中可以通过this.props
获取在这里初始化的属性由于组件初始化后,再次使用该组件不会调用getDefaultProps
函数,所以组件自己不可以自己修改props
(即:props
可认为是只读的),只可由其他组件调用它时在外部修改。即可以用来组件间的传值。例如:在A.js
中传值给B.js
。在A.js
中可以这样写<B imageDataArr = {this.state.headerDataArr}/>
在B.js中可以这样写,接收值`getDefaultProps(){
},`return{ imageDataArr:[] };
getInitialState函数
该函数是用于对组件的一些状态进行初始化;
由于该函数不同于getDefaultProps
,在以后的过程中,会再次调用,所以可以将控制控件的状态的一些变量放在这里初始化,如控件上显示的文字,可以通过this.state
来获取值,通过this.setState
来修改state
值, 比如:
|
|
注意:一旦调用了this.setState
方法,组件一定会调用render
方法,对组件进行再次的渲染,不过,如果React框架会自动根据DOM的状态来判断是否需要真正的渲染。
componentWillMount函数
相当于OC中的ViewWillAppear
方法,这个函数调用时机是在组件创建,并初始化了状态之后,在第一次绘制 render()
之前。可以在这里做一些业务初始化操作,也可以设置组件状态。这个函数在整个生命周期中只被调用一次。
render函数
render
是一个组件中必须有的方法,本质上是一个函数,并返回JSX或其他组件来构成DOM,和Android的XML布局类似,注意:只能返回一个顶级元素 ;
此外,在render
函数中,只可通过this.state
和this.props
来访问在之前函数中初始化的数据值 。
componentDidMount函数
这个函数调用的时候,其虚拟 DOM 已经构建完成,你可以在这个函数开始获取其中的元素或者子组件了。需要注意的是,RN 框架是先调用子组件的 componentDidMount()
,然后调用父组件的函数。
从这个函数开始,就可以和 JS 其他框架交互了,例如设置计时 setTimeout
或者 setInterval
,或者发起网络请求。这个函数也是只被调用一次。这个函数之后,就进入了稳定运行状态,等待事件触发。
第二阶段功能分析
####componentWillReceiveProps函数
如果组件收到新的属性(props),就会调用 void componentWillReceiveProps(
object nextProps
)
输入参数 nextProps
是即将被设置的属性,旧的属性还是可以通过 this.props
来获取。在这个回调函数里面,你可以根据属性的变化,通过调用 this.setState()
来更新你的组件状态,这里调用更新状态是安全的,并不会触发额外的 render()
调用。
shouldComponentUpdate函数
当组件接收到新的属性和状态改变的话,都会触发调用boolean shouldComponentUpdate(
object nextProps, object nextState,...
)
输入参数 nextProps
和上面的 componentWillReceiveProps
函数一样,nextState
表示组件即将更新的状态值。这个函数的返回值决定是否需要更新组件,如果 true 表示需要更新,继续走后面的更新流程。否者,则不更新,直接进入等待状态。
默认情况下,这个函数永远返回 true 用来保证数据变化的时候 UI 能够同步更新。在大型项目中,你可以自己重载这个函数,通过检查变化前后属性和状态,来决定 UI 是否需要更新,能有效提高应用性能。
componentWillUpdate函数
如果组件状态或者属性改变,并且上面的 shouldComponentUpdate(…) 返回为 true,就会开始准更新组件,并调用 void componentWillUpdate(
object nextProps, object nextState
)
输入参数与 shouldComponentUpdate
一样,在这个回调中,可以做一些在更新界面之前要做的事情。需要特别注意的是,在这个函数里面,你就不能使用 this.setState
来修改状态。这个函数调用之后,就会把 nextProps
和 nextState
分别设置到 this.props
和 this.state
中。紧接着这个函数,就会调用 render()
来更新界面了。
componentDidUpdate函数
调用了 render()
更新完成界面之后,会调用 void componentDidUpdate(
object prevProps, object prevState
)
来得到通知。因为到这里已经完成了属性和状态的更新了,此函数的输入参数变成了 prevProps
和 prevState
。
第三阶段功能分析
componentWillUnmount函数
当组件要被从界面上移除的时候,就会调用 componentWillUnmount()
在这个函数中,可以做一些组件相关的清理工作,例如取消计时器、网络请求等。
总结
生命周期 | 调用次数 | 能否使用 setSate() |
---|---|---|
getDefaultProps | 1(全局调用一次) | 否 |
getInitialState | 1 | 否 |
componentWillMount | 1 | 是 |
render | >=1 | 否 |
componentDidMount | 1 | 是 |
componentWillReceiveProps | >=0 | 是 |
shouldComponentUpdate | >=0 | 否 |
componentWillUpdate | >=0 | 否 |
componentDidUpdate | >=0 | 否 |
componentWillUnmount | 1 | 否 |