对React中类组件和函数组件的理解?有什么区别?

React 中类组件和函数组件的理解与区别

React 中有两种主要的组件类型:类组件(Class Component)函数组件(Function Component)。两者有许多相似之处,但也有一些显著的区别。在 React 16.8 引入了 Hooks 后,函数组件的功能大大增强,使得函数组件成为更加流行的选择。

目录结构:

  1. React 类组件和函数组件概述
  2. 类组件(Class Component)详解
    • 2.1 生命周期方法
    • 2.2 state 和事件处理
  3. 函数组件(Function Component)详解
    • 3.1 React Hooks
    • 3.2 事件处理与状态管理
  4. 类组件与函数组件的区别
    • 4.1 语法结构
    • 4.2 生命周期方法
    • 4.3 状态管理
    • 4.4 性能和代码简洁性
  5. 实际项目代码示例
    • 5.1 类组件的使用示例
    • 5.2 函数组件的使用示例
  6. 总结

React 类组件和函数组件概述

类组件是 React 早期的组件类型,它依赖于 ES6 的 class 语法创建。类组件有完整的生命周期方法,允许开发者在其中进行复杂的逻辑处理和状态管理。

函数组件最初被认为是简单的无状态组件,仅用于呈现 UI,但随着 React Hooks 的引入,函数组件现在也能具备类组件的所有功能,如状态管理、生命周期管理等。


类组件(Class Component)详解

类组件继承自 React.Component,并且可以有自己的状态(state)和生命周期方法。

2.1 生命周期方法

类组件有多个生命周期方法,这些方法提供了在不同时间点执行特定代码的能力。常用的生命周期方法包括:

  • constructor: 初始化组件的状态。
  • componentDidMount: 组件挂载到 DOM 后调用,适合进行网络请求等操作。
  • shouldComponentUpdate: 判断组件是否需要重新渲染。
  • componentDidUpdate: 在组件更新后调用。
  • componentWillUnmount: 组件从 DOM 中卸载前调用。
2.2 state 和事件处理

类组件通过 this.state 来管理状态,并且通过 this.setState 来更新状态。在类组件中,事件处理通常需要显式地绑定 this

import React, { Component } from 'react';

class Counter extends Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }

  increment = () => {
    this.setState({ count: this.state.count + 1 });
  };

  render() {
    return (
      <div>
        <h3>当前计数:{this.state.count}</h3>
        <button onClick={this.increment}>增加</button>
      </div>
    );
  }
}

export default Counter;

解释:

  • constructor 用来初始化 state
  • increment 方法更新组件状态,并触发重新渲染。
  • render 方法中使用 this.state.count 渲染 UI。

函数组件(Function Component)详解

函数组件是通过函数的形式定义的组件,最初用于无状态组件。随着 React Hooks 的出现,函数组件的功能得到了极大的扩展。

3.1 React Hooks

Hooks 是 React 16.8 引入的特性,允许函数组件拥有状态和副作用等功能。常用的 Hooks 包括:

  • useState: 用于在函数组件中管理状态。
  • useEffect: 用于处理副作用,比如数据获取、订阅等。
  • useContext: 用于在函数组件中访问上下文。
3.2 事件处理与状态管理

函数组件中的事件处理方式更加简洁,因为不需要显式绑定 this。使用 useState 进行状态管理。

import React, { useState } from 'react';

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

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

  return (
    <div>
      <h3>当前计数:{count}</h3>
      <button onClick={increment}>增加</button>
    </div>
  );
};

export default Counter;

解释:

  • useState(0) 初始化状态 count0
  • setCount 用于更新状态。
  • 在事件处理函数 increment 中直接调用 setCount 更新状态。

类组件与函数组件的区别

4.1 语法结构
  • 类组件使用 class 语法,并且需要继承 React.Component,具有 render 方法来返回 JSX。
  • 函数组件使用普通函数语法,不需要继承任何类,直接返回 JSX。
4.2 生命周期方法

类组件拥有传统的生命周期方法,可以在不同阶段执行代码,而函数组件则需要借助 useEffect 等 Hooks 来模拟生命周期。

4.3 状态管理
  • 类组件通过 this.statethis.setState 管理状态。
  • 函数组件通过 useState Hook 管理状态,更加简洁。
4.4 性能和代码简洁性
  • 类组件通常更复杂,包含更多的生命周期方法和 this 绑定,代码量较多。
  • 函数组件在逻辑上更简洁,尤其是通过 Hooks 可以使代码更直观、易懂。

实际项目代码示例

