💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
持续学习,不断总结,共同进步,为了踏实,做好当下事儿~
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

|-----------------------------|
| 💖The Start💖点点关注,收藏不迷路💖 |
📒文章目录
- 
- [1. React 生命周期方法详解](#1. React 生命周期方法详解)
- 
- [1.1 生命周期的三个阶段(挂载、更新、卸载)](#1.1 生命周期的三个阶段(挂载、更新、卸载))
- [1.2 关键生命周期方法的作用](#1.2 关键生命周期方法的作用)
- [1.3 不推荐使用的遗留生命周期方法](#1.3 不推荐使用的遗留生命周期方法)
 
- [2. Hook 的引入与核心概念](#2. Hook 的引入与核心概念)
- 
- [2.1 为什么需要 Hook?](#2.1 为什么需要 Hook?)
- [2.2 常用 Hook 及其作用](#2.2 常用 Hook 及其作用)
- 
- [useState - 状态管理](#useState - 状态管理)
- [useEffect - 副作用处理](#useEffect - 副作用处理)
- 进阶Hook示例:
 
- [2.3 Hook 的规则与最佳实践](#2.3 Hook 的规则与最佳实践)
 
- [3. 生命周期与 Hook 的对比与迁移](#3. 生命周期与 Hook 的对比与迁移)
- 
- [3.1 类组件生命周期 vs. Hook 实现](#3.1 类组件生命周期 vs. Hook 实现)
- [3.2 迁移策略](#3.2 迁移策略)
- [3.3 性能优化对比](#3.3 性能优化对比)
 
- [4. 总结](#4. 总结)
 

React 生命周期与 Hook 是每个 React 开发者必须掌握的核心概念。理解它们的工作原理和适用场景,能帮助开发者编写更高效、可维护的组件代码。本文将深入解析类组件的生命周期方法,对比函数组件中 Hook 的工作机制,并探讨如何合理选择这两种开发模式。
1. React 生命周期方法详解
1.1 生命周期的三个阶段(挂载、更新、卸载)
React 类组件的生命周期可以分为三个主要阶段:
            
            
              jsx
              
              
            
          
          class ExampleComponent extends React.Component {
  constructor(props) {
    super(props); // 挂载阶段开始
    this.state = { count: 0 };
  }
  componentDidMount() {
    console.log('组件已挂载');
  }
  shouldComponentUpdate(nextProps, nextState) {
    return nextState.count !== this.state.count; // 更新阶段控制
  }
  componentDidUpdate() {
    console.log('组件已更新');
  }
  componentWillUnmount() {
    console.log('组件即将卸载'); // 卸载阶段
  }
  render() {
    return <div>{this.state.count}</div>;
  }
}- 
挂载阶段:组件实例被创建并插入DOM - constructor()→- render()→- componentDidMount()
 
- 
更新阶段:组件因props或state变化而重新渲染 - shouldComponentUpdate()→- render()→- componentDidUpdate()
 
- 
卸载阶段:组件从DOM中移除 - componentWillUnmount()
 
1.2 关键生命周期方法的作用
- 
componentDidMount: - 最佳实践:在这里进行AJAX请求、DOM操作或订阅事件
 jsxcomponentDidMount() { fetch('/api/data') .then(res => res.json()) .then(data => this.setState({ data })); this.timerID = setInterval(() => this.tick(), 1000); }
- 
shouldComponentUpdate: - 性能优化关键:通过返回true/false控制是否重新渲染
 jsxshouldComponentUpdate(nextProps, nextState) { // 仅当count变化时才更新 return nextState.count !== this.state.count; }
- 
componentWillUnmount: - 清理工作:避免内存泄漏
 jsxcomponentWillUnmount() { clearInterval(this.timerID); this.subscription.unsubscribe(); }
1.3 不推荐使用的遗留生命周期方法
React 16.3+ 标记为不安全的生命周期方法:
- componentWillMount→ 使用- constructor或- componentDidMount替代
- componentWillReceiveProps→ 使用- static getDerivedStateFromProps
- componentWillUpdate→ 使用- getSnapshotBeforeUpdate
替代方案示例:
            
            
              jsx
              
              
            
          
          static getDerivedStateFromProps(props, state) {
  if (props.value !== state.prevValue) {
    return {
      prevValue: props.value,
      // 其他派生状态...
    };
  }
  return null;
}2. Hook 的引入与核心概念
2.1 为什么需要 Hook?
类组件存在三大痛点:
- 状态逻辑难以复用:HOC和render props导致"嵌套地狱"
- 复杂组件难以理解:相关逻辑分散在不同生命周期
- 类语法困惑 :this绑定问题和class的复杂性
函数组件的局限性:
- 无法使用state
- 不能执行副作用
- 缺乏生命周期控制
2.2 常用 Hook 及其作用
useState - 状态管理
            
            
              jsx
              
              
            
          
          function Counter() {
  const [count, setCount] = useState(0);
  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}useEffect - 副作用处理
            
            
              jsx
              
              
            
          
          useEffect(() => {
  // 相当于 componentDidMount + componentDidUpdate
  document.title = `You clicked ${count} times`;
  return () => {
    // 相当于 componentWillUnmount
    console.log('cleanup');
  };
}, [count]); // 仅在count变化时执行进阶Hook示例:
            
            
              jsx
              
              
            
          
          const theme = useContext(ThemeContext); // 上下文访问
const [state, dispatch] = useReducer(reducer, initialState); // 复杂状态管理
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]); // 性能优化2.3 Hook 的规则与最佳实践
- 
调用规则: - 只在React函数的最顶层调用Hook
- 不要在循环、条件或嵌套函数中调用
 
- 
自定义Hook: 
            
            
              jsx
              
              
            
          
          function useWindowWidth() {
  const [width, setWidth] = useState(window.innerWidth);
  useEffect(() => {
    const handleResize = () => setWidth(window.innerWidth);
    window.addEventListener('resize', handleResize);
    return () => window.removeEventListener('resize', handleResize);
  }, []);
  return width;
}
// 使用:const width = useWindowWidth();- 性能优化 :
- 使用useCallback缓存函数
- 使用useMemo缓存计算结果
 
- 使用
3. 生命周期与 Hook 的对比与迁移
3.1 类组件生命周期 vs. Hook 实现
| 生命周期方法 | Hook 等效实现 | 
|---|---|
| constructor | useState 初始化 | 
| componentDidMount | useEffect(() => {}, []) | 
| componentDidUpdate | useEffect(() => {}, [deps]) | 
| componentWillUnmount | useEffect 的清理函数 | 
| shouldComponentUpdate | React.memo + useMemo | 
3.2 迁移策略
逐步替换示例:
- 将class改为function
- 用useState替换this.state
- 用useEffect替换生命周期方法
- 用useContext替换contextType
逻辑复用对比:
            
            
              jsx
              
              
            
          
          // HOC方式
const EnhancedComponent = withHOC(BaseComponent);
// Hook方式
function useCustomLogic() {
  const [value, setValue] = useState(null);
  // ...逻辑
  return value;
}
function Component() {
  const value = useCustomLogic();
  // ...
}3.3 性能优化对比
类组件优化:
            
            
              jsx
              
              
            
          
          class OptimizedComponent extends React.PureComponent {
  // 自动浅比较props和state
}函数组件优化:
            
            
              jsx
              
              
            
          
          const MemoizedComponent = React.memo(
  function MyComponent(props) {
    /* 使用props渲染 */
  },
  (prevProps, nextProps) => {
    /* 自定义比较逻辑 */
  }
);
function Parent() {
  const memoizedCallback = useCallback(() => {
    doSomething(a, b);
  }, [a, b]);
  
  const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
}4. 总结
- 
核心对比: - 类组件:命令式的生命周期控制
- Hook:声明式的副作用管理
 
- 
适用场景: - 维护旧项目:继续使用类组件
- 新项目开发:优先使用函数组件+Hook
 
- 
学习建议: - 理解两者原理,而非死记API
- 从简单组件开始实践Hook
- 逐步重构复杂类组件
 
- 
未来趋势: - React官方推荐Hook作为主要开发方式
- 新特性(如并发模式)将优先支持Hook
- 社区生态逐渐转向Hook优先
 
通过深入理解生命周期和Hook的关系,开发者可以更灵活地选择适合场景的开发模式,编写更清晰、更易维护的React代码。
🔥🔥🔥道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
|-----------------------------|
| 💖The Start💖点点关注,收藏不迷路💖 |
|-----------------------------|
| 💖The Start💖点点关注,收藏不迷路💖 |