当前位置: 首页 > news >正文

React组件生命周期节点触发时机(组件加载Mount、组件更新Update、组件卸载Unmount)组件挂载

文章目录

  • 🧩 React 组件的“生命周期”通俗讲解
    • 🌱 一、加载阶段(Mount)
      • 🧠 什么时候发生?
      • 🧩 类组件的生命周期钩子:
      • 🪴 函数组件 + Hooks:
    • 🔁 二、更新阶段(Update)
      • 💬 那这些“变化”怎么来的?(用户是怎么触发的)
      • 🧩 类组件示例
      • 🪄 函数组件示例
      • 📍 **用户触发更新的具体例子:**
    • 🌑 三、卸载阶段(Unmount)
      • 🧩 类组件:
      • 🪶 函数组件:
      • 💬 那用户是怎么触发卸载的呢?
    • 🧭 一个完整的流程图
    • 🧭 生命周期与用户行为总结图
    • 💡 举个实际的小例子
    • 🪄 总结表
    • 🎯 写在最后

🧩 React 组件的“生命周期”通俗讲解

想象一下,一个 React 组件就像你养的一只小宠物:
出生(加载)成长(更新)离开(卸载)
React 会在这三个阶段自动帮你做一些事,而你也可以在不同阶段去“插手”处理逻辑。


🌱 一、加载阶段(Mount)

加载,也叫“挂载”。
就是组件第一次被放进页面里、第一次显示在屏幕上的时候。

🧠 什么时候发生?

  • 你在父组件里写了 <Child />
  • React 需要把这个组件渲染到真实的 DOM 上

📍 用户操作触发示例:

这些行为都可能导致组件第一次挂载:

  • 切换路由页面(如从 /home 跳到 /about,React Router 会加载新页面组件)
  • 点击按钮 显示某个子组件(例如点击“展开详情”按钮后才渲染 <Detail />
  • 条件渲染出现{show && <Modal />}false 变成 true

换句话说:只要某个组件第一次出现在页面上,就会经历挂载阶段。

🧩 类组件的生命周期钩子:

class Example extends React.Component {componentDidMount() {console.log("组件挂载完成!");}render() {return <div>你好,我刚出生 👶</div>;}
}

componentDidMount 会在组件挂载后执行。
常用于:

  • 请求接口数据(fetch)
  • 操作 DOM
  • 启动计时器等副作用

🪴 函数组件 + Hooks:

import { useEffect } from "react";function Example() {useEffect(() => {console.log("组件挂载完成!");}, []); // 依赖数组为空 → 只在第一次执行return <div>你好,我刚出生 👶</div>;
}

🔁 二、更新阶段(Update)

更新,就是组件因为数据变化而重新渲染。
可能的触发原因包括:

  • 组件自己的 state 改变
  • 父组件传来的 props 改变
  • 上层重新渲染导致子组件也被迫更新

💬 那这些“变化”怎么来的?(用户是怎么触发的)

React 组件的更新几乎都来自用户操作或外部数据变化,比如:

  • 用户在输入框里输入内容,触发 setState 更新
  • 点击按钮修改状态,例如 setCount(count + 1)
  • 父组件更新了 props(比如父组件的 state 变化)
  • 后端请求返回新数据后更新状态
  • 定时器定期改变数据(如计时器)

每次组件的 state 或接收到的 props 改变,React 就会执行“更新阶段”的逻辑。

🧩 类组件示例

class Example extends React.Component {componentDidUpdate(prevProps, prevState) {console.log("组件更新了!");}render() {return <div>{this.props.count}</div>;}
}

🪄 函数组件示例

function Example({ count }) {useEffect(() => {console.log("组件更新了!");}, [count]); // 当 count 变化时执行return <div>{count}</div>;
}

小技巧:

  • 如果你不加依赖项,useEffect 每次渲染都会执行。
  • 如果依赖项是空数组,只在挂载时执行一次。
  • 如果依赖项包含变量,只在那个变量变化时执行。

📍 用户触发更新的具体例子:

function Counter() {const [count, setCount] = useState(0);return (<><p>点击次数:{count}</p><button onClick={() => setCount(count + 1)}>点我</button></>);
}

每当你点击按钮时,setCount 改变了 state,
React 就会重新渲染组件,执行更新阶段。


🌑 三、卸载阶段(Unmount)

卸载,就是组件“离开”页面的时刻。
React 会把它从 DOM 中移除。

🧩 类组件:

class Example extends React.Component {componentWillUnmount() {console.log("组件被卸载了 🫡");}render() {return <div>再见!</div>;}
}

🪶 函数组件:

import { useEffect } from "react";function Example() {useEffect(() => {console.log("组件挂载");return () => {console.log("组件卸载 🫡");};}, []);return <div>再见!</div>;
}

注意这里的 return () => {} 就是 清理函数
React 会在组件卸载时调用它,非常适合:

  • 清除定时器
  • 取消网络请求
  • 移除事件监听器

💬 那用户是怎么触发卸载的呢?

当一个组件不再被渲染时,就会触发卸载。
这通常由以下操作引起:

  • 切换页面或路由(比如从 /home 跳到 /profile
  • 条件渲染变为 false{show && <Modal />} 从 true → false)
  • 组件被父组件移除(父组件结构或 state 改变导致不再渲染它)
  • React 丢弃旧的组件实例(如 key 改变时)

📍 举个例子:

// page.tsx
"use client";import React, { useEffect, useState } from "react";function App() {const [show, setShow] = useState(true);return (<><button onClick={() => setShow(!show)}>{show ? "卸载组件" : "重新加载组件"}</button>{show && <Child />}</>);
}function Child() {useEffect(() => {console.log("Child 挂载");return () => console.log("Child 卸载");}, []);return <p>👋 我是子组件</p>;
}export default App;

点击按钮时,showtruefalse,React 会移除 <Child />
执行清理函数,也就是“卸载阶段”。

在这里插入图片描述
在这里插入图片描述


🧭 一个完整的流程图

挂载(Mount) → 更新(Update) → 卸载(Unmount)↑                ↑                 ↑useEffect([])     useEffect([deps])   return cleanup()componentDidMount componentDidUpdate  componentWillUnmount

🧭 生命周期与用户行为总结图

用户操作或数据变化↓┌───────────────┐│ 挂载(Mount) │  ← 第一次显示(点击打开、切换路由等)└──────┬────────┘↓│ 更新(Update) │ ← 用户输入、点击、接口返回数据等↓┌──────┴────────┐│ 卸载(Unmount)│ ← 页面切换、隐藏组件、销毁实例等└────────────────┘

💡 举个实际的小例子

我们来写一个计时器组件,看看三个阶段是怎么触发的:

import { useEffect, useState } from "react";function Timer() {const [count, setCount] = useState(0);useEffect(() => {console.log("⏱ 组件挂载");const timer = setInterval(() => setCount(c => c + 1), 1000);return () => {console.log("🧹 清除定时器,组件卸载");clearInterval(timer);};}, []);useEffect(() => {console.log("🔁 count 更新为:", count);}, [count]);return <h1>时间:{count}</h1>;
}export default Timer;
  • 第一次显示时,会打印“组件挂载”
  • 每秒 count 更新一次,会打印“count 更新为…”
  • 当组件被移除时(比如跳转页面),会打印“清除定时器,组件卸载”

在这里插入图片描述


🪄 总结表

阶段类组件方法函数组件写法常见用途常见触发操作
挂载componentDidMountuseEffect(() => {}, [])初始化、数据请求页面加载、点击显示、条件渲染变为 true
更新componentDidUpdateuseEffect(() => {}, [deps])响应数据变化用户输入、点击按钮、父组件更新
卸载componentWillUnmountuseEffect(() => { return cleanup }, [])清理副作用路由切换、隐藏组件、条件渲染变为 false

🎯 写在最后

理解 React 的三个阶段只是第一步,
更重要的是要明白——是谁触发了这些阶段的变化?

🧠 挂载:组件第一次出现(比如你点击“展开详情”)
🔁 更新:组件里的数据或父组件数据变了
🧹 卸载:组件被移除或页面跳转


http://www.dtcms.com/a/485982.html

相关文章:

  • 月球矩阵日志:Swift 6.2 主线程隔离抉择(上)
  • 无需 iCloud 在 iPhone 之间传输文本消息
  • Flink受管状态自定义序列化原理深度解析与实践指南
  • Unity Visual Graph粒子系统 Plexus 效果
  • 淘宝里网站建设公司可以吗无经验能做sem专员
  • seo技术秋蝉河北网站优化建设
  • C++微服务 UserServer 设计与实现
  • 设计模式篇之 迭代器模式 Iterator
  • Spring MVC 多租户架构与数据隔离教程
  • MySQL数据库如何实现主从复制
  • 如何在 Docker 中设置环境变量 ?
  • 【C++】STL容器--list的使用
  • 【深度学习计算机视觉】12:风格迁移
  • 网站到期可以续费织梦安装网站后图片
  • 公司购物网站备案wordpress恢复主题
  • C++基于opencv实现的暗通道的先验图像去雾
  • 大型PCB标定方案:基于对角Mark点的分区域识别与校准
  • 做羞羞事视频网站网站策划哪里找
  • 【Android RxJava】Observal与Subject深入理解
  • 基于Rokid CXR-S SDK的智能AR翻译助手技术拆解与实现指南
  • 【uniapp】微信小程序修改按钮样式
  • Lombok使用指南(中)
  • Threejs入门学习笔记
  • 机器学习模型评估指标AUC详解:从理论到实践
  • 凡科建站小程序网站设计的一般流程
  • Linux C/C++ 学习日记(24)UDP协议的介绍:广播、多播的实现
  • OpenHarmony内核基础:LiteOS-M内核与POSIX/CMSIS接口
  • C语言实现Modbus TCP/IP协议客户端-服务器
  • ORACLE 19C ADG环境 如何快速删除1.8TB的分区表?有哪些注意事项?
  • 重庆黔江做防溺水的网站少儿编程十大培训机构