React基础学习-Day08

React基础学习-Day08

React生命周期(旧)(新)(函数组件)

(旧)

img

在 React 16 版本之前,React 使用了一套不同的生命周期方法。这些生命周期方法在 React 16 中仍然可以使用,但被标记为将来可能会被废弃,建议尽量使用新的生命周期方法来代替。以下是旧版 React 生命周期方法的主要分类和用法:

1. 挂载阶段(Mounting Phase)

这些生命周期方法在组件实例被创建并插入 DOM 中时被调用。

  • constructor(props)
    • 构造函数,用于初始化组件的状态(state)和绑定事件处理方法。通常用来进行一些初始化操作。
  • componentWillMount()
    • 在组件即将被挂载到 DOM 之前调用,仅在服务端渲染时才会被调用。不推荐使用,可以使用 constructor()componentDidMount() 替代。
  • render()
    • 必需的方法,返回组件的 JSX 表示。描述了组件的 UI 呈现。
  • componentDidMount()
    • 在组件挂载后(插入 DOM 树中后)立即调用。通常用于发起网络请求或设置订阅。

2. 更新阶段(Updating Phase)

这些生命周期方法在组件更新时被调用,比如 props 或 state 的改变。

  • componentWillReceiveProps(nextProps)
    • 在组件接收到新的 props 时被调用。不推荐使用,可以使用 static getDerivedStateFromProps()componentDidUpdate() 替代。
  • shouldComponentUpdate(nextProps, nextState)
    • 允许开发者手动判断是否重新渲染组件。默认返回 true,表示总是重新渲染。
  • componentWillUpdate(nextProps, nextState)
    • 在组件即将更新(重新渲染)时被调用。不推荐使用,可以使用 getSnapshotBeforeUpdate()componentDidUpdate() 替代。
  • render()
    • 更新 UI。
  • componentDidUpdate(prevProps, prevState)
    • 在组件更新后立即调用。通常用于处理 DOM 更新之后的操作。

3. 卸载阶段(Unmounting Phase)

这些生命周期方法在组件从 DOM 中移除时被调用。

  • componentWillUnmount()

    • 在组件被卸载和销毁之前调用。通常用于清理定时器、取消网络请求或清理订阅。

4. 错误处理阶段(Error Handling Phase)

这些生命周期方法在组件在渲染过程中、子组件树中的任何地方抛出错误时被调用。

  • componentDidCatch(error, info)

    • 在后代组件抛出错误后调用。用于记录错误信息等。

(新)

img

在 React 16.3 版本及之后,引入了一些新的生命周期方法,同时对一些旧的生命周期方法进行了调整和标记为过时。这些变化主要是为了解决 React 在异步渲染和性能优化方面的一些挑战。以下是主要的新生命周期方法和使用方式:

1. 挂载阶段(Mounting Phase)

这些生命周期方法在组件实例被创建并插入 DOM 中时被调用。

  • constructor(props)
    • 构造函数,用于初始化组件的状态(state)和绑定事件处理方法。通常用来进行一些初始化操作。
  • static getDerivedStateFromProps(props, state)
    • 在组件挂载(初始化)和更新(接收新的 props)时都会被调用。用于根据 props 更新 state。必须是静态方法,并返回一个对象来更新 state,或者返回 null 表示不更新 state。
  • render()
    • 必需的方法,返回组件的 JSX 表示。描述了组件的 UI 呈现。
  • componentDidMount()
    • 在组件挂载后(插入 DOM 树中后)立即调用。通常用于发起网络请求或设置订阅。

2. 更新阶段(Updating Phase)

这些生命周期方法在组件更新时被调用,比如 props 或 state 的改变。

  • static getDerivedStateFromProps(props, state)
    • 在组件挂载后和每次接收新的 props 时都会被调用,用于根据 props 更新 state。
  • shouldComponentUpdate(nextProps, nextState)
    • 允许开发者手动判断是否重新渲染组件。默认返回 true,表示总是重新渲染。
  • render()
    • 更新 UI。
  • getSnapshotBeforeUpdate(prevProps, prevState)
    • 在组件更新(重新渲染)之前被调用。它可以捕获当前 DOM 的某些信息,返回的值将作为 componentDidUpdate() 的第三个参数传递给它。
  • componentDidUpdate(prevProps, prevState, snapshot)
    • 在组件更新后立即调用。通常用于处理 DOM 更新之后的操作。

3. 卸载阶段(Unmounting Phase)

这些生命周期方法在组件从 DOM 中移除时被调用。

  • componentWillUnmount()

    • 在组件被卸载和销毁之前调用。通常用于清理定时器、取消网络请求或清理订阅。

4. 错误处理阶段(Error Handling Phase)

这些生命周期方法在组件在渲染过程中、子组件树中的任何地方抛出错误时被调用。

  • static getDerivedStateFromError(error)
    • 在后代组件抛出错误后被调用,用于更新 state 以显示备用 UI。
  • componentDidCatch(error, info)
    • 在后代组件抛出错误后调用。用于记录错误信息等。

