热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解读Reactv16+最新生命周期使用场景

解读Reactv16最新生命周期使用场景React更新到v16版本之后,像是跨入了新的时代,性能和新的API都令人瞩目,所以出现了比较大的
解读 React v16+ 最新生命周期使用场景

React更新到v16版本之后,像是跨入了新的时代,性能和新的 API 都令人瞩目,所以出现了比较大的生命周期方法调整,包括使用方法和使用场景,本章节针对新旧的生命周期的使用方法及使用场景分别详细介绍描述总结;

在介绍生命周期之前,我们首先需要搞清楚React生命周期的几个阶段:

  • Mounting(加载阶段)
  • Updating(更新阶段)
  • Unmounting(卸载阶段)

从上面几个生命期可以发现,非常类似与Vue的生命期:创建前后,加载前后,更新前后,销毁前后

首先我们来了解下React更新到16后,生命周期发生了哪些更改:

  • React V16.3 新增的生命周期方法

    • getDerivedStateFromProps()
    • getSnapshotBeforeUpdate()
  • 逐渐废弃的生命周期方法(目前还能使用,需要加UNSAFE_前缀):

    • componentWillMount()
    • componentWillReceiveProps()
    • componentWillUpdate()

旧的生命周期流程

在这里插入图片描述

1、在旧的生命周期,我们来看看相对应的 加载更新卸载 过程

  • Mounting 加载过程(6个): constructor()getDefaultProps()getInitialState()componentWillMount()render()componentDidMount()
  • Updating 更新过程(5个):componentWillReceivePorps()shouldComponentUpdate()componentWillUpdata()render()componentDidUpdate()
  • Unmounting 卸载过程(1个):componentWillUnmount()

当然这些生命周期的每个钩子函数的作用是什么可以查看:查看更多

2、组件的基本写法如下:

import React, { Component } from &#39;react&#39;export default class OldReactComponent extends Component {constructor(props) {super(props)// getDefaultProps&#xff1a;接收初始props// getInitialState&#xff1a;初始化state}state &#61; {}componentWillMount() { // 组件挂载前触发}render() {return (<h2>Old React.Component</h2>)}componentDidMount() { // 组件挂载后触发}componentWillReceivePorps(nextProps) { // 接收到新的props时触发}shouldComponentUpdate(nextProps, nextState) { // 组件Props或者state改变时触发&#xff0c;true&#xff1a;更新&#xff0c;false&#xff1a;不更新return true}componentWillUpdate(nextProps, nextState) { // 组件更新前触发}componentDidUpdate() { // 组件更新后触发}componentWillUnmount() { // 组件卸载时触发}
}

新的生命周期流程

我们现在来看看新的生命周期&#xff0c;如下图所示&#xff1a;

在这里插入图片描述

新增加的生命周期钩子有&#xff1a;

  • getDerivedStateFromProps()
  • getSnapshotBeforeUpdate()

1、首先我们来看看这个getDerivedStateFromProps()的使用

