React18原理: 生命周期中特别注意事项

react18-代码规范-ts-仿网易云项目 因为react创建项目不像vue会提示需要按照xxx,react默认创建出的项目是不包含其他东西的,我们想集成typescript时,可以追加参数删掉一些无用文件变成下图我们会发现一个文件此文件引用特定于使用Create React App启动的项目的TypeScript类型声明。这些类型声明添加了对导入资源文件的支持,如bmp、gif、jpeg、jpg、png、webp和svg。它还添加了对导入CSS模块的支持。 阅读详情

概述

  • 生命周期就是一个组件从诞生到销毁的全过程(包含错误捕获,这里暂且不聊这个)
  • react 在组件的生命周期中注册了一系列的钩子函数
  • 支持开发者在其中嵌入代码,并在适当的时机运行
  • 生命周期本质上就是组件中的钩子函数,主要有三个主要的钩子
    • 挂载
    • 更新
    • 卸载

首次挂载

  • 1 )初始化 constructor

    • 同一个类组件对象只会运行一次
    • 所以经常来做一些初始化的操作
    • 同一个组件对象被多次创建,它们的 constructor 互不干扰
    • 注意
      • 在 constructor 中尽量避免(禁止) 使用 setState
      • setState会造成页面的重新渲染
      • 但是在 初始化 阶段,页面都还没有将真实dom挂载到页面上,是没有任何重新渲染的意义的
      • 除异步情况,比如 setInterval 中使用 setState 是没问题的,
      • 因为在执行的时候页面早已渲染完成,但也最好不要使用,容易引起奇怪的问题,参考
        constructor(props) {
          super(props);
          this.state = {
            num: 1
          }
        
          // 不可以,直接warning
          this.setState({
            num: this.state.num + 1
          });
        
          // 可以使用,但不建议
          setInterval(() => {
            this.setState({
              num: this.state.num + 1
            });
          }, 1000);
        }
        
  • 2 )获取最新的属性和状态 static getDerivedStateFromProps

    • 该方法是一个静态属性,静态属性就是为了不让使用 this 和 setState
    • 在16版本之前不存在,在新版生命周期中,主要用于取代 componentWillMount 和 comonentWillReceiveProps
    • 因为这两个老生命周期方法在协议开发者不规范的使用下极易产生一些反模式的 bug
    • 因为是静态方法,所以,你在其中根本拿不到 this, 更不可能调用 setState
    • 该方法在挂载阶段和更新阶段都会运行,它有两个参数 props 和 state 当前的属性值和状态
    • 它的返回值会合并掉当前的状态 (state), 如果返回了非 Object 的值
    • 那么它啥都不会做,如果返回的是 Object, 那它将会跟当前的状态合并
    • 可以理解为 Object.assign, 通常情况下,几乎不怎么使用该方法
      /**
       * 静态方法,首次挂载和更新渲染都会运行该方法
      * props 当前属性
      * state 当前状态
      */
      static getDerivedStateFromProps(props, state) {
        // return 1; // 没用
        return {
          num: 999, // 合并到当前 state 对象
        }
      }
      
  • 3 )创建 vDOM render

    • 最重要的生命周期,没有之一,用来生成虚拟节点vDom树
    • 该方法只要遇到需要重新渲染都会运行
    • 同样,在 render 中也严禁使用 setState, 因为会导致无限递归重新渲染导致 爆栈
      render() {
        // 严禁使用
        this.setState({
          num: 1
        })
        return (
          <>
            (this.state.num)
          </>
        )
      }
      
  • 4 )挂载到页面渲染成真实Dom componentDidMount

    • 该方法只会运行一次,在 首次渲染 时页面将 真实 dom 挂载完毕之后运行
    • 通常在这里做一些异步操作,比如开启定时器,发起网络请求,获取真实DOM等
    • 在该方法中,可以大胆使用 setState, 因为页面已经渲染完成
    • 执行完该钩子函数后,组件正式进入到 活跃 状态
      componentDidMount() {
        // 初始化或异步代码
        this.setState({})
        setInterval(() => {}); // 简单模拟
        document.querySelectorAll('div');
      }
      