函数式组件中如何模拟生命周期

如果你想使用 useEffect Hook 来分别模拟类组件中的不同生命周期方法,可以这样做:

模拟 componentDidMount

import React, { useEffect } from 'react';function MyComponent() {useEffect(() => {// 这里的代码将在组件挂载后执行,相当于 componentDidMountconsole.log('Component mounted');// 如果需要清理操作,可以返回一个函数,在组件卸载时执行return () => {console.log('Component will unmount');};}, []); // 空数组作为第二个参数表示只在组件挂载时执行一次return (<div><p>Component content</p></div>);
}export default MyComponent;

模拟 componentDidUpdate

import React, { useEffect, useState } from 'react';function MyComponent() {const [count, setCount] = useState(0);// useEffect 模拟 componentDidUpdateuseEffect(() => {// 这里的代码将在每次组件更新时执行,相当于 componentDidUpdateconsole.log('Component updated');// 如果有需要,在这里可以执行特定于更新的操作// 注意:这里不返回清理函数,因为这里的 useEffect 不需要在组件卸载时执行}, [count]); // 指定 count 为依赖项,只有 count 更新时才会执行 effectreturn (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}export default MyComponent;

模拟 componentWillUnmount

import React, { useEffect } from 'react';function MyComponent() {useEffect(() => {// 这里的代码将在组件挂载后执行,相当于 componentDidMountconsole.log('Component mounted');// 返回一个清理函数,在组件卸载时执行return () => {console.log('Component will unmount');};}, []); // 空数组作为第二个参数表示只在组件挂载时执行一次return (<div><p>Component content</p></div>);
}export default MyComponent;

在上面的例子中:

  • 第一个 useEffect 模拟了 componentDidMount 生命周期方法,它在组件挂载时执行一次,并且可以返回一个清理函数。
  • 第二个 useEffect 则模拟了 componentDidUpdate 生命周期方法,它在组件更新时执行,依赖于 count 状态的变化。
  • 第三个 useEffect 演示了如何在组件卸载时执行清理操作,类似于 componentWillUnmount

通过使用 useEffect Hook,你可以更灵活地管理组件的副作用和生命周期行为,而不需要依赖类组件中的生命周期方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/873462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

django报错(二):NotSupportedError:MySQL 8 or later is required (found 5.7.43)

执行python manage.py runserver命令时报版本不支持错误&#xff0c;显示“MySQL 8 or later is required (found 5.7.43)”。如图&#xff1a; 即要MySQL 8或更高版本。但是企业大所数用的还是mysql5.7相关版本。因为5.7之后的8.x版本是付费版本&#xff0c;贸然更新数据库肯定…

RK3562 NPU开发环境搭建

如何在Ubuntu系统&#xff08;PC&#xff09;上搭建RK3562 Buildroot Linux的NPU开发环境&#xff1f;即电脑端运行Ubuntu系统&#xff0c;而RK3562板卡运行Buildroot Linux系统的情况下&#xff0c;搭建RK3562 NPU开发环境。 下面是相应的步骤&#xff08;对应的命令&#xf…

DICOM CT\MR片子免费在线查看工具;python pydicom包加载查看;mayavi 3d查看

DICOM CT\MR片子免费在线查看工具 参考&#xff1a; https://zhuanlan.zhihu.com/p/668804209 dicom格式&#xff1a; DICOM&#xff08;Digital Imaging and Communications in Medicine&#xff09;是医学数字成像和通信的标准。它定义了医学图像&#xff08;如CT、MRI、X…

蓝桥 双周赛算法赛【小白场】

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 蓝桥第14场小白入门赛T1/T2/T3 题目&#xff1a; T1照常还是送分题无需多…

ChatTTS超强的真人AI语音助手下载使用教程

简介 ChatTTS是专门为对话场景设计的文本转语音模型&#xff0c;支持多人同时对话&#xff0c;适用的场景非常丰富&#xff0c;比如LLM助手对话任务&#xff0c;视频配音、声音克隆等。同时支持英文和中文两种语言。最大的模型使用了10万小时以上的中英文数据进行训练&#xf…

AI 基于病理图像分析揭示了一种不同类型的子宫内膜癌| 文献速递-基于人工智能(AI base)的医学影像研究与疾病诊断

Title 题目 AI-based histopathology image analysisreveals a distinct subset of endometrialcancers AI 基于病理图像分析揭示了一种不同类型的子宫内膜癌。 01 文献速递介绍 子宫内膜癌&#xff08;EC&#xff09;有四种分子亚型&#xff0c;具有很强的预后价值和治疗…

如何安装Visual Studio Code

Visual Studio Code&#xff08;简称 VS Code&#xff09; Visual Studio Code 是一款由微软开发的免费、开源的现代化轻量级代码编辑器。 主要特点包括&#xff1a; 跨平台&#xff1a;支持 Windows、Mac 和 Linux 等主流操作系统&#xff0c;方便开发者在不同平台上保持一…

二叉树 初阶 总结

树的基础认知 结点的度&#xff1a;一个结点含有的子树的个数称为该结点的度&#xff1b; 如上图&#xff1a;A的为6 叶结点或终端结点&#xff1a;度为0的结点称为叶结点&#xff1b; 如上图&#xff1a;B、C、H、I...等结点为叶结点 非终端结点或分支结点&#xff1a;度不为0…

采用T网络反馈电路的运算放大器(运放)反相放大器

运算放大器(运放)反相放大器电路 设计目标 输入电压ViMin输入电压ViMax输出电压VoMin输出电压VoMaxBW fp电源电压Vcc电源电压Vee-2.5mV2.5mV–2.5V2.5V5kHz5V–5V 设计说明1 该设计将输入信号 Vin 反相并应用 1000V/V 或 60dB 的信号增益。具有 T 反馈网络的反相放大器可用…

【鸿蒙学习笔记】位置设置・position・绝对定位・子组件相对父组件

官方文档&#xff1a;位置设置 目录标题 position・绝对定位・子组件相对父组件Row Text position position・绝对定位・子组件相对父组件 正→ ↓ Row Text position Entry Component struct Loc_position {State message: string Hello World;build() {Column() {Co…

【Neural signal processing and analysis zero to hero】- 1

The basics of neural signal processing course from youtube: 传送地址 Possible preprocessing steps Signal artifacts (not) to worry about doing visual based artifact rejection so that means that before you start analyzing, you can identify those data epic…

Elasticsearch:如何选择向量数据库?

作者&#xff1a;来自 Elastic Elastic Platform Team 向量数据库领域是一个快速发展的领域&#xff0c;它正在改变我们管理和搜索数据的方式。与传统数据库不同&#xff0c;向量数据库以向量的形式存储和管理数据。这种独特的方法可以实现更精确、更相关的搜索&#xff0c;并允…

【HarmonyOS】关于鸿蒙消息推送的心得体会 (一)

【HarmonyOS】关于鸿蒙消息推送的心得体会&#xff08;一&#xff09; 前言 这几天调研了鸿蒙消息推送的实现方式&#xff0c;形成了开发设计方案&#xff0c;颇有体会&#xff0c;与各位分享。 虽然没做之前觉得很简单的小功能&#xff0c;貌似只需要和华为服务器通信&…

Unity XR Interaction Toolkit的安装(二)

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神不吝指教&#xff01; 文章目录 前言一、安装1.打开unity项目2.打开包管理器&#xff08;PackageManage&#xff09;3.导入Input System依赖包4.Interaction Layers unity设置总结 前言 安装前请注意&#xff1a;需要…

科技论文在线--适合练习期刊写作和快速发表科技成果论文投稿网站

中国科技论文在线这个平台可以作为练手的一个渠道&#xff0c;至少可以锻炼一下中文写作&#xff0c;或者写一些科研方向的简单综述性文章。当然&#xff0c;如果你的老师期末要求也是交一份科技论文在线的刊载证明的话&#xff0c;这篇文章可以给你提供一些经验。 中国科技论…

【Linux服务器Java环境搭建】011在linux中安装Nginx,以及停止或启动Nginx服务

系列文章目录 【Linux服务器Java环境搭建】 前言 又到了周五晚上了&#xff0c;最近工作上有些忙&#xff0c;忙于一个需求频繁变更的项目&#xff0c;都快吐血了&#xff0c;懂得都懂&#xff0c;哈哈&#xff0c;正好有时间了&#xff0c;继续写系列【Linux服务器Java环境搭…

linux远程主机和windows互传

一.winscp 最简单&#xff0c;但有时候会出现连不上 二 .MobaXterm 可以选择多种连接方式 二. 配置samba服务器 1. 新增samba用户 sudo pdbedit -L -v 查看当前samba用户 sudo smbpasswd -a guoziyi 添加samba用户 sudo smbpasswd -x guoziyi 删除samba用户 2. 编辑/etc…

加油卡APP系统开发:在线优惠加油,拓展市场

目前&#xff0c;我国汽车行业发展迅速&#xff0c;用车群体逐年扩大&#xff0c;因此&#xff0c;汽车加油市场规模呈现出了快速增长趋势。不过近年来&#xff0c;油价不断上涨&#xff0c;增加了居民的生活成本&#xff0c;为了节省汽车加油的支出&#xff0c;很多人都开始选…

使用idea创建Javaweb项目(步骤)

第一步创建Javaweb项目 File>New>Project 第二步 勾选Web Application >Next 然后就是进行起名&#xff0c;完成。 完成创建项目&#xff0c;检查是否文件齐全 配置tomcat 配置好&#xff0c;就能启动tomcat&#xff0c;显示首页 导入jar包。导入进项目&#xf…

【力扣】最小栈

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 设计一个支持 push…