首页 > 其他分享 >10分钟理解React生命周期

10分钟理解React生命周期

时间:2023-04-16 20:11:47浏览次数:45  
标签:10 生命周期 订阅 卸载 React props 组件

前言

学习React,生命周期很重要,我们了解完生命周期的各个组件,对写高性能组件会有很大的帮助.

一、简介

React /riˈækt/ 组件的生命周期指的是组件创建销毁过程中所经历的一系列方法调用。这些方法可以让我们在不同的时刻执行特定的代码,以满足组件的需求。

React 的生命周期可以分为三个阶段:挂载阶段更新阶段卸载阶段。每个阶段都有对应的生命周期方法,如下所示:

二、生命周期三个阶段

挂载阶段

  • constructor() :/kənˈstrʌktə(r)/ 构造函数,最先被执行,我们通常在构造函数里初始化state对象或者给自定义方法绑定this
  • static getDerivedStateFromProps()static getDerivedStateFromProps(nextProps, prevState),这是个静态方法,当我们接收到新的属性想去修改state,可以使用getDerivedStateFromProps
  • render() : /ˈrendə(r)/ render函数是纯函数,只返回需要渲染的东西,不应该包含其它的业务逻辑,可以返回原生的DOM、React组件、Fragment、Portals、字符串和数字、Boolean和null等内容
  • componentDidMount():组件装载之后调用,此时可以获取到DOM节点并操作,比如对canvas,svg的操作,服务器请求,订阅都可以写在这个里面,但是记得在componentWillUnmount中取消订阅。
    componentWillUnmount中取消订阅。

1、在 componentWillUnmount 生命周期方法中,我们可以执行一些清理工作,比如取消订阅或者清除定时器等。

取消订阅是指在组件卸载之前,将之前添加的事件监听或者数据订阅取消掉,以避免内存泄漏和无效的数据处理。

具体实现方法取决于你所使用的订阅方式。如果你使用的是 React Context API 或者 Redux 等状态管理库,则可以在 componentWillUnmount 方法中取消订阅。例如,使用 React Context API 订阅状态更新的代码可能如下所示:

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      value: props.initialValue,
    };
    this.unsubscribe = props.subscribe(this.handleValueChange);
  }

  componentWillUnmount() {
    this.unsubscribe();
  }

  handleValueChange = (newValue) => {
    this.setState({ value: newValue });
  };

  render() {
    return (
      <div>
        <span>Current value: {this.state.value}</span>
      </div>
    );
  }
}

在上面的代码中,unsubscribe 方法是一个用于取消订阅的函数,它在组件创建时通过 props.subscribe 方法添加订阅,然后在组件卸载时通过 componentWillUnmount 方法进行取消订阅。

2、如果你使用的是普通的 DOM 事件监听器或者 WebSocket 等浏览器原生 API,那么你需要在组件卸载时手动移除事件监听或者关闭 WebSocket 连接等。

例如,使用 addEventListener 添加事件监听器的代码可能如下所示:

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }

  componentDidMount() {
    document.addEventListener('click', this.handleClick);
  }

  componentWillUnmount() {
    document.removeEventListener('click', this.handleClick);
  }

  handleClick(event) {
    console.log('Clicked!', event.target);
  }

  render() {
    return <div>Click anywhere to log the target element.</div>;
  }
}

在上面的代码中,我们在组件挂载时通过 addEventListener 方法添加了一个 click 事件监听器,然后在组件卸载时通过 removeEventListener 方法移除该监听器。这样可以确保在组件卸载时不会再接收到无效的事件通知。

更新阶段

  • static getDerivedStateFromProps() /ˈstætɪk/ /dɪˈraɪvd/ /steɪt/ /prɒps/ 此方法在更新个挂载阶段都可能会调用
  • shouldComponentUpdate() shouldComponentUpdate(nextProps, nextState),有两个参数nextPropsnextState,表示新的属性和变化之后的state,返回一个布尔值,true表示会触发重新渲染,false表示不会触发重新渲染,默认返回true,我们通常利用此生命周期来优化React程序性能
  • render()  更新阶段也会触发此生命周期
  • getSnapshotBeforeUpdate() getSnapshotBeforeUpdate(prevProps, prevState),这个方法在render之后,componentDidUpdate之前调用,有两个参数prevPropsprevState,表示之前的属性和之前的state,这个函数有一个返回值,会作为第三个参数传给componentDidUpdate,如果你不想要返回值,可以返回null,此生命周期必须与componentDidUpdate搭配使用
  • componentDidUpdate() componentDidUpdate(prevProps, prevState, snapshot),该方法在getSnapshotBeforeUpdate方法之后被调用,有三个参数prevPropsprevStatesnapshot,表示之前的props,之前的state,和snapshot。第三个参数是getSnapshotBeforeUpdate返回的,如果触发某些回调函数时需要用到 DOM 元素的状态,则将对比或计算的过程迁移至getSnapshotBeforeUpdate,然后在 componentDidUpdate中统一触发回调或更新状态。

