React生命周期图:
- getDefaultProps
- 执行过一次后,被创建的类会有缓存(这也是为什么父子组件以props形式传参后,再更新时子组件不会改变的原因),映射的值会存在于this.props;
- 该方法在对象被创建前执行,因此不能在方法内调用this.props
- getInitialState
- 组件加载之前执行,返回值会被用于state的初始化值
- componentWillMount
- 执行一次,在初始化render之前执行,如果在这个方法内调用state,render()只会执行一次
-
render
-
componentDidMount
- 在初始化render之后只执行一次,在这个方法内,可以访问任何组件,子组件在父组件之前执行
- 从这个函数开始,就可以和js其他框架交互了,如设置setTimeOut或发起网络请求等
- shouldComponentUpdate
- 返回boolean布尔值, 默认return true。
- 该方法在props或state发生变化时,在render前执行;当新的props或state不需要更新组件时,返回false, render()不会被调用,componentWillUpdate和componentDidUpdate方法也不会被调用。
可以利用shouldComponentUpdate来优化/提高应用性能;
同时,在新React中,提供了PureComponent,其内部重写实现了shouldComponentUpdate(),但是要注意,PureComponent对组件的新/旧state和props的数据进行的是浅比较,所以如果state是对象等需要通过函数传递state的方式来更新!
- componentWillUpdate
- 当props和state发生变化时执行,并且在render方法之前执行;初始化render时不执行。
- 在该函数里不能调用this.setState来修改状态;该函数调用后,会把nextProps和nextState分别设置到this.props和this.state中
- componentDidUpdate
- 组件更新接收后执行,初始化render时不执行
- componentWillReceiveProps
- 当props发生变化时执行,在该生命周期里可以根据属性的变化,通过调用this.setState()来更新组件状态;
- 旧的属性还是可以通过this.props来获取,这里调用更新状态是安全的,并不会触发额外的render调用
// 子组件生命周期函数动态监控更新父组件传入的props
componentWillReceiveProps(nextProps){
this.setState({
isModifyUser:nextProps.isModifyUser
})
}
- componentWillUnmount
- 当组件要从界面上被移除时,调用该声明周期函数