React生命周期以及Hook

React生命周期可概括为以下关键阶段(针对类组件,函数组件主要通过Hooks实现类似功能):
挂载(Mounting):
constructor:初始化state和绑定事件处理函数。
render:返回组件的UI表示。
componentDidMount:组件挂载到DOM后执行,适合引入任何需要DOM节点的初始化工作(如网络请求、订阅等)。
更新(Updating):
render:重新渲染组件。
componentDidUpdate:在更新发生后立即调用,可以执行DOM操作或更新数据。
shouldComponentUpdate:决定组件是否应该更新,返回布尔值。
getDerivedStateFromProps:在更新前调用,用于在props变化时更新state。
卸载(Unmounting):
componentWillUnmount:在组件卸载和销毁之前调用,用于执行必要的清理操作(如取消网络请求、移除订阅等)。
错误处理(Error Handling):
getDerivedStateFromError 或 componentDidCatch:捕获子组件树中的错误并执行反应。
注意:React 16引入的Fiber架构和React 18的Concurrent Mode对生命周期有一定影响,部分生命周期方法被标记为不推荐使用(如componentWillMount、componentWillReceiveProps、componentWillUpdate),建议使用getDerivedStateFromProps、componentDidMount、shouldComponentUpdate和新的getSnapshotBeforeUpdate等方法进行替代。

 

React Hook 是 React 16.8 版本引入的一项特性,它允许在函数组件中使用状态(state)、生命周期方法、副作用等 React 的特性,而无需编写类组件。Hook 的主要目的是让函数组件具备了更多类组件的功能,同时让代码更加清晰、简洁,并且更容易复用逻辑。
React Hook 的主要特点
状态管理:Hook 使得函数组件能够拥有状态。在 React 16.8 之前,函数组件是无状态的,只能接收 props 并返回 JSX。通过引入 useState Hook,函数组件可以拥有自己的状态。
副作用处理:useEffect Hook 用于在函数组件中执行副作用操作,如数据获取、订阅和手动更改 React 组件的 DOM 输出等。它类似于类组件中的 componentDidMount、componentDidUpdate 和 componentWillUnmount 生命周期方法的组合。
自定义 Hook:开发者可以创建自定义的 Hook,用于在组件之间复用状态逻辑或其他逻辑。自定义 Hook 是一个以 use 开头的函数,它内部可以调用其他 Hook。
React 常用 Hook
useState:用于在函数组件中添加状态管理。它接收一个初始状态作为参数,并返回一个状态值和一个用于更新这个状态的函数。
示例代码:
jsx
   import React, { useState } from 'react';

   function Counter() {
     const [count, setCount] = useState(0);

     const increment = () => {
       setCount(count + 1);
     };

     return (
       <div>
         <p>Count: {count}</p>
         <button onClick={increment}>Increment</button>
       </div>
     );
   }
   
useEffect:用于在函数组件中执行副作用操作。它接收一个函数作为参数,该函数在组件渲染到屏幕后执行。useEffect 还可以返回一个清理函数,用于在组件卸载时执行清理操作,如取消订阅、移除事件监听器等。
示例代码:
jsx
   import React, { useState, useEffect } from 'react';

   function Example() {
     const [count, setCount] = useState(0);

     useEffect(() => {
       document.title = `You clicked ${count} times`;

       return () => {
         // 清理工作
       };
     }, [count]); // 仅当 count 变化时执行副作用

     return (
       <div>
         <p>You clicked {count} times</p>
         <button onClick={() => setCount(count + 1)}>Click me</button>
       </div>
     );
   }
   
useContext:用于在函数组件中订阅 React 的上下文(context)。它通过接收一个上下文对象作为参数,并返回该上下文的当前值。这使得跨组件共享数据变得更加容易。
useRef:用于在函数组件中创建和访问 ref。它返回一个可变的 ref 对象,其 .current 属性被初始化为传入的参数(initialValue)。useRef 返回的 ref 对象在组件的整个生命周期内保持不变。
useReducer:是 useState 的另一种形式,它适用于管理更复杂的组件状态逻辑。useReducer 接收一个 reducer 函数和一个初始状态作为参数,并返回一个状态值和一个用于更新状态的 dispatch 方法。
React Hook 的优势
代码重用:通过自定义 Hook,可以在不同的组件之间复用状态逻辑和其他逻辑。
逻辑与 UI 分离:Hook 使得组件逻辑更加清晰,有助于将 UI 渲染逻辑与状态更新逻辑分离。
减少类组件的使用:随着 Hook 的引入,函数组件变得更加强大,减少了对类组件的需求,使得 React 组件的编写更加灵活和简洁。
总之,React Hook 是 React 框架中的一项重要特性,它极大地扩展了函数组件的功能和灵活性,使得 React 应用程序的开发变得更加高效和便捷。

当然可以。下面我将给出一个React Hooks的应用实例,该实例将演示如何在函数组件中使用useState和useEffect Hooks来创建一个简单的计数器组件,该组件会在组件挂载后每秒自动增加计数,并允许用户通过按钮手动增加计数。
计数器组件示例
jsx
import React, { useState, useEffect } from 'react';

function Counter() {
  // 使用useState Hook声明一个名为count的状态变量,并初始化为0
  const [count, setCount] = useState(0);

  // 使用useEffect Hook来处理副作用
  // 这个副作用将在组件挂载后每秒执行一次,用于更新count状态
  useEffect(() => {
    // 设置一个定时器,每秒调用一次
    const intervalId = setInterval(() => {
      // 更新状态
      setCount(prevCount => prevCount + 1);
    }, 1000);

    // 返回一个清理函数,用于在组件卸载时清除定时器
    return () => {
      clearInterval(intervalId);
    };
  }, []); // 空依赖数组意味着这个effect只在组件挂载时运行一次

  // 定义一个处理按钮点击的函数
  const handleIncrement = () => {
    // 更新状态
    setCount(prevCount => prevCount + 1);
  };

  // 返回组件的JSX表示
  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={handleIncrement}>Increment</button>
    </div>
  );
}

export default Counter;
解析
useState Hook:用于在函数组件中添加状态。在这个例子中,我们创建了一个名为count的状态变量,并通过setCount函数来更新它的值。
useEffect Hook:用于在函数组件中处理副作用。在这个例子中,我们使用了useEffect来设置一个定时器,每秒调用一次,每次调用时都会通过setCount函数来更新count的状态。我们还返回了一个清理函数,用于在组件卸载时清除定时器,避免内存泄漏。
组件渲染:每当count的状态更新时,组件都会重新渲染,显示最新的计数。
按钮交互:用户可以通过点击按钮来触发handleIncrement函数,该函数将调用setCount函数来手动增加计数。
这个示例展示了React Hooks的强大功能,使得函数组件能够处理状态和生命周期,同时保持代码的简洁性和可读性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值