更新阶段

  • 更新阶段会更新 state 或 更新 props

  • 1 )获取最新的属性和状态 static getDerivedStateFromProps

  • 2 )是否重新渲染 shouldComponentUpdate

    • 在执行完 static getDerivedStateFromProps 后,会执行该钩子函数
    • 该方法通常用来做 性能优化,它的返回值 (boolean) 决定了是否要进行 渲染 更新
    • 该方法有两个参数 nextProps 和 nextState 表示此次更新(下一次)的属性和状态
    • 通常,我们会将当前值与此次要更新的值做比较来决定是否要进行重新渲染
    • 在react 中,官方提供了一个基础版的优化组件 PureComponent 就是一个 HOC 高阶组件
    • 内部实现就是帮我们用 shouldComponentUpdate 做了浅比较
    • 注意,继承了 PureComponent 后, 不需要再使用 SCU 进行优化
      /**
       * 决定是否要重新进行渲染
       * nextProps 此次更新的属性
       * nextState 此次更新的状态
       * returns boolean
       */
      shouldComponentUpdate(nextProps, nextState) {
        // 伪代码,如果当前的值和下一次的值相等,那么就没有更新渲染的必要了
        if (this.props === nextProps && this.state === nextState) {
          return false;
        }
        return true;
      }
      
  • 3 )更新vDOM render

  • 4 )获取更新之前的状态 getSnapshotBeforeUpdate

    • 如果 shouldComponentUpdate 返回是 true,
    • 那么就会运行 render 重新生成虚拟 DOM 树来进行对比更新
    • 该方法运行在 render 之后,表示 真实 DOM 已经构建完成
    • 但还没有渲染到页面中,可以理解为更新前的 快照,通常用来做一些附加的DOM操作
    • 比如,突然想针对某个 class 的真实元素做一些事情,那么就可以在此方法中获取元素
    • 并修改,该函数有两个参数 prevProps 和 prevState 表示此次更新前的属性和状态
    • 该函数的返回值 snapshot,会作为 componentDidUpdate 的第三个参数
      /**
       * 获取更新前的快照,通常用来做一些附加的DOM操作
       * prevProps 更新前的属性
       * prevState 更新前的状态
       */
      getSnapshotBeforeUpdate(prevProps, prevState) {
        // 获取真实DOM在渲染到页面前作一些附加操作...
        document.querySelectorAll('div').forEach(it => it.innerHTML = '123')
        return 'componentDidUpdate的第三个参数'
      }
      
  • 5 )更新后挂载成真实DOM componentDidUpdate

    • 该方法是 更新阶段 最后运行的 钩子函数,跟 getSnapshotBeforeUpdate 不同的是
    • 它运行时间点是在 真实DOM 挂载到页面后,通常也会使用该方法来操作一些真实的DOM
    • 它有三个参数分别为: prevProps, prevState, snapshot, 跟 Snapshot 钩子函数一样
    • 表示更新前的属性,状态,Snapshot 钩子函数的返回值
      /**
       * prevProps 更新前的属性
       * prevState 更新前的状态
       * snapshot getSnapshotBeforeUpdate 的返回值
       */
      componentDidUpdate(prevProps, prevState, snapshot) {
        document.querySelectorAll('div').forEach(it => it.innerHTML = snapshot)
      }
      

卸载阶段

  • 组件被卸载 componentWillUnMount
    • 该 钩子函数 属于卸载阶段中唯一的方法
    • 如果组件在渲染的过程中被卸载了,React会报出 Warning: Can’t perform a React state update on an unmounted component 的警告
    • 所以,通常爱组件被卸载时,做清除副作用的操作
      componentWillUnmount() {
        // 组件倍卸载前清理副作用
        clearInterval(timer1);
        clearTimeout(timer2);
        this.setState = () => {};
      }
      
React ref机制详解:从原理到最佳实践 在React开发中,ref是访问DOM节点和组件实例的重要机制,其核心原理是通过创建可变引用对象来突破React的声明式范式。与状态管理不同,ref变更不会触发组件重渲染,这种特性使其成为DOM操作、第三方库集成和命令式动画的关键技术方案。React提供了createRef、useRef和回调ref三种实现方式,各有其适用场景和性能特点。在函数组件中,结合useEffect和useRef可以实现安全的DOM操作;而在类组件中,createRef与生命周期方法的配合能确保引用稳定性。实际开发中,ref常用于表 阅读详情

相关推荐

React 核心知识

类组件: 有状态组件 生命周期方法的使用 类组件与函数组件的对比 组件命名与结构: PascalCase命名规范:组件名称应使用大驼峰命名法,如 组件文件结构组织:一个组件通常对应一个文件,文件名与组件名一致 组件拆分原则:根据职责单一原则拆分组件,避免大型组件 JSX: JavaScript的扩展语法,允许在JavaScript中编写HTML结构 会被Babel编译为React.createElement()调用 示例: JSX转换:Babel将JSX转换为React.createE

