React 生命周期

Posted article-record

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React 生命周期相关的知识,希望对你有一定的参考价值。

概念: 在组件创建到加载到页面上运行, 以及组件被销毁的过程中, 总是伴随着各种各样的事件, 这些在组件特定时期触发的时间, 统称为组件的生命周期;

组件的生命周期分为三部分:

  • 组件创建阶段 : 组件创建阶段的生命周期函数, 有一个显著的特点, 创建阶段的生命周期函数在组件的一生中, 只执行一次 ;

    componentWillMount : 组件将要被挂载, 此时还没有开始渲染DOM

    reder : 第一次开始渲染真正的虚拟DOM, 当render执行完, 内存中就有了完整的虚拟DOM

    componentDidMount : 组件完成了挂载 , 此时组件已经显示到了页面上, 当这个方法执行完, 组件就进入了运行中的状态 ;

  • 组件运行阶段 : 根据组件中的 state 和 props 的改变, 有选择性的触发0次或者多次

    componentWillRectiveProps : 组件将要接收新属性, 只要这个方法被触发 , 就证明组件为当前组件传递了新的属性值 ;

    shouldComponentUpdate : 组件是否需要被更新 , 此时组件尚未被更新, 但是 state 和 props 肯定是最新的 ;

    componentWillUpdate : 组件将要被更新 , 此时尚未开始更新 , 内存中的DOM树还是旧的 ;

    render : 此时又要根据最新的 state 和 props 重新渲染最新的DOM树, 当render调用完毕, 内存中的旧DOM树已经被新DOM树替换了 ; 此时页面还是旧的 ;

    componentDidUpdate : 此时页面被重新渲染, state 和虚拟DOM和页面已经完全保持同步 ;

  • 组件销毁阶段 : 一声也是只执行一次

    componentWillUnmount : 组件将要被卸载 , 此时组件还可以正常使用 ;

技术图片

import React from 'react'
class Demo extends React.Component {
  constructor(props) {
    super(props)
    this.state = {}
  }
  static defaultProps = {}
  componentWillMount() {
    // 页面即将被挂载, 尚未挂载; 虚拟 DOM 还没有创建
  }
  render(){
   // 即将渲染内存中的虚拟 DOM, return 之后内存中才会有虚拟 DOM 仍然没有渲染到页面
   return <div></div>
  }
  componentDidMount() {
    // 已经渲染到页面, 组件脱离创建生命周期进入运行生命周期
    // DOM 元素最早在这里操作
  }
  componentWillReceiveProps(nextProps) {
    // props 更改时触发的生命周期函数, 此时获取到值仍然是旧的, 可以通过参数获取新值
    // 第一次被渲染时, 不会被触发此钩子函数
  }
  shouldComponentUpdate(nextProps, nextState) {
    // 组件是否需要更新 reutrn true 或者 false 此时获取到值仍然是旧的, 可以通过参数获取新值
    return true
  }
  componentWillUpdate(nextProps, nextState) {
    // 组件将要被更新, 也没有更新, 此时获取到值仍然是旧的, 可以通过参数获取新值
  }
  componentDidUpdate(prevProps, prevState) {
    // 组件完成更新, 此时获取到值是最新的, 可以通过参数获取旧值
  }
}

绑定 this 并传值的几种方式

import React from 'react'
class BindThis extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      msg: '这是初始化的msg'
    }
    // 修改指向之後,再指向同一塊内存地址調用
    this.inputChange2 = this.inputChange2.bind(this, '??', '??')
  }
  render() {
    return <div>
      <input type="button" value="第一种改变方式" onClick={inputChange1.bind(this, '??', '??')}>
      <input type="button" value="第二种改变方式" onClick={inputChange2}>
      {/* 使用箭頭函數,不會修改 this 的指向 */}
      <input type="button" value="第三种改变方式" onClick={() => {this.inputChange3('??', '??')}}>
      <hr/>
      <div>{this.state.msg}</div>
    </div>
  }
  // 通過 bind 改變 this 指向,再傳值
  inputChange1(arg1, arg2){
    this.setState({
      msg: `${arg1} ---- ${arg2}`
    })
  }
  inputChange2(arg1, arg2){
    this.setState({
      msg: `${arg1} ---- ${arg2}`
    })
  }
  inputChange3(arg1, arg2){
    this.setState({
      msg: `${arg1} ---- ${arg2}`
    })
  }
}

以上是关于React 生命周期的主要内容,如果未能解决你的问题,请参考以下文章

关于片段生命周期

调用 replace() 时片段的生命周期是啥?

Android片段生命周期:onResume调用了两次

在不存在的片段上调用片段生命周期和 onCreate 的问题

导航上的片段生命周期重叠

Android 片段生命周期