React系列之新旧生命周期对比

react全家桶学习】react的 (新/旧) 生命周期点) 对比vue的生命周期react显得杂的多,光从名称上就比vue长,所以做好准备,不要放弃,坚持就是胜利、 阅读详情

生命周期

React 实例从创建到销毁的全过程就是生命周期,钩子函数是指程序运行到特定阶段执行的方法。React 的生命周期在不断演进,在16.3版本前后有较大改变。

旧生命周期

在这里插入图片描述

初始化阶段:由 ReactDOM.render() 触发,初次渲染,会调用以下钩子函数:
1.constructor() 构造函数,通常用于初始化组件的状态和绑定方法。
2.componentWillMount() 代表组件已经经历了constructor()初始化数据后,但是还未渲染DOM时。
3.render() 是用来返回组件的UI结构
4.componentDidMount() 在组件挂载到DOM后执行的,可以在这里获取数据、进行一些异步请求或DOM操作。

更新阶段:由组件内部 this.setState 或父组件重新 render 触发,会调用以下钩子函数:
1.componentWillRecieveProps(nextProps) 在接受父组件改变后的props需要重新渲染组件时使用。
1.shouldComponentUpdate(nextProps, nextState) 用来判断组件是否需要重新渲染,返回一个布尔值,可以优化性能。例如父组件重新渲染会使其所有子组件重新渲染,如果我们不需要所有子组件都重新渲染,可以在子组件的该生命周期中做判断。
2.componentWillUpdate(nextProps, nextState) 当调用forceUpdate()时,会直接来到componentWillUpdate()钩子函数。
3.render()
4.componentDidUpdate(prevProps, prevState) 组件更新后触发,用于处理更新后的操作。

卸载组件:由 ReactDOM.unmountComponentAtNode() 触发。
1.component1WillUnmount() 在组件卸载前执行的,可以在这里进行一些清理工作,比如取消订阅、清除定时器、取消异步请求或移除事件监听器等。

新生命周期

在这里插入图片描述

初始化阶段,由ReactDOM.render()触发——初次渲染:
1.constructor()
2.getDerivedStateFromProps()
3.render()
4.conponentDidMount()

更新阶段,由组件内部this.setState()或父组件重新render触发
1.getDerivedStateFromProps()
2.shouldComponentUpdate()
3.render()
4.getSnapshotBeforeUpdate()
5.componentDidUpdate()

卸载阶段,由ReactDOM.unmountCompopnentAtNode()触发
1.componentWillUnmount()

新旧对比

删除生命周期及原因

删除:新的生命周期中不再使用以下三个钩子函数componentWillMount()、componentWillReceiveProps(nextProps)、componentWillUpdate(nextProps, nextState)

原因:在 React 16 版本中,引入了 Fiber 架构,它是一种重新实现了调度算法的 React 内部架构。Fiber 架构的引入使得 React 能够支持更加细粒度的调度和异步渲染,从而提高了性能和用户体验。
在 React 16 之前,React 使用了一种称为 Stack Reconciler 的调度算法,它是一种递归算法,采用了深度优先遍历的方式进行组件的渲染和更新。这种算法有一个问题就是,一旦开始了渲染过程,就无法中断或暂停,直到整个渲染过程完成。这意味着如果渲染过程很耗时,可能会导致页面卡顿,用户体验下降。
为了解决这个问题,React 引入了 Fiber 架构。Fiber 架构采用了一种基于链表的调度算法,使得 React 能够在渲染过程中实现任务的中断、暂停和优先级控制,从而实现了异步渲染的能力。具体来说,Fiber 架构通过将渲染过程拆分为多个小的任务单元,然后通过优先级调度和时间分片的方式来动态地调度这些任务单元的执行顺序,以确保页面的流畅度和响应速度。
Filber 的机制下,生命周期分为 render 和 commit 的阶段,render 的时候是可以被打断的,重新渲染,终止的,当一个任务执行到一半被打断后,下一次渲染线程抢回主动权时,这个任务被重启的形式是“重复执行一遍整个任务”而非“接着上次执行到的那行代码往下走”。这就导致 render 阶段之前的生命周期都是有可能被重复执行的,所以这三个生命周期被废除了。

