React生命周期以及Hook

news/2024/10/3 13:18:12 标签: 前端, javascript

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的强大功能,使得函数组件能够处理状态和生命周期,同时保持代码的简洁性和可读性。


http://www.niftyadmin.cn/n/5688444.html

相关文章

【AI驱动TDSQL-C Serverless 数据库技术实战营】基于Langchain的电商可视化分析

人工智能技术的飞速发展已深刻影响电商行业&#xff0c;显著提升了个性化推荐、用户行为分析、库存管理和市场预测等领域的效率。构建一个高效的AI驱动电商数据分析平台已成为行业的核心需求。本文里&#xff0c;我们将使用腾讯云的高性能应用平台 HAI&#xff08;专为AI和科学…

深化专业,广纳技能,构建软实力

一、引言 ----  随着人工智能&#xff08;AI&#xff09;和生成式人工智能&#xff08;AIGC&#xff09;如ChatGPT、Midjourney、Claude等大语言模型的持续涌现&#xff0c;AI辅助编程工具日益普及&#xff0c;程序员的工作方式正在经历深刻的变革。这种变革既带来了对部分编…

解决OpenCV保存视频 视频全部为绿色的bug

目录 项目场景&#xff1a; 问题描述 原因分析&#xff1a; 解决方案&#xff1a; 项目场景&#xff1a; 使用OpenCV-Python 保存视频&#xff0c;视频为numpy array格式&#xff0c;保存的视频全部为无意义的绿色。 问题描述 用opencv 保存的视频会出现全部为绿色的情况&…

企业级Kubernetes部署

华子目录 k8s中容器的管理方式k8s集群部署安装k8s部署工具部署软件仓库&#xff0c;添加k8s源设置kubectl命令补全功能 k8s集群中安装cri-dockerk8s集群中启动cri-docker服务在k8s-master上拉取k8s所需镜像并上传到harbor上修改cri-docker.service文件k8s集群中启动kubeletk8s集…

你真的会用鼠标吗?它其实还可以这么用。

前言 小白最近比较忙&#xff0c;没大片的时间可以用来做实际测试&#xff0c;所以只能讲一些小知识。 如果有小伙伴们的电脑有问题&#xff0c;可以私下找小白咨询。 今天咱们要讲&#xff1a;鼠标怎么用。 接触过电脑的人&#xff0c;对鼠标这个东西一般都不陌生&#xf…

WPF用户控件的使用

WPF用户控件的使用 先看一下程序结构&#xff1a; WPF_Test是我的主程序&#xff1b;WPF_LIB是我添加的一个用户控件库&#xff0c;其中UserControl1是一个用户控件&#xff1b; 用户控件xaml代码&#xff1a; <UserControl x:Class"WPF_LIB.UserControl1"xmln…

【网络安全 | 靶场搭建】Maven构建项目+报错解决方法(无法解析插件)

未经许可,不得转载。 文章目录 构建项目报错构建项目 在运行新项目时,可能会遇到类似于 C:\Users\86177\Desktop\java-sec-code-master\src\main\java\org\joychou\Application.java:3:32 java: 程序包org.springframework.boot不存在 的问题。在这种情况下,可以通过以下步…

Linux Debian12使用Podman安装bwapp靶场环境

一、bwapp简介 bWAPP&#xff08;buggy Web Application&#xff09;是一个开源的、故意设计有漏洞的Web应用程序&#xff0c;旨在帮助安全爱好者、开发人员和学生发现和防止Web漏洞。它包含了超过100种不同的漏洞&#xff0c;涵盖了所有主要的已知Web漏洞。 二、bwapp下载 …