hengshujiyi的专栏 411

React18.生命周期

react生命周期分为四大阶段:Initialization: 初始化阶段 Mounting:挂载阶段Updation: 更新阶段 Unmounting: 销毁阶段

汉堡请不要欺负面条 4125

前端面试核心考点:React、浏览器原理与工程化实践

前端开发中,React技术栈、浏览器工作原理和工程化实践是构建现代Web应用的三大基石。React通过虚拟DOM和Fiber架构实现高效渲染,其Hooks机制改变了组件开发模式。浏览器原理涉及事件循环、渲染管线等核心机制,直接影响页面性能指标如LCP和CLS。工程化实践则涵盖微前端、性能优化和监控体系,是保障大型项目可维护性的关键。以金融科技公司X transfer的面试为例,这些问题常被深度考察,如React useEffect的闭包陷阱、浏览器层叠上下文优化等。掌握这些技术不仅能通过面试,更能提升实际开

weixin_29010003的博客 242

【React】生命周期详解

文章目录constructor(props) constructor(props) React组件的构造函数在挂载之前被调用。 在使用React.Component构造函数时: 需要先在添加其他内容前,调用super(props) 用来将父组件传来的props绑定到这个类中 使用this.props将会得到。 官方建议: 不要在constructor引入任何具有副作用和订阅功能的代码,这些应当使用componentDidMount()。 constructor中应当做些初始化的动作 如:初始化

qq_45677671的博客 4086

智能制造 | 如何快速自动生成站位表及自动与BOM校验?

一、站位表(SMT行业中)是SMT上料防错的基础信息,用于对需上料物料与产线、贴片机位置、飞达规格型号、用量,建立基础资料。 SMT站位表是否正确? 首先需要人工确认站位表与SMT程序的是否符合,上料员依照站位表安装好后,确认人员需有第三方确认者 (品管确定)核对。 站位表内容包括什么? 站位表内容为:SMT站位号相对应的物料编码,元件位号,飞达大小/间距,数量等等,根据不同公司的要求而定义。 就目前来说,基本每一款贴片机都可以输出站位清单 但对于企业来说,直接输出的站位清单一般不直接使用,需要进行手动处理

vayoinfo111的博客 4944

TB6600驱动器共阴共阳接法傻傻分不清?一张图搞定STM32与42步进电机的接线避坑指南

本文详细解析了TB6600驱动器共阴共阳接法的本质区别,提供了STM32与42步进电机的高效连接方案。通过实际案例和接线图示,帮助读者避免常见错误,确保驱动器与MCU的安全连接,提升项目稳定性。

weixin_28710999的博客 249

React18 生命周期

文章目录生命周期顺序Mounting 挂载顺序Updation 更新顺序Unmounting 卸载注意生命周期1. constuctor2. componentWillMount(废弃)3. static getDerivedStateFromProps(新增)4. render5. componentDidMount版本迁移 在17版本中 废除的生命周期有:componentWillMount,componentwillReceiveProps,componentWillUpdate 新增的生命周期

猫老板的豆 2032

5分钟搞懂深度学习如何革新声源定位:从GCC-PHAT到DNN的实战对比

本文深入对比了深度学习与传统GCC-PHAT方法在声源定位领域的实战表现。通过具体实验数据,展示了DNN模型在强混响、低信噪比等复杂场景下,如何实现定位准确率的显著提升,并探讨了其数据驱动范式带来的鲁棒性优势与工程部署挑战。

3a9bq4r8t2y的博客 223

React组件的生命周期函数

注意这个不常用不是我说的, 实在React官网中, 官方列举的。

m0_71485750的博客 1万+

ONNX Runtime C# YOLO全链路压测:从300ms到22ms的15个底层优化技巧

摘要:本文分享了工业质检场景下C#调用YOLOv8s ONNX模型的性能优化实战经验。原始单帧推理耗时300ms无法满足产线需求,通过全链路分析定位瓶颈(预处理85ms、推理180ms、后处理30ms)。重点优化措施包括:使用OpenCVSharp CUDA加速预处理(85ms→12ms),开启ONNX Runtime ALL级别图优化,选用TensorRT执行提供程序(180ms→22ms),以及优化内存管理和线程调度。最终实现单帧总耗时22ms±2ms,GPU利用率提升至85%,完整满足产线120块板/

2601_94871597的博客 402

【Claude】Auto mode cannot determine the safety of an action 报错已解决