改变的生命周期

componentDidUpdate(prevProps,prevState,snapshot):它在组件更新后被调用。它接收三个参数:prevProps、prevState、snapshot。与旧的钩子函数相比,多了一个参数snapshot。
如果 getSnapshotBeforeUpdate() 有返回值,它会成为 componentDidUpdate() 的第三个参数,你可以在这里使用它。

新增的生命周期

getDerivedStateFromProps(nextProps,prevState):是一个静态方法,用于在组件接收新的 props 时计算并返回新的 state。这个方法在 React 16.3 版本之后引入,用来替代不推荐使用的componentWillReceiveProps()方法。

    static getDerivedStateFromProps(nextProps, prevState) { 
        // 根据 nextProps 和 prevState 计算并返回新的 state 
        if (nextProps.value !== prevState.value) { 
            return { value: nextProps.value }; 
        } 
        return null; // 如果不需要更新 state,返回 null 
    } 

主要作用:
计算新的state:通常,你可以在这个方法内部根据 nextProps 和 prevState 来计算并返回新的state。这个新的 state 将在组件更新时应用。
不触发副作用:getDerivedStateFromProps() 不应执行副作用,如发起网络请求。它只用于计算state。
适用于控制组件内部状态:getDerivedStateFromProps() 主要用于控制组件内部的状态,以确保它与外部传入的props保持同步。

getSnapshotBeforeUpdate(nextProps,prevState):它在组件更新(即将应用新props或state并重新渲染)之前触发。它允许你捕获组件更新前的一些信息,并在组件更新后使用这些信息。

getSnapshotBeforeUpdate(prevProps, prevState) {
	  // 捕获组件更新前的滚动位置
	  if (prevProps.items.length < this.props.items.length) {
		const scrollHeight = this.myRef.current.scrollHeight;
		const scrollTop = this.myRef.current.scrollTop;
		return { scrollHeight, scrollTop };
	  }
	  return null;
	}
    
	componentDidUpdate(prevProps, prevState, snapshot) {
	  // 使用snapshot来恢复滚动位置
	  if (snapshot !== null) {
		this.myRef.current.scrollTop = snapshot.scrollTop + (this.myRef.current.scrollHeight - snapshot.scrollHeight);
	  }
	}
 
getSnapshotBeforeUpdate() 用于捕获滚动位置,然后在componentDidUpdate() 中使用snapshot来恢复滚动位置,以确保用户在滚动列表时不会在更新后失去滚动位置。

主要特点:
触发时机:getSnapshotBeforeUpdate() 在render() 方法被调用后、组件DOM更新前触发,通常用于在更新前捕获一些DOM信息。
接收两个参数:这个生命周期方法接收两个参数:prevProps、prevState。你可以使用这些参数来比较前后的props和state。
返回值:getSnapshotBeforeUpdate() 方法应该返回一个值(通常是一个对象),它将成为componentDidUpdate() 方法的第三个参数。这个返回值通常用于保存一些DOM相关的信息,比如滚动位置。
通常和componentDidUpdate()一起使用:getSnapshotBeforeUpdate() 结合componentDidUpdate(prevProps, prevState, snapshot) 使用,snapshot参数是getSnapshotBeforeUpdate() 的返回值。你可以在componentDidUpdate() 中使用snapshot来执行DOM操作或其他一些操作。

简单易懂的AXI_Lite 总线详解 简单易懂的AXI_Lite 总线详解 1、前言 AXI_LITE协议主要应用于Xilinx的ZYNQ芯片构架下的ARM和FPGA之间的数据读写,更偏向于单个寄存器的读写。 2、AXI总线与ZYNQ的关系 AXI(Advanced eXtensible Interface)本是由ARM公司提出的一种总线协议,Xilinx从6系列的FPGA开始对AXI总线提供支持,此AXI已经发展到了AXI4这个版本,所以当你用到Xilinx的软件的候看到的都是“AIX4”的IP,如Vivado打包一个AXI IP的候, 阅读详情

相关推荐

数据挖掘7、银行精准营销

利用数据挖掘技术,对银行已有数据进行分析,对客户进行识别,对客户是否能够进行存款精准营销Windows11。