static getDerivedStateFromProps(nextProps, prevState) {//根据nextProps和prevState计算出预期的状态改变&#xff0c;返回结果会被送给setState}

  • 触发时间(v16.4修正)&#xff1a;组件每次被render的时候&#xff0c;包括在组件构建之后(虚拟dom之后&#xff0c;实际dom挂载之前)&#xff0c;每次获取新的props或state之后。
  • 每次接收新的props之后都会返回一个对象作为新的state&#xff0c;返回null则说明不需要更新state.
  • 配合componentDidUpdate&#xff0c;可以覆盖componentWillReceiveProps的所有用法
  • getDerivedStateFromProps是一个静态函数&#xff0c;所以函数体内不能访问this&#xff0c;输出完全由输入决定。

2、 接着我们来看看getSnapshotBeforeUpdate()的使用

  • 触发时间: update发生的时候&#xff0c;在render之后&#xff0c;在组件dom渲染之前。
  • 返回一个值&#xff0c;作为componentDidUpdate的第三个参数。
  • 配合componentDidUpdate, 可以覆盖componentWillUpdate的所有用法。

3、在新的生命周期&#xff0c;我们来看看相对应的 加载更新卸载 过程

  • Mounting 加载过程&#xff08;4个&#xff09;: constructor()static getDerivedStateFromProps(props, state)render()componentDidMount()
  • Updating 更新过程&#xff08;5个&#xff09;&#xff1a;static getDerivedStateFromProps(props, state)shouldComponentUpdate()render()getSnapshotBeforeUpdate(prevProps, prevState)componentDidUpdate()
  • Unmounting 卸载过程&#xff08;1个&#xff09;&#xff1a;componentWillUnmount()
  • Error Handling(错误处理) : componentDidCatch(error&#xff0c;info)

当然这些生命周期的每个钩子函数的作用是什么可以查看&#xff1a;查看更多

4、组件的基本写法

import React, { Component } from &#39;react&#39;export default class NewReactComponent extends Component {constructor(props) {super(props)// getDefaultProps&#xff1a;接收初始props// getInitialState&#xff1a;初始化state}state &#61; {}static getDerivedStateFromProps(props, state) { // 组件每次被rerender的时候&#xff0c;包括在组件构建之后(虚拟dom之后&#xff0c;实际dom挂载之前)&#xff0c;每次获取新的props或state之后&#xff1b;;每次接收新的props之后都会返回一个对象作为新的state&#xff0c;返回null则说明不需要更新statereturn state}componentDidCatch(error, info) { // 获取到Javascript错误}render() {return (<h2>New React.Component</h2>)}componentDidMount() { // 挂载后} shouldComponentUpdate(nextProps, nextState) { // 组件Props或者state改变时触发&#xff0c;true&#xff1a;更新&#xff0c;false&#xff1a;不更新return true}getSnapshotBeforeUpdate(prevProps, prevState) { // 组件更新前触发}componentDidUpdate() { // 组件更新后触发}componentWillUnmount() { // 组件卸载时触发}
}


推荐阅读
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 本文介绍了如何使用vue-awesome-swiper组件,包括在main.js中引入和使用swiper和swiperSlide组件,以及设置options和ref属性。同时还介绍了如何在模板中使用swiper和swiperSlide组件,并展示了如何通过循环渲染swipes数组中的数据,并使用picUrl属性显示图片。最后还介绍了如何添加分页器。 ... [详细]
  • 先看看ElementUI里关于el-table的template数据结构:<template><el-table:datatableData><e ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • Vue3中setup函数的参数props和context配置详解
    本文详细介绍了Vue3中setup函数的参数props和context的配置方法,包括props的接收和配置声明,以及未通过props进行接收配置时的输出值。同时还介绍了父组件传递给子组件的值和模板的相关内容。阅读本文后,读者将对Vue3中setup函数的参数props和context的配置有更深入的理解。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • position属性absolute与relative的区别和用法详解
    本文详细解读了CSS中的position属性absolute和relative的区别和用法。通过解释绝对定位和相对定位的含义,以及配合TOP、RIGHT、BOTTOM、LEFT进行定位的方式,说明了它们的特性和能够实现的效果。同时指出了在网页居中时使用Absolute可能会出错的原因,即以浏览器左上角为原始点进行定位,不会随着分辨率的变化而变化位置。最后总结了一些使用这两个属性的技巧。 ... [详细]
  • MPLS VP恩 后门链路shamlink实验及配置步骤
    本文介绍了MPLS VP恩 后门链路shamlink的实验步骤及配置过程,包括拓扑、CE1、PE1、P1、P2、PE2和CE2的配置。详细讲解了shamlink实验的目的和操作步骤,帮助读者理解和实践该技术。 ... [详细]
  • 本文介绍了如何使用elementui分页组件进行分页功能的改写,只需一行代码即可调用。通过封装分页组件,避免在每个页面都写跳转请求的重复代码。详细的代码示例和使用方法在正文中给出。 ... [详细]
author-avatar
寡凫lo单鹄官方
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有