5.1 类组件的使用示例

假设我们有一个表单,类组件用于处理表单的提交。

import React, { Component } from 'react';

class Form extends Component {
  constructor(props) {
    super(props);
    this.state = { name: '' };
  }

  handleChange = (event) => {
    this.setState({ name: event.target.value });
  };

  handleSubmit = (event) => {
    event.preventDefault();
    alert(`提交的名字是:${this.state.name}`);
  };

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          姓名:
          <input
            type="text"
            value={this.state.name}
            onChange={this.handleChange}
          />
        </label>
        <button type="submit">提交</button>
      </form>
    );
  }
}

export default Form;
5.2 函数组件的使用示例

在函数组件中,我们通过 useState 来管理表单状态,处理提交事件。

import React, { useState } from 'react';

const Form = () => {
  const [name, setName] = useState('');

  const handleChange = (event) => {
    setName(event.target.value);
  };

  const handleSubmit = (event) => {
    event.preventDefault();
    alert(`提交的名字是:${name}`);
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        姓名:
        <input
          type="text"
          value={name}
          onChange={handleChange}
        />
      </label>
      <button type="submit">提交</button>
    </form>
  );
};

export default Form;

总结

  • 类组件函数组件的主要区别在于语法、生命周期方法和状态管理的方式。类组件使用传统的类语法和生命周期方法,而函数组件则通过 Hooks 提供更加简洁的功能。
  • 函数组件因其简洁性和易于管理的特性,成为现代 React 开发的首选,尤其在使用 React Hooks 后,函数组件完全能够替代类组件。
  • 在新的项目中,推荐使用函数组件,因为它能够使代码更加简洁,且易于测试和维护。

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

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

相关文章

SSM商城设计与实现

摘 要 本文的主要工作是对基于B/S模式及JSP技术的基于智能推荐的b2c销售网站进行了研究与设计。本文首先介绍了基于智能推荐的b2c销售网站的背景&#xff0c;分析比较了国内外相关基于智能推荐的b2c销售网站的运行模式、系统特点与开发技术。然后分析了目前热点的各种Web应用开…

drawDB docker部属

docker pull xinsodev/drawdb docker run --name some-drawdb -p 3000:80 -d xinsodev/drawdb浏览器访问&#xff1a;http://192.168.31.135:3000/

CentOS7下Hadoop集群分布式安装详细图文教程

1、集群规划 主机 角色 DSS20 NameNode DataNode ResourceManager NodeManager DSS21 SecondaryNameNode NameNode NodeManager DSS22 DataNode NodeManager 1.1、环境准备 1.1.1 关闭防火墙 #查看防火墙状态 firewall-cmd --state #停止…

计算机网络——网络层-IPV4相关技术

一、网络地址转换NAT • 网络地址转换 NAT 方法于1994年提出。 • 需要在专用网连接到因特网的路由器上安装 NAT 软件。装有 NAT 软件的路由器叫做 NAT路由器&#xff0c;它至少有一个有效的外部全球地址 IPG。 • 所有使用本地地址的主机在和外界通信时都要在 NAT 路由器上将…

postgresql|数据库|利用sqlparse和psycopg2库批量按顺序执行SQL语句(psyconpg2新优化版本)

一、 旧版批量执行SQL脚本的python文件缺点&#xff0c;优点&#xff0c;以及更新内容 书接上回&#xff0c;postgresql|数据库开发|python的psycopg2库按指定顺序批量执行SQL文件(可离线化部署)_python sql psycopg2-CSDN博客 这个python脚本写了很久了&#xff0c;最近开始…

Node.js——http 模块(二)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

基于element UI el-dropdown打造表格操作列的“更多⌵”上下文关联菜单

<template><div :class"$options.name"><el-table :data"tableData"><el-table-column type"index" label"序号" width"60" /><!-- 主要列 BEGIN---------------------------------------- --&g…

javascrip基础语法

为什么学习 JavaScript? JavaScript 是 web 开发人员必须学习的 3 门语言中的一门&#xff1a; HTML 定义了网页的内容CSS 描述了网页的布局JavaScript 控制了网页的行为 1. JavaScript 输出 1.1 console.log()&#xff1a;用于将信息输出到浏览器控制台&#xff0c;例如con…

大语言模型预训练、微调、RLHF

转发&#xff0c;如有侵权&#xff0c;请联系删除&#xff1a; 1.【LLM】3&#xff1a;从零开始训练大语言模型&#xff08;预训练、微调、RLHF&#xff09; 2.老婆饼里没有老婆&#xff0c;RLHF里也没有真正的RL 3.【大模型微调】一文掌握7种大模型微调的方法 4.基于 Qwen2.…