m0_63099685的博客 378

React生命周期新旧对比

react生命周期新旧对比

wzy0507的博客 959

(完整数据) 我国观测站点的逐日气象指标(12个指标)1942-2024年

从1942年的单一站点到2024年覆盖全国的395个观测站点,这份数据集见证了中国气象观测网络的成长与完善。它不仅记录了气象数据,更记录了中国科技发展和环境保护意识提升的历史。每个观测站点的csv文件中,包含了12个关键气象指标,如气温、降水量、最大持续风速、积雪深度、平均能见度等。这些指标的数据,每一项都经过了严格的质量控制,确保了数据的准确性和可靠性。对于研究者而言,这些数据是进行气候分析、模式建立、灾害预测等研究的基石。

react 新旧生命周期有什么区别?新增了哪些钩子?废弃了哪些钩子?为什么废弃?

在日常面试中,若对于了解的同学而言,多多少少会被问到生命周期相关的问题,比如大致阐述生命周期的运作流程,以及每个钩子函数大致的作用,而我在两位出去面试的同事那里了解到,他们都遇到了这个高频问题。我在以往文章中介绍旧版生命周期钩子函数的作用,当也有同学留言到我未提及新增的部分钩子的作用,那么本文正好对于旧版本生命周期一次运转对比,补全新钩子的作用,同站在面试题的角度梳理下我们该如何组织语言,那么本文开始。在版本前后存在两套生命周期,之前为旧版,之后则是新版,虽有新旧之分,但主体上大同小异。新版也只是废弃

行星飞行的博客 1021

react的setState中的prevState是什么

版权声明:转载请注明作者(独孤尚良dugushangliang)出处: https://blog.csdn.net/dugushangliang/article/details/90581414 我的另一个文章https://blog.csdn.net/dugushangliang/article/details/90580582中的代码如下: //handleClick使用bind绑...

dugushangliang的博客 1万+

React 全家桶】React生命周期新旧对比

React 全家桶】React生命周期新旧对比

Dai的博客 638

React生命周期总结

React生命周期总结

YX0711的博客 724

React系列-对比新旧生命周期

生命周期中需要加UNSAFE_前缀(即将要废弃)的有: componentWillMount() componentWillReceiveProps() componentWillUpdate() 提出2个新钩子: getDerivedStateFromProps() getSnapshotBeforeUpdate() //state的值在任何候都取决于props,那么可以使用getDerivedStateFromProps getDerivedStateFromProps(){ //直译:从p

zbl413845230的博客 223

react】初学react4-新旧生命周期

本文介绍了React新旧两个版本生命周期的差异和使用方法。旧版生命周期包含初始化、更新和卸载三个阶段,常用钩子有componentDidMount、componentWillUnmount等。新版生命周期废弃了部分will系列钩子,需添加UNSAFE_前缀才能使用,并新增了getDerivedStateFromProps和getSnapshotBeforeUpdate两个钩子。文章通过代码示例详细展示了父子组件生命周期钩子的调用顺序,以及强制更新、props变化等场景下的生命周期调用情况。新版生命周期更注

qq_38667523的博客 2203

React生命周期@12

本文介绍了React组件的生命周期及其三个阶段:初始化、更新和卸载。在初始化阶段,组件依次执行constructor()、getDerivedStateFromProps()、render()和componentDidMount();更新阶段涉及getDerivedStateFromProps()、shouldComponentUpdate()、render()、getSnapshotBeforeUpdate()和componentDidUpdate();卸载阶段执行componentWillUnmount

weibkreuz的专栏 914

ReactReact 生命周期完全指南

React 组件的生命周期是指组件从创建、更新到销毁的整个过程。合理地使用生命周期方法可以让我们更好地控制组件的行为,优化性能,并处理副作用。React 生命周期方法为我们提供了在组件不同阶段执行代码的机会。优化组件性能正确处理副作用管理组件状态避免内存泄漏constructor:初始化componentDidMount:副作用处理componentDidUpdate:更新后的操作componentWillUnmount:清理工作。

鑫宝的博客 7608

React 生命周期新旧对比

