React_02 学习笔记

目录

一、生命周期


一、生命周期

函数组件 无生命周期,生命周期只有 类组件 才拥有 。

生命周期函数指在某一时刻组件会 自动调用并执行的函数。React 每个 类组件 都包含生命周期方法,以便于在运行过程中特定的阶段执行这些方法。例如:我们希望在第一次将其呈现到 DOM 时设置 一个计时器 Clock 。这在 React 中称为 “安装”。我们也想在 删除 由产生的 DOM 时清除该计时器 Clock 。这在 React 中称为 “卸载”。

参考:React lifecycle methods diagram

完整的生命周期图

常用的生命周期图

 

  • constructor (props)

React 组件的 构造函数 在挂载之前被调用。在实现 React.Component 构造函数时,需要先在添加其它内容前,调用 super(props) ,用来将父组件传来的 props 绑定到继承类中。

只调用一次

constructor(props) {

    super(props)

}

 

  • static getDerivedStateFromProps(nextProps, prevState)

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

此方法适用于罕见的用例,即当前组件的 state 的值在任何时候都取决于 props 传入。

  • render()

render() 方法是必需的,它主要负责组件的渲染,会被重复调用若干次

  • componentDidMount

它会在 组件挂载 后(插入 DOM 树中)立即调用。依赖于 DOM 节点的初始化应该放在这里。如需通过网络请求获取数据,此处是 实例化请求 的好地方。

  • shouldComponentUpdate(nextProps, nextState)

当 props 或 state 发生变化时,shouldComponentUpdate() 会在渲染执行之前被调用。返回值默认为 true 则组件 继续渲染 ,为 false 则当前组件 不会渲染 。首次渲染或使用 forceUpdate() 时不会调用该方法。此方法仅作为 性能优化的方式而存在 。你也可以考虑使用内置的 PureComponent 组件,而不是手动编写 shouldComponentUpdate()。PureComponent 会对 props 和 state 进行 浅层比较 ,并减少了跳过必要更新的可能性。

当 this.setState() 修改了 state 中的数据后,当前组件将重新渲染,同时也会重新渲染子组件,但只会渲染当前组件子树(当前组件以其所有子组件)

// eslint-disable-next-line
import React, { PureComponent, Component } from 'react';
// 引入 js 工具库
import _ from 'lodash'

// 性能优化 PureComponent
// React 默认父组件数据更新,会让它对应下面的所有的子孙组件都 更新一次
// 而如果你子类继承自 PureComponent 父类,则它会帮我们进行浅层数据比对
// (基本类型值的比对 , 引用类型不行)

// class Child extends PureComponent {
class Child extends Component {

  // 性能优化的函数
// props, state 最新的 props 数据和 state 数据,老数据用 this.props 和 this.state
  // 要有返回值 true / false,
  // 为 false 时则不会进行 render 渲染 为 true 向下渲染视图
  shouldComponentUpdate(props, state) {
    // 引用类型比较地址,地址不一样,所以值相同,但返回 false
    // console.log(props === this.props);

    // return props.user.id !== this.props.user.id
    // return Object.keys(props.user).some(key => props.user[key] !== this.props.user[key])

    // 深比较
    // console.log(_.isEqual(props.user, this.props.user));
    return !_.isEqual(props.user, this.props.user)
  }

  // 挂载和更新都会执行,执行 N 次
  // 组件界面的渲染方法
  render() {
    console.log('child-render');
    return (
      <div>
        子组件
      </div>
    );
  }
}

export default Child;
  • getSnapshotBeforeUpdate(prevProps, prevState)

在最近一次渲染输出(提交到 DOM 节点)之前调用。它使得组件能在发生更改之前从 DOM 中捕获一些信息,此生命周期的任何返回值将作为参数传递给 componentDidUpdate()

  • componentDidUpdate(prevProps, prevState, snapshot)

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

  • componentWillUnmount()

会在组件卸载及销毁之前直接调用。在此方法中执行必要的清理操作

 

  • componentWillMount() / UNSAFE_componentWillMount()

已被弃用,在挂载之前被调用。它在 render() 之前调用,因此在此方法中同步调用 setState() 不会触发额外渲染

  • componentWillReceiveProps() / UNSAFE_componentWillReceiveProps(nextProps)

已被弃用,它会在已挂载的组件接收新的 props 之前被调用。

  • componentWillUpdate() / UNSAFE_componentWillUpdate(nextProps, nextState)

已被弃用,当组件收到新的 props 或 state 时,会在渲染之前调用此方法,初始渲染不会调用此方法。

部分源代码截图 :

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