卸载阶段

  • componentWillUnmount() 当组件被卸载或者销毁了就会调用,我们可以在这个函数里去清除一些定时器,取消网络请求,清理无效的DOM元素等垃圾清理工作

这些生命周期方法按照顺序依次被调用。在挂载阶段,组件被创建并插入到 DOM 树中。在更新阶段,组件的 props 或者 state 发生改变时会触发更新,从而重新渲染组件。最后,在卸载阶段,组件被从 DOM 树中移除并销毁。

每个生命周期方法都有不同的作用,可以用来实现各种需求,比如在组件挂载时进行初始化工作、在组件更新时进行数据处理或者在组件卸载时进行清理工作等。

 

 

 

 

 

 

 

 

     

标签:10,生命周期,订阅,卸载,React,props,组件
From: https://www.cnblogs.com/ischengzi/p/17323944.html

相关文章

  • Topcoder 10880 - Functional Equation
    首先分析一下这个鬼畜的函数,我们考虑\(f(x)+2C\)\(=f(2f(x)-x+1)+C\)\(=f(2f(2f(x)-x+1)-(2f(x)-x+1)+1)\)\(=f(2(f(x)+C)-2f(x)+x-1+1)\)\(=f(x+2C)\)也就是\(f(x)=f(x\bmod2C)+2C\lfloor\dfrac{x}{2C}\rfloor\)也就是,只要决定了\(f(x)\),\(f(x+2mC)\)也就被确定了。......
  • 汉源高科高清DVI音视频光端机dvi光纤收发器延长器1080P分辨率
    汉源高科高清DVI音视频光端机dvi光纤收发器延长器1080P分辨率......
  • 汉源高科4K-DVI光端机10公里实时传输dvi光纤延长器非压缩DVI大屏收发器
    汉源高科4K-DVI光端机10公里实时传输dvi光纤延长器非压缩DVI大屏收发器......
  • P3205 [HNOI2010]合唱队
    P3205[HNOI2010]合唱队区间DP——取一端思:根据题意我们发现,每次排队的时候,会出现两种情况当前排入的人(即初始队列最后一人)比初始队列中前一个人矮,排到最左边当前排入的人(同上)比初始队列中前一个人高,排到最右边可从初始队列最后一人切入。设置状态:\(f[l][r][0/1]\)......
  • P1074 [NOIP2009 提高组] 靶形数独
    题目传送门思路就是一个填数独的小游戏不会填数独的先去自己玩几把众所周知,数独每一行、每一列、每一个3*3宫格内的数字均含1~9,且不重复所以我们设三个数组r[10][10],c[10][10],block[10][10]分别记录行、列、3*3宫格内数字的使用情况重点:剪枝我们知道,数独的玩法是先从已知......
  • 【shell】win10的wsl子系统,删除文件报错-bash: /usr/bin/rm: Argument list too long
    1、场景  由于测试需要删除缓存目录相关文件,但是rm-rf./*的时候报错 2、处理方法cd[需要删除的目录]ls|xargs-n10rm-frls参数解释:输出所有的文件名(用空格分割) xargs就是将ls的输出,每10个为一组(以空格为分隔符),作为rm-rf的参数也就是说将所有文件名10......
  • 10 while循环基本概述
    1.while循环基本概述只要条件成立,就会反复执行循环语句,直到条件不成立时,才会退出。语法:  #语法示例脚本将一个数字1-9升序打印出来  打印两个数字,一个升序,一个进行降序 2.while循环场景示例  1.创建10个不同日期的文件 2.随机点名脚本 3.while循环读......
  • Sumsets UVA - 10125
     一个集合中需要找到a,b,c,d,使得a+b+c=d 枚举a,b,计算a+b,存在map里再枚举d,c,计算d-c是否存在d-c==a+b #include<iostream>#include<map>#include<algorithm>#include<vector>usingnamespacestd;constintN=1e3+2;//a+b==d-c#definepiipair<......
  • Qt5.9 UI设计(一)——在win10系统上安装Qt5.9
    安装环境win10系统Qt5.9.0版本官方下载地址可以从官方网站获取:https://www.qt.io/zh-cn/现在的安装包跟以前的有些区别,加上网络比较慢,我这里演示的是Qt5.9.0版本的安装安装步骤直接双击qt-opensource-windows-x86-5.9.0.exe进行安装欢迎界面,直接点下一步登陆Qt账......
  • 储存数据至mysql数据库时出现 (1064, "You have an error in your SQL syntax; check
      在msyql数据库中存储数据时,程序出现了如下报错:  打印存储的数据类型发现数据类型有错误,将数据转为str类型就可以了。。。解决思路:  在初入数据库学习时,出现这个报错还是有些懵的,于是改了捕获异常,发现存储数据函数有问题。从报错中可以看出是有跟'自营店'类似的数据有......