React16.4版本之后使用了新的生命周期,它使用了一些新的生命周期钩子(getDerivedStateFromProps、getSnapshotBeforeUpdate),并且即将废弃老版的3个生命周期钩子(componentWillMount、componentWillReceiveProps、componentWillUpdate)。

weixin_45748897的博客 1458

React 组件的新旧生命周期

React组件的新旧生命周期

林太白 1671

React-组件的新旧生命周期

React-组件的新旧生命周期 1、组件的生命周期概述. ????生命周期含义: 从组件出生到更新、改变、销毁(创建\更新\销毁)的整个阶段。 ????生命周期的钩子函数含义: 组件的每个阶段都伴随着一些方法,就是生命周期的钩子函数,我们就是通过控制这些生命周期函数从而控制组件。 ????生命周期意义: 组件的生命周期有助于理解组件的运行...

weixin_43932886的博客 899

React体系06-React 组件的新旧生命周期

生命周期含义:从组件出生到更新、改变、销毁(创建\更新\销毁)的整个阶段。生命周期的钩子函数含义:组件的每个阶段都伴随着一些方法,就是生命周期的钩子函数,我们就是通过控制这些生命周期函数从而控制组件。生命周期意义:组件的生命周期有助于理解组件的运行方式、完成更杂的组件功能、分析组件错误原因TIPS只有类组件才有生命周期

2402_85402030的博客 1107

《六》类组件的生命周期

组件从创建到销毁的过程,被称为组件的生命周期。在没有 Hooks 之前,函数组件没有生命周期,因为生命周期函数是类的方法实现的,函数组件没有继承,所以也就没有生命周期。在生命周期的各个阶段都有相对应的钩子函数,会在特定的机被调用,被称为组件的生命周期函数。生命周期函数 = 生命周期钩子 = 生命周期调函数 = 生命周期钩子函数。

花铛 2万+

react使用prevState修改state的值

react使用prevState修改state的值class Timer extends React.Component {  constructor(props) {    super(props);    this.state = { seconds: 0 };  }   tick() {    this.setState(prevState =&gt; ({      seconds: pr...

weixin_39621570的博客 4490

前端框架react----生命周期

目录 前言 一、什么是组件的生命周期呢? 二、挂在阶段 1、constructor(props) 2、static getDerivedStateFromProps(props, state) 3、render() 4、componentDidMount() 5、componentWillMount() 三、更新阶段 1、shouldComponentUpdate(nextProps, nextState) 2、getSnapshotBeforeUpdate(prevProps,

我睡觉的时候不困 1134

react的一些杂乱知识点

App.contextType = Context 或在类中 static contextType = Context。这组标签内的函数会自动执行,其中参数value就是长辈组件传下来的context.Provider的数据。2.要使用的组件就直接引入该context 对象,且设置到类的contextType 属性上。在new props,setState,forceUpdate,就会进入更新阶段。3.该组件就可以通过this.context 获取到context对象的内容了。

q1553048604的博客 312

React生命周期

1. 挂载卸载过程 1.1.constructor() 1.2.componentWillMount() 1.3.componentDidMount() 1.4.componentWillUnmount () 2. 更新过程 2.1. componentWillReceiveProps (nextProps) 2.2.shouldComponentUpdate(nextProps,nextState) 2.3.componentWillUpdate (nextProps,nex

Dream_fengyuefei的博客 318

React类组件生命周期详解

它使你的组件能够在 DOM 发生更改之前捕获一些信息(例如滚动的位置)。方法,那么 React 会在你的组件更新了 props 或 state 渲染后立即调用它。方法,会造成触发一次发生在浏览器更新屏幕内容之前的额外渲染,在这种情况下,即使。返值:返你想要的任何类型的快照值,或者是。方法,React 会在你的组件被移除屏幕(进行比较来确定发生了什么改变。进行比较来确定发生了什么改变。:更新之前的 props。:更新之前的 state。:更新之前的 Props。:更新之前的 State。

weixin_47342624的博客 2341
上一篇: React系列之框架特点和组件类型
下一篇: React系列之虚拟DOM、FIBER和DIFF算法
小小小菜鱼
博客等级 码龄11年 504粉丝 48原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值