zoukankan      html  css  js  c++  java
  • React生命周期


    React中组件也有生命周期,也就是说也有很多钩子函数供我们使用, 组件的生命周期,我们会分为四个阶段,挂载、更新、卸载、错误处理

    挂载阶段

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

    1. constructor()

    2. static getDerivedStateFromProps()

    3. render()

    4. componentDidMount()

      注意:
      下述生命周期方法即将过时,在新代码中应该避免使用它们:
      UNSAFE_componentWillMount()

    更新阶段

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

    1. static getDerivedStateFromProps()
    2. shouldComponentUpdate()
    3. render()
    4. getSnapshotBeforeUpdate()
    5. componentDidUpdate()
    注意:
    下述方法即将过时,在新代码中应该避免使用它们:
    UNSAFE_componentWillUpdate()
    UNSAFE_componentWillReceiveProps()

    卸载阶段

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

    ​ componentWillUnmount()

    错误处理

    当渲染过程,生命周期,或子组件的构造函数中抛出错误时,会调用如下方法:

    1. static getDerivedStateFromError()
    2. componentDidCatch()

    各生命周期详解

    1.constructor(props)

    如果不初始化 state 或不进行方法绑定,则不需要为 React 组件实现构造函数。

    在 React 组件挂载之前,会调用它的构造函数。在为 React.Component 子类实现构造函数时,应在其他语句之前前调用 super(props)。否则,this.props 在构造函数中可能会出现未定义的 bug。

    通常,在 React 中,构造函数仅用于以下两种情况:

    constructor() 函数中不要调用 setState() 方法。如果你的组件需要使用内部 state,请直接在构造函数中为 this.state 赋值初始 state

    constructor(props) {
      super(props);
      // 不要在这里调用 this.setState()
      this.state = { counter: 0 };
      this.handleClick = this.handleClick.bind(this);
    }

    只能在构造函数中直接为 this.state 赋值。如需在其他方法中赋值,你应使用 this.setState() 替代。

    2.static getDerivedStateFromProps(nextProps, prevState)

    getDerivedStateFromProps 会在调用 render 方法之前调用,并且在初始挂载及后续更新时都会被调用。它应返回一个对象来更新 state,如果返回 null 则不更新任何内容。

    如果是由于父组件的props更改,所带来的重新渲染,也会触发此方法。

    当状态发生变化的时候,this.setState()的时候,此钩子函数同样也会执行。

    之前这里都是使用constructor+componentWillRecieveProps完成相同的功能的

    3.render()

    render()方法是必需的。当他被调用时,他将计算this.propsthis.state,并返回以下一种类型:

    1. React元素。通过jsx创建,既可以是dom元素,也可以是用户自定义的组件。
    2. 字符串或数字。他们将会以文本节点形式渲染到dom中。
    3. null,什么也不渲染
    4. 布尔值。也是什么都不渲染。

    如需与浏览器进行交互,请在 componentDidMount() 或其他生命周期方法中执行你的操作。保持 render() 为纯函数,可以使组件更容易思考。

    注意:
    如果 shouldComponentUpdate() 返回 false,则不会调用 render()。

    4. componentDidMount

    componentDidMount在组件被装配后立即调用。初始化使得DOM节点应该进行到这里。

    通常在这里进行ajax请求

    如果要初始化第三方的dom库,也在这里进行初始化。只有到这里才能获取到真实的dom.

    5.shouldComponentUpdate(nextProps, nextState)

    调用shouldComponentUpdate使React知道,组件的输出是否受stateprops的影响。默认每个状态的更改都会重新渲染,大多数情况下应该保持这个默认行为。

    在渲染新的propsstate前,shouldComponentUpdate会被调用。默认为true。这个方法不会在初始化时被调用,也不会在forceUpdate()时被调用。返回false不会阻止子组件在state更改时重新渲染。

    如果shouldComponentUpdate()返回falsecomponentWillUpdate,rendercomponentDidUpdate不会被调用。

    此方法仅作为性能优化的方式而存在。不要企图依靠此方法来“阻止”渲染,因为这可能会产生 bug。你应该考虑使用内置的 PureComponent 组件,而不是手动编写 shouldComponentUpdate()。PureComponent 会对 props 和 state 进行浅层比较,并减少了跳过必要更新的可能性。
    如果你一定要手动编写此函数,可以将 this.props 与 nextProps 以及 this.state 与nextState 进行比较,并返回 false 以告知 React 可以跳过更新。

    6.getSnapshotBeforeUpdate(prevProps, prevState)

    在react render()后的输出被渲染到DOM之前被调用。它使您的组件能够在它们被潜在更改之前捕获当前值(如滚动位置)。这个生命周期返回的任何值都将作为参数传递给componentDidUpdate()。

    7.componentDidUpdate(prevProps, prevState, snapshot)

    componentDidUpdate() 会在更新后会被立即调用。首次渲染不会执行此方法。

    当组件更新后,可以在此处对 DOM 进行操作。如果你对更新前后的 props 进行了比较,也可以选择在此处进行网络请求。(例如,当 props 未发生变化时,则不会执行网络请求)。

    componentDidUpdate(prevProps) {
      // 典型用法(不要忘记比较 props):
      if (this.props.userID !== prevProps.userID) {
        this.fetchData(this.props.userID);
      }
    }

    如果组件实现getSnapshotBeforeUpdate()生命周期,则它返回的值将作为第三个“快照”参数传递给componentDidUpdate()。否则,这个参数是undefined

    注意:
    如果 shouldComponentUpdate() 返回值为 false,则不会调用 componentDidUpdate()。

    8.componentWillUnmount()

    componentWillUnmount() 会在组件卸载及销毁之前直接调用。在此方法中执行必要的清理操作,例如,清除 timer,取消网络请求或清除在 componentDidMount() 中创建的订阅等。

    componentWillUnmount()不应调用 setState(),因为该组件将永远不会重新渲染。组件实例卸载后,将永远不会再挂载它。

  • 相关阅读:
    golang匿名变量
    golang实现九九乘法表
    bootstrap输入框从数据库读取数据
    celery 使用multiprocessing 问题记录
    django 使用jquery ajax post数据问题
    centos 7 epel地址
    python 2.6升级到2.7
    python给多个发送邮件附件,参考于《python自动化运维》
    nginx+webpy 出现 upstream timed out
    webpy + nginx + fastcgi 构建python应用
  • 原文地址:https://www.cnblogs.com/cupid10/p/15617630.html
Copyright © 2011-2022 走看看