组件的生命周期
组件在初始化时会触发5个钩子函数:
1、getDefaultProps()
作用于组件类,只调用一次,返回对象用于设置默认的props,也可以用dufaultProps设置组件的默认属性。
2、getInitialState()
实例创建时调用一次,用于初始化每个实例的state。在使用es6的class语法时是没有这个钩子函数的,可以直接在constructor中定义this.state。此时可以访问this.props。
3、componentWillMount()
组件初始化时调用,在完成首次渲染之前调用,以后组件更新不调用,整个生命周期只调用一次,此时可以修改组件的state。
4、 render()
react最重要的步骤,必须选的方法,创建虚拟dom,进行diff算法,更新dom树都在此进行。此时就不能更改state了。只能通过this.props和this.state访问数据。可以返回null,false 和其他React组件。
5、componentDidMount()
组件渲染之后调用,可以通过this.getDOMNode()获取和操作dom节点,只调用一次。
在更新时也会触发5个钩子函数:
6、componentWillReceivePorps(nextProps)
组件初始化时不调用,组件接受新的props时调用。此时可以更改组件的props和state。
componentWillReceiveProps (nextProps) { if (nextProps.look) { this.setState({ look: true }) }}
7、shouldComponentUpdate(nextProps, nextState)
react性能优化非常重要的一环。组件接受新的state或者props时调用,我们可以设置在此对比前后两个props和state是否相同,如果相同则返回false阻止更新,因为相同的属性状态一定会生成相同的dom树,这样就不需要创造新的dom树和旧的dom树进行diff算法对比,节省大量性能,尤其是在dom结构复杂的时候。不过调用this.forceUpdate会跳过此步骤。
8、componentWillUpdate(nextProps, nextState)
组件初始化时不调用,接受到新的 props 和state后,进行渲染之前调用(组件将要更新时调用),此时不允许更新 props 和 state。
9、render()
在此就不多说了,同上一个render()
10、componentDidUpdate()
组件初始化时不调用,组件更新完成后调用,此时可以获取dom节点。
还有一个卸载钩子函数:
11、componentWillUnmount()
组件将要卸载时调用,一些事件监听和定时器需要在此时清除。
以上可以看出来react总共有10个周期函数(render重复一次),这个10个函数可以满足我们所有对组件操作的需求,利用的好可以提高开发效率和组件性能。