Claude Code Auto mode 安全分类器报错完整解析,涵盖 temporarily unavailable、could not evaluate、transcript exceeded 三种情况的根因与处理

博客 1万+

React 18并发渲染与性能优化实战指南

并发渲染是React 18引入的核心架构革新,通过时间切片技术将同步渲染流程改造为可中断的异步任务调度。这种基于Fiber架构的调度机制借鉴了操作系统进程管理思想,允许高优先级用户交互打断低优先级渲染任务,从根本上解决了大规模数据渲染时的界面卡顿问题。在工程实践中,配合startTransition API可以实现紧急更新与非紧急更新的智能区分,典型应用场景包括电商搜索联想、数据仪表盘等高频交互界面。自动批处理机制的增强则进一步优化了异步场景下的渲染性能,结合流式SSR和选择性注水策略,使首屏加载性能提升显

weixin_33968104的博客 470

【异常】CNB提示The bill authorization scope cannot access the current request.

摘要:CNB API返回403错误,表明当前token的授权范围无法访问目标仓库。主要原因是:1) REPO_SLUG填写错误,导致资源地址不匹配;2) CNB_TOKEN未授权目标仓库;3) 账号账单状态异常。解决步骤:先检查REPO_SLUG是否与CNB平台仓库地址完全一致;再确认CNB_TOKEN是否绑定目标仓库且有读取权限;最后检查账号账单是否正常且覆盖目标资源。完成排查后更新配置即可解决此授权问题。

奶爸的编程之路,也就一周冷个三天 663

react-konva 完全指南:用 React 声明式构建 Konva 2D 画布交互应用

