2026/4/18 7:42:14
网站建设
项目流程
知名网站规划,网站开发速成,天津品牌网站建设公司哪家好,电子商务网站建设与维护能赚多少钱React 生命周期详解#xff1a;从挂载到卸载
React 组件的生命周期#xff08;Lifecycle#xff09;是指组件从创建到销毁的整个过程#xff0c;包括挂载、更新和卸载三个主要阶段。这套机制允许开发者在组件的不同生命周期节点注入自定义逻辑#xff0c;如初始化状态、请…React 生命周期详解从挂载到卸载React 组件的生命周期Lifecycle是指组件从创建到销毁的整个过程包括挂载、更新和卸载三个主要阶段。这套机制允许开发者在组件的不同生命周期节点注入自定义逻辑如初始化状态、请求数据、清理资源等。关键点主要针对类组件React 16.3 引入 Hooks 后函数组件通过useEffect等 Hook 模拟生命周期。但本文重点讲解类组件的经典生命周期基于 React 18。已弃用方法React 17 标记了componentWillMount、componentWillReceiveProps、componentWillUpdate为 UNSAFE_不推荐使用可能在未来版本移除。异步渲染React 16 支持异步渲染生命周期方法调用顺序可能因 Fiber 架构而略有变化但整体流程一致。Hooks 替代函数组件更推荐使用useEffect、useState等实现类似功能。下面按时间线从挂载到卸载详细拆解每个阶段包括方法调用顺序、用途、代码示例和注意事项。1. 挂载阶段Mounting组件首次渲染到 DOM这一阶段从组件实例化开始到插入 DOM 结束。顺序固定。方法名称调用时机用途 / 常见操作是否能访问 DOM异步渲染影响constructor()组件实例化时props 传入前初始化 state、绑定方法this.xxx this.xxx.bind(this)否无static getDerivedStateFromProps(props, state)constructor 后 / render 前静态方法从 props 派生 state很少用否无render()所有准备就绪后返回 JSX / React 元素纯函数不能有副作用否—componentDidMount()render 后组件已插入 DOM请求数据、添加事件监听、setState初始化后更新是无代码示例class MyComponent extends React.Component { constructor(props) { super(props); this.state { count: 0 }; this.handleClick this.handleClick.bind(this); // 绑定方法 } static getDerivedStateFromProps(nextProps, prevState) { if (nextProps.initialCount ! prevState.count) { return { count: nextProps.initialCount }; // 从 props 更新 state } return null; } componentDidMount() { // 发起 API 请求 fetch(/api/data).then(res this.setState({ data: res })); document.addEventListener(click, this.handleClick); // 添加全局监听 } render() { return divCount: {this.state.count}/div; } }注意避免在 constructor 中调用 setStateprops 还没初始化。componentDidMount 是请求数据的黄金时机不会阻塞渲染。已弃用UNSAFE_componentWillMount用 constructor 或 getDerivedStateFromProps 代替。2. 更新阶段Updating组件 props/state 变化时当 props/state 变化、父组件重渲染或 forceUpdate() 时触发。顺序类似挂载但多了一些更新前检查。方法名称调用时机用途 / 常见操作是否能访问 DOM异步渲染影响static getDerivedStateFromProps(props, state)props/state 变化后render 前从新 props 更新 state否无shouldComponentUpdate(nextProps, nextState)getDerivedStateFromProps 后性能优化返回 false 阻止渲染PureComponent 默认实现否无render()shouldComponentUpdate 返回 true 后返回新 JSX否—getSnapshotBeforeUpdate(prevProps, prevState)render 后DOM 更新前捕获 DOM 状态如滚动位置返回给 componentDidUpdate是无componentDidUpdate(prevProps, prevState, snapshot)DOM 更新后更新后操作如动画、请求新数据是无代码示例class MyComponent extends React.Component { shouldComponentUpdate(nextProps, nextState) { return nextProps.value ! this.props.value; // 浅比较避免不必要渲染 } getSnapshotBeforeUpdate(prevProps, prevState) { // 捕获滚动位置 return document.getElementById(scroll-container).scrollTop; } componentDidUpdate(prevProps, prevState, snapshot) { if (this.props.value ! prevProps.value) { // 根据 snapshot 恢复滚动位置 document.getElementById(scroll-container).scrollTop snapshot; // 或发起新请求 fetch(/api/update?newValue${this.props.value}); } } render() { return divValue: {this.props.value}/div; } }注意shouldComponentUpdate 是性能调优的关键但不要过度使用。已弃用UNSAFE_componentWillReceiveProps、UNSAFE_componentWillUpdate用 getDerivedStateFromProps / getSnapshotBeforeUpdate 代替。componentDidUpdate 避免直接 setState防止无限循环用条件判断。3. 卸载阶段Unmounting组件从 DOM 移除当组件被移除父组件不渲染它时触发。只有一个方法。方法名称调用时机用途 / 常见操作是否能访问 DOM异步渲染影响componentWillUnmount()组件即将从 DOM 移除前清理资源移除事件监听、取消定时器、关闭连接是无代码示例class MyComponent extends React.Component { componentDidMount() { this.timer setInterval(() console.log(tick), 1000); document.addEventListener(click, this.handleClick); } componentWillUnmount() { clearInterval(this.timer); // 清理定时器 document.removeEventListener(click, this.handleClick); // 移除监听 // 关闭 WebSocket 等 } render() { return divUnmounting Example/div; } }注意这里是清理资源的唯一时机防止内存泄漏。不要在这里 setState组件已卸载。已弃用无但老版本有 componentWillUnmount 的 UNSAFE_ 变体。4. 函数组件的生命周期Hooks 模拟2025 主流写法类组件生命周期正逐渐被 Hooks 取代。Hooks 更简洁、复用性强。类组件方法Hooks 等价物备注constructoruseState 初始值—getDerivedStateFromPropsuseEffect 依赖数组—componentDidMountuseEffect(() { … }, [])空依赖数组shouldComponentUpdateReact.memo / useMemo—componentDidUpdateuseEffect(() { … }, [deps])非空依赖componentWillUnmountuseEffect(() { return cleanup; }, [deps])返回清理函数Hooks 示例模拟类组件import { useState, useEffect } from react; function MyFunctionalComponent({ value }) { const [count, setCount] useState(0); useEffect(() { // componentDidMount componentDidUpdate fetch(/api/data?value${value}).then(res setCount(res.count)); return () { // componentWillUnmount console.log(清理资源); }; }, [value]); // 依赖 value 变化 return divCount: {count}/div; }注意useEffect 的依赖数组是关键空数组 只挂载时执行无数组 每次渲染都执行。5. 常见问题与最佳实践无限循环componentDidUpdate / useEffect 中无条件 setState → 无限渲染。性能优化用 shouldComponentUpdate / React.memo 避免子组件不必要重渲染。异步问题setState 是异步的用回调形式处理。迁移建议新项目优先 Hooks函数组件老项目类组件可渐进迁移。调试工具React DevTools 高亮组件渲染顺序和生命周期钩子。掌握这些你就能在 React 项目中精准控制组件行为如果想看具体 Hooks 示例或某个方法的深度代码实战告诉我我们继续。