挂载

当组件实例被创建并插入 DOM 中时,其生命周期调用顺序如下:

  • **constructor()**
  • [static getDerivedStateFromProps()](https://zh-hans.reactjs.org/docs/react-component.html#static-getderivedstatefromprops)/**UNSAFE_componentWillMount()**与getSnapshotBeforeUpdate、getDerivedStateFromProps不能共存;
  • **render()**
  • **componentDidMount()**

更新

当组件的 props 或 state 发生变化时会触发更新。组件更新的生命周期调用顺序如下:

  • [static getDerivedStateFromProps()](https://zh-hans.reactjs.org/docs/react-component.html#static-getderivedstatefromprops)
  • [shouldComponentUpdate()](https://zh-hans.reactjs.org/docs/react-component.html#shouldcomponentupdate)
  • **UNSAFE_componentWillUpdate()**与getSnapshotBeforeUpdate、getDerivedStateFromProps不能共存;
  • **render()**
  • [getSnapshotBeforeUpdate()](https://zh-hans.reactjs.org/docs/react-component.html#getsnapshotbeforeupdate)
  • **componentDidUpdate()**


卸载

当组件从 DOM 中移除时会调用如下方法:

  • **componentWillUnmount()**


  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>React 实例</title>
  6. <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
  7. <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
  8. <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
  9. </head>
  10. <body>
  11. <script type="text/babel">
  12. class Hello extends React.Component {
  13. constructor(props) {
  14. console.log('constructor')
  15. super(props)
  16. this.state = { color: 'red' };
  17. }
  18. shouldComponentUpdate(nextProps, nextState) {
  19. console.log('shouldComponentUpdate', nextProps, nextState)
  20. return true
  21. }
  22. /**
  23. * getSnapshotBeforeUpdate() 在最近一次渲染输出(提交到 DOM 节点)之前调用
  24. * 可以用在没有ui需要更新时候不更新ui
  25. */
  26. getSnapshotBeforeUpdate(prevProps, prevState) {
  27. console.log('getSnapshotBeforeUpdate', prevProps, prevState)
  28. return null
  29. }
  30. /**
  31. * getDerivedStateFromProps 会在调用 render 方法之前调用,
  32. * 并且在初始挂载及后续更新时都会被调用。它应返回一个对象来更新 state,如果返回 null 则不更新任何内容。
  33. */
  34. static getDerivedStateFromProps(nextProps, prevState) {
  35. console.log('getDerivedStateFromProps', nextProps, prevState)
  36. }
  37. // 与getSnapshotBeforeUpdate、getDerivedStateFromProps不能共存
  38. UNSAFE_componentWillMount() {
  39. console.log('UNSAFE_componentWillMount')
  40. }
  41. // 与getSnapshotBeforeUpdate、getDerivedStateFromProps不能共存
  42. UNSAFE_componentWillUpdate(nextProps, nextState) {
  43. console.log('UNSAFE_componentWillUpdate', nextProps, nextState)
  44. }
  45. handleBtnClick() {
  46. this.setState({
  47. color: this.state.color === 'red' ? 'green' : 'red'
  48. })
  49. }
  50. render() {
  51. console.log('render')
  52. return (
  53. <div style={{ color: this.state.color }}>
  54. {this.props.children}
  55. <button onClick={() => this.handleBtnClick()}>
  56. btn
  57. </button>
  58. </div>
  59. );
  60. }
  61. componentDidMount() {
  62. console.log('componentDidMount')
  63. }
  64. componentWillUnmount() {
  65. console.log('componentWillUnmount')
  66. }
  67. }
  68. ReactDOM.render(
  69. <div>
  70. <Hello name="world">
  71. <h1>helloworld</h1>
  72. </Hello>
  73. </div>,
  74. document.body
  75. );
  76. </script>
  77. </body>
  78. </html>

挂载执行了

image.png

变更状态执行了

image.png

参考
文档介绍生命周期
https://zh-hans.reactjs.org/docs/react-component.html#static-getderivedstatefromprops