Web/12-React基础/03-React组件(一):生命周期.md
2020-04-19 18:24:43 +08:00

118 lines
4.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 组件的生命周期
在组件创建到加载到页面上运行以及组件被销毁的过程中总是伴随着各种各样的事件这些在组件特定时期触发的事件统称为组件的生命周期
## 生命周期的阶段
组件生命周期分为三个阶段下面分别来讲解
### 1组件创建阶段
> 组件创建阶段的生命周期函数有一个显著的特点创建阶段的生命周期函数在组件的一辈子中只执行一次
- getDefaultProps
初始化 props 属性默认值
- getInitialState
初始化组件的私有数据因为 state 是定义在组件的 constructor 构造器当中的只要new class类必然会调用 constructor构造器
- componentWillMount()
组件将要被挂载此时还没有开始渲染虚拟DOM
在这个阶段不能去操作DOM元素但可以操作属性状态function相当于 Vue 中的Create()函数
- render()
第一次开始渲染真正的虚拟DOM当render执行完内存中就有了完整的虚拟DOM了
意思是此时虚拟DOM在内存中创建好了但是还没有挂在到页面上
在这个函数内部不能去操作DOM元素**因为还没return之前虚拟DOM还没有创建**当return执行完毕后虚拟DOM就创建好了但是还没有挂在到页面上
- **componentDidMount()**
**当组件虚拟DOM挂载到页面之后会进入这个生命周期函数**
只要进入到这个生命周期函数则必然说明页面上已经有可见的DOM元素了此时组件已经显示到了页面上state上的数据内存中的虚拟DOM以及浏览器中的页面已经完全保持一致了
当这个方法执行完组件就进入都了 运行中 的状态所以说componentDidMount 是创建阶段的最后一个函数
在这个函数中我们可以放心的去 操作 页面上你需要使用的 DOM 元素了如果我们想操作DOM元素最早只能在 componentDidMount 中进行相当于 Vue 中的 mounted() 函数
### 2组件运行阶段
>有一个显著的特点根据组件的state和props的改变有选择性的触发0次或多次
- componentWillReceiveProps()
组件将要接收新属性只有当父组件中通过某些事件重新修改了 传递给 子组件的 props 数据之后才会触发这个钩子函数
- shouldComponentUpdate()
判断组件是否需要被更新此时组件尚未被更新但是state props 肯定是最新的
- componentWillUpdate()
组件将要被更新此时组件还没有被更新在进入到这个生命周期函数的时候内存中的虚拟DOM还是旧的页面上的 DOM 元素也是旧的也就是说此时操作的是旧的 DOM元素
- render
此时又要根据最新的 state props重新渲染一棵内存中的 虚拟DOM树 render 调用完毕内存中的旧DOM树已经被新DOM树替换了此时虚拟DOM树已经和组件的 state 保持一致了都是最新的但是页面还是旧的
- componentDidUpdate
此时组件完成更新页面被重新渲染此时state虚拟DOM 页面已经完全保持同步
### 3组件销毁阶段
一辈子只执行一次
- componentWillUnmount: 组件将要被卸载此时组件还可以正常使用
React 生命周期的截图如下
20190212_1745.jpg
生命周期对比
- [vue中的生命周期图](https://cn.vuejs.org/v2/guide/instance.html#生命周期图示)
- [React Native 中组件的生命周期](http://www.race604.com/react-native-component-lifecycle/)
## 组件生命周期的执行顺序
**1Mounting**
- constructor()
- componentWillMount()
- render()
- componentDidMount()
**2Updating**
- componentWillReceiveProps(nextProps)接收父组件传递过来的属性
- shouldComponentUpdate(nextProps, nextState)一旦调用 setState就会触发这个方法方法默认 return true如果 return false后续的方法就不会走了
- componentWillUpdate(nextProps, nextState)
- render()
- componentDidUpdate(prevProps, prevState)
**3Unmounting**
- componentWillUnmount()