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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/886174.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣题解 983

大家好&#xff0c;欢迎来到无限大的判断&#xff0c;祝大家国庆假期愉快 题目描述&#xff08;中等&#xff09; 最低票价 在一个火车旅行很受欢迎的国度&#xff0c;你提前一年计划了一些火车旅行。在接下来的一年里&#xff0c;你要旅行的日子将以一个名为 days 的数组给出…

Charles(青花瓷)抓取https请求

文章目录 前言Charles&#xff08;青花瓷&#xff09;抓取https请求 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&…

kafka下载配置

下载安装 参开kafka社区 zookeeperkafka消息队列群集部署https://apache.csdn.net/66c958fb10164416336632c3.html 下载 kafka_2.12-3.2.0安装包快速下载地址分享 官网下载链接地址&#xff1a; 官网下载地址&#xff1a;https://kafka.apache.org/downloads 官网呢下载慢…

2024/10/2 408 20题

c d d b b a b c b b a d c d a c

java基础 day1

学习视频链接 人机交互的小故事 微软和乔布斯借鉴了施乐实现了如今的图形化界面 图形化界面对于用户来说&#xff0c;操作更加容易上手&#xff0c;但是也存在一些问题。使用图形化界面需要加载许多图片&#xff0c;所以消耗内存&#xff1b;此外运行的速度没有命令行快 Wi…

【华为HCIP实战课程一】OSPF相关基础介绍及基础配置,网络工程师必修

一、OSPF介绍 开放式最短路径优先协议OSPF(Open Shortest Path First),IPv4使用的OSPFv2,针对IPv6使用OSPFv3协议。 二、为什么需要OSPF OSPF出现之前,网络广泛使用RIP路由协议,RIP由于最大16跳数限制无法适应大型网络,RIP是基于距离矢量算法的路由协议,应用在大型网…

过去8年,编程语言的流行度发生了哪些变化?PHP下降,Objective-C已过时

前天有一个汇总9个不同排名数据的“地表最强”编程语言排行榜&#xff0c;为了更好地理解语言流行度的变化&#xff0c;作者将2016年的类似调查结果与2024年的数据进行了比较。 虽然2016年的调查只包含6个排名&#xff0c;但它仍然提供了宝贵的参考数据。 我们来看看详细的情…

JSON的C实现(上)

JSON的C实现&#xff08;上&#xff09; JSON的C实现&#xff08;上&#xff09;前言JSON简介JSON的C实现思路小结 JSON的C实现&#xff08;上&#xff09; 前言 JSON是众多项目中较为常见的数据交换格式&#xff0c;为不同项目、系统间的信息交换提供了一个规范化标准。JSON…

Unity八股总结

这里写目录标题 OnEnable、Awake、Start运行时的发生顺序&#xff1f;哪些可能在同一个对象周期中反复的发生&#xff1f;动态加载资源的方式?Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期&#xff0c;请列出系统自带的几个重要的方法。物理更新一般放在哪个系统函数里…

查找与排序-插入排序

排序算法可以分为内部排序和外部排序&#xff0c;内部排序是数据记录在内存中进行排序&#xff0c;而外部排序是因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;在排序过程中需要访问外存。常见的内部排序算法有&#xff1a;插入排序、希尔排序、选择排序…

Arduino UNO R3自学笔记15 之 Arduino如何驱动数码管?

注意&#xff1a;学习和写作过程中&#xff0c;部分资料搜集于互联网&#xff0c;如有侵权请联系删除。 前言&#xff1a;学习使用数码管。 1.数码管介绍 数码管的一种是半导体发光器件&#xff0c;数码管可分为七段数码管和八段数码管&#xff0c;区别在于八段数码管比七段数…

L0-Linux-关卡材料提交

SSH全称Secure Shell&#xff0c;中文翻译为安全外壳&#xff0c;它是一种网络安全协议&#xff0c;通过加密和认证机制实现安全的访问和文件传输等业务。SSH 协议通过对网络数据进行加密和验证&#xff0c;在不安全的网络环境中提供了安全的网络服务。 SSH 是&#xff08;C/S…

QSqlDatabase在多线程中的使用

Qt中多线程使用数据库_qt数据库管理类支持多数据库,多线程-CSDN博客 1. 代码&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError>…

【深度学习】05-Rnn循环神经网络-01- 自然语言处理概述/词嵌入层/循环网络/文本生成案例精讲

循环神经网络&#xff08;RNN&#xff09;主要用于自然语言处理的。 循环神经网络&#xff08;RNN&#xff09;、卷积神经网络&#xff08;CNN&#xff09;和全连接神经网络&#xff08;FCN&#xff09;是三种常见的神经网络类型&#xff0c;各自擅长处理不同类型的数据。下面…

RabbitMQ应用

RabbitMQ 共提供了7种⼯作模式, 进⾏消息传递 一、七种模式的概述 1、Simple(简单模式) P:生产者,就是发送消息的程序 C:消费者,就是接收消息的程序 Queue:消息队列,类似⼀个邮箱, 可以缓存消息; ⽣产者向其中投递消息, 消费者从其中取出消息 特点: ⼀个⽣产者P,⼀…

负载均衡--相关面试题(六)

在负载均衡的面试中&#xff0c;可能会遇到一系列涉及概念、原理、实践应用以及技术细节的问题。以下是一些常见的负载均衡面试题及其详细解答&#xff1a; 一、什么是负载均衡&#xff1f; 回答&#xff1a;负载均衡是一种将网络请求或数据传输工作分配给多个服务器或网络资源…

SpringSession微服务

一.在linux中确保启动起来redis和nacos 依赖记得别放<dependencyManagement></dependencyManagement>这个标签去了 1.首先查看已经启动的服务 docker ps 查看有没有安装redis和nacos 2.启动redis和nacos 发现没有启动redis和nacos,我们先来启动它。&#xff0c;…

计算机视觉学习路线:从基础到进阶

计算机视觉学习路线&#xff1a;从基础到进阶 计算机视觉&#xff08;Computer Vision&#xff09;是人工智能和机器学习领域中重要的分支&#xff0c;致力于让计算机能够理解和分析图像、视频等视觉信息。随着深度学习的发展&#xff0c;计算机视觉的应用变得越来越广泛&…

音视频入门基础:FLV专题(7)——Tag header简介

一、引言 从《音视频入门基础&#xff1a;FLV专题&#xff08;3&#xff09;——FLV header简介》中可以知道&#xff0c; 在FLV header之后&#xff0c;FLV文件剩下的部分应由PreviousTagSize和Tag组成。FLV文件 FLV header PreviousTagSize0 Tag1 PreviousTagSize1 Ta…

【C++】“list”的介绍和常用接口的模拟实现

【C】“list”的介绍和常用接口的模拟实现 一. list的介绍1. list常见的重要接口2. list的迭代器失效 二. list常用接口的模拟实现&#xff08;含注释&#xff09;三. list与vector的对比 一. list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xf…