本文以 [react-konva](https://link.gitcode.com/i/1750038db3a3c4faf780196cfde09209) 官方 README 为主线,系统讲解如何用 React 的声明式 JSX 语法驱动 Konva 2D 画布库,覆盖安装、组件与事件 API、ref 引用、严格模式、最小化打包、Next.js 集成、Context 桥接以及与 react-ca

gitblog_01193的博客 981

10、犹豫双模糊TOPSIS算法:原理与实例解析

本文介绍了犹豫双模糊TOPSIS算法的基本原理与应用步骤,结合中国四家纺织公司的案例,详细解析了从构建犹豫双模糊决策矩阵、归一化处理、专家信息聚合,到确定正负理想解、计算距离与相对贴近度系数的完整决策流程。该方法有效应对决策者在评价过程中的犹豫性,适用于财务评估、项目选择等复杂多属性决策场景,具有较强的实用性和推广价值。

yhn45678901的博客 123

【局部路径规划模块地图算法】基于势场地图的VFH、VFH+、VFH*算法(附C++代码)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对基于地图的方法–VFH、VFH+、VFH*算法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 1688

React Context API原理与实战:跨层级状态共享的底层机制

Context API是React中实现跨层级组件通信的基础机制,本质是基于组件树结构的上下文快照传递协议,而非全局变量。其核心原理在于Provider通过value prop触发Fiber节点的lane标记与依赖更新,useContext则在render初期同步查找最近Provider并读取值。技术价值体现在零依赖、原生支持、作用域隔离三大优势,广泛应用于主题切换、登录态管理、多语言i18n等UI衍生状态场景。本文深入源码级实现,解析createContext返回对象结构、useContext的Fiber

bk_lin的专栏 432

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

React useEffect深度解析:原理、陷阱与优化实践

React Hooks中的useEffect是处理副作用的强大工具,其核心原理基于函数组件的闭包特性和依赖项追踪机制。作为React生态中的关键API,它统一了生命周期管理、副作用处理和性能优化三大功能,这种声明式范式显著提升了代码的可维护性。在工程实践中,useEffect常用于数据获取、事件监听、DOM操作等场景,但依赖数组的精确控制和闭包陷阱是开发者必须面对的挑战。通过合理使用useCallback、useMemo等辅助Hook,结合清理函数的规范编写,可以有效避免内存泄漏和性能问题。本文以useEf

weixin_30482383的博客 406

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

深度解析:React Fiber架构的3大核心机制与性能优化原理

在JavaScript生态系统中,React Fiber架构的引入标志着前端渲染技术的重要突破。作为React 16中引入的全新协调引擎,Fiber架构彻底改变了React处理虚拟DOM渲染的方式,通过增量渲染机制实现了前所未有的性能优化。本文将深入剖析React Fiber架构的三大核心机制,揭示其如何解决传统渲染瓶颈,并为大型应用提供流畅的用户体验。 ## React Fiber架构的技术背

gitblog_00632的博客 1114

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

React Hooks:核心用法、常见陷阱与工程实践

本文系统解析 React Hooks 核心机制,涵盖调用规则、状态管理、副作用处理与逻辑复用。重点阐明 Hooks 必须在组件顶层、函数内调用的原理,揭示状态更新延迟、闭包捕获旧值等常见问题的本质。结合 React 19+ 时代特性,深入讲解 useState、useReducer、useEffect、useMemo 等核心 API 的正确用法,并通过真实工程案例展示自定义 Hooks 与 Context、Reducer 的协同实践,帮助开发者规避陷阱,构建高效可维护的函数组件。

青蛙king的博客 2003

React Hooks 深度解析与实战应用指南

React Hooks 是 React 16.8 引入的一项革命性特性,它通过函数组件中的状态管理和副作用处理,解决了类组件中的状态逻辑复用、复杂组件理解和类语法心智负担等问题。其核心原理基于 fiber 架构,Hooks 以链表形式存储在 fiber.memoizedState 属性中,确保了每次渲染时 Hooks 调用顺序的一致性。在工程实践中,useState 的惰性初始化和函数式更新、useEffect 的精准依赖控制和清理机制,以及 useMemo 和 useCallback 的性能优化,都是提升

weixin_34198762的博客 313

React Hooks核心原理与最佳实践指南

React Hooks是React 16.8引入的函数式组件状态管理方案,其核心原理基于JavaScript闭包机制,通过useState、useEffect等API赋予函数组件状态能力和副作用管理。这种设计解决了Class组件生命周期碎片化、高阶组件嵌套等问题,大幅提升了代码可维护性。在技术实现上,Hooks依赖调用顺序一致性保证状态正确关联,这要求开发者遵循特定的使用规则。典型应用场景包括表单状态管理、数据订阅、性能优化等,其中useMemo和useCallback能有效避免不必要的子组件渲染。对于复杂

weixin_32642109的博客 238

SweetAlert2-React-Content未来展望:即将推出的新功能与社区贡献指南

SweetAlert2-React-Content 作为官方 SweetAlert2 增强器,为 React 开发者提供了强大的弹窗组件支持。这个工具让 React 元素能够无缝集成到 SweetAlert2 弹窗中,极大地提升了开发效率和用户体验。随着 React 生态系统的不断发展,SweetAlert2-React-Content 也迎来了新的发展机遇。本文将为您详细介绍这个项目的未来规划,

gitblog_01073的博客 941

React Native for OpenHarmony 实战:useRef 引用管理

useRef是 React 提供的 Hook,用于创建可变的引用对象。与useState不同,它不会触发组件重新渲染,其核心特性体现在.current// ref.current 可随时修改,但修改不会导致 re-renderuseRef返回的对象在组件整个生命周期内保持同一引用地址。这解决了 React 函数组件中“闭包陷阱”问题——当异步操作(如定时器)需要访问最新状态时,普通变量会捕获旧值,而始终指向最新值。

Abin 768

React入门大全

React是什么​ 一个专注于构建用户界面的 JavaScript 库,和vue和angular并称前端三大框架,不夸张的说,react引领了很多新思想,世界范围内是最流行的js前端框架,最近发布了18版本,加入了很多新特性​ React英文文档https://reactjs.org/​ React中文文档 https://zh-hans.reactjs.org/​React有什么特点声明式UI(JSX)写UI就和写普通的HTML一样,抛弃命令式的繁琐实现 组件化组件是react中最重要的内容,组件

kuokay的博客 1033

前端多组件集成异常排查:从数据流、生命周期到样式隔离的实战指南

在现代前端开发中,组件化是构建复杂应用的核心范式。其原理在于将UI拆分为独立、可复用的单元,通过明确的接口进行通信与组合。这一模式的技术价值在于提升开发效率、保障代码可维护性,并支持团队协作。然而,当多个复杂组件(如内部封装的图表库或表单引擎)在同一应用场景下集成时,常会遭遇棘手的展示异常问题。这类问题往往不是孤立的样式错误,而是涉及**数据流协议不一致**、**组件生命周期不同步**、**样式作用域冲突**以及**依赖版本不兼容**等多个维度的综合症候群。本文将以一个典型的多组件集成场景为例,系统阐述从环

weixin_33970449的博客 387
上一篇: 前端架构: 脚手架的开发流程和常用框架
下一篇: React18原理: 渲染与更新时的重点关注事项
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值