django基于Python的校园个人闲置物品换购平台

Django 基于 Python 的校园个人闲置物品换购平台 一、平台概述 Django 基于 Python 的校园个人闲置物品换购平台是专为校园师生打造的一个便捷、环保且充满活力的线上交易场所。它借助 Django 这一强大的 Python Web 开发框架&#xff0c;整合了校园内丰富的闲置物品资源&…

abap安装cl_json类

文章来自 SAP根据源码导入/ui2/cl_json类 - pikeduo - 博客园 新建一个se38程序&#xff0c;把源码放到里&#xff0c;源码如下 *----------------------------------------------------------------------* * CLASS zcl_json DEFINITION *----------------------------…

[OPEN SQL] ORDER BY排序数据

本次操作使用的数据库表为SFLIGHT&#xff0c;其字段内容如下所示 航班(SFLIGHT) 该数据库表中的部分值如下所示 OPEN SQL中的ORDER BY语句用于对数据库表中的数据进行排序 在查询数据的时候使用ORDER BY语句&#xff0c;则查询出来的结果会按照ORDER BY指定的字段进行排序 排序…

STM32F103ZET6战舰版单片机开发板PCB文件 电路原理图

资料下载地址&#xff1a;STM32战舰版单片机开发板PCB文件 电路原理图 1、原理图 2、PCB 3、板子介绍 一、核心芯片与性能 核心芯片&#xff1a;STM32F103ZET6&#xff0c;这是一款基于ARM Cortex-M3内核的高性能单片机。处理器频率&#xff1a;高达72MHz&#xff0c;确保了…

An FPGA-based SoC System——RISC-V On PYNQ项目复现

本文参考&#xff1a; &#x1f449; 1️⃣ 原始工程 &#x1f449; 2️⃣ 原始工程复现教程 &#x1f449; 3️⃣ RISCV工具链安装教程 1.准备工作 &#x1f447;下面以LOCATION代表本地源存储库的安装目录&#xff0c;以home/xilinx代表在PYNQ-Z2开发板上的目录 ❗ 下载Vivad…

GAN的应用

5、GAN的应用 ​ GANs是一个强大的生成模型&#xff0c;它可以使用随机向量生成逼真的样本。我们既不需要知道明确的真实数据分布&#xff0c;也不需要任何数学假设。这些优点使得GANs被广泛应用于图像处理、计算机视觉、序列数据等领域。上图是基于GANs的实际应用场景对不同G…

centos9设置静态ip

CentOS 9 默认使用 NetworkManager 管理网络&#xff0c;而nmcli是 NetworkManager 命令行接口的缩写&#xff0c;是一个用来进行网络配置、管理网络连接的命令工具&#xff0c;可以简化网络设置&#xff0c;尤其是在无头&#xff08;没有图形界面&#xff09;环境下。 1、 cd…

Idea日志乱码

问题描述 前提&#xff1a;本人使用windows Idea运行sh文件&#xff0c;指定了utf-8编码&#xff0c;但是运行过程中还是存在中文乱码 Idea的相关配置都已经调整 字体调整为雅黑 文件编码均调整为UTF-8 调整Idea配置文件 但是还是存在乱码&#xff0c;既然Idea相关配置已经…

R4-LSTM学习笔记

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 LSTM-火灾温度预测 导入数据数据可视化设置X、y构建模型调用模型个人总结LSTM 的基本结构细胞状态&#xff08;Cell State&#xff09;LSTM 的优点 导入数据 i…

uniapp实现H5页面内容居中与两边留白,打造类似微信公众号阅读体验

在 UniApp 中&#xff0c;由于需要兼容多端应用&#xff0c;我们通常使用 rpx 作为尺寸单位。然而&#xff0c;在某些情况下&#xff0c;如需要实现内容居中且两边留白时&#xff0c;直接使用 rpx 可能会带来一些限制。这时&#xff0c;我们可以考虑使用 px 或 rem 等单位&…

网工_网络体系结构

2024.01.09&#xff1a;网络工程学习笔记&#xff08;网工老姜&#xff09; 第1节 网络体系结构 1.1 计算机一切皆011.2 网络协议1.3 协议的分层模型1.4 主机1向主机2发送数据过程1.5 本章小结 1.1 计算机一切皆01 在计算机内部&#xff0c;所有的数据最终都是以01的方式存在的…