【React】组件:全面解析现代前端开发的基石

news2024/9/23 15:33:50

文章目录

    • 一、什么是组件?
    • 二、组件的类型
    • 三、组件的生命周期
    • 四、状态管理
    • 五、属性传递
    • 六、组合与继承
    • 七、最佳实践

在现代前端开发中,React 已成为开发者构建用户界面的首选框架之一。React 的强大之处在于其组件化设计,允许开发者将 UI 拆分为独立、可复用的组件。本文将详细介绍 React 中的组件,包括组件的定义、类型、生命周期、状态管理、属性传递以及最佳实践,帮助开发者深入理解和高效使用 React 组件。

一、什么是组件?

组件是 React 的基本构建块。每个组件都可以看作是一个独立的模块,负责实现界面中的一部分。组件可以嵌套使用,从而构建出复杂的用户界面。组件的设计理念是将 UI 和业务逻辑分离,使代码更加模块化和易于维护。一个组件就是首字母大写的函数。

二、组件的类型

React 中的组件主要分为两种类型:函数组件和类组件。

  1. 函数组件

    函数组件是定义组件的最简单方式。它们本质上是接收 props 并返回 JSX 的普通 JavaScript 函数。自 React 16.8 引入 Hooks 以来,函数组件变得更加强大,可以处理状态和副作用。

    function Greeting(props) {
        return <h1>你好, {props.name}</h1>;
    }
    
  2. 类组件

    类组件是通过 ES6 类语法定义的组件,具有更多的特性,如状态管理和生命周期方法。在 Hooks 引入之前,类组件是实现复杂组件逻辑的主要方式。

    class Greeting extends React.Component {
        render() {
            return <h1>你好, {this.props.name}</h1>;
        }
    }
    

三、组件的生命周期

类组件具有生命周期方法,可以在组件的不同阶段执行特定的操作。React 的组件生命周期分为三个主要阶段:挂载、更新和卸载。

  1. 挂载阶段
    • constructor(): 构造函数,在组件实例化时调用。
    • static getDerivedStateFromProps(): 每次在组件实例被重新渲染之前调用。
    • componentDidMount(): 在组件挂载到 DOM 后调用,可以在这里进行 DOM 操作或数据请求。
  2. 更新阶段
    • shouldComponentUpdate(): 在重新渲染前调用,可以根据条件决定是否重新渲染组件。
    • getSnapshotBeforeUpdate(): 在最新的渲染输出提交到 DOM 之前调用,可以捕获一些信息。
    • componentDidUpdate(): 在组件更新后调用,可以在这里进行 DOM 操作或数据请求。
  3. 卸载阶段
    • componentWillUnmount(): 在组件从 DOM 中移除之前调用,可以在这里执行清理操作,如取消定时器或网络请求。

四、状态管理

组件的状态(state)是指组件中需要动态变化的数据。类组件使用 this.state 初始化状态,并使用 this.setState() 方法更新状态。函数组件使用 useState Hook 来管理状态。

  1. 类组件中的状态管理

    class Counter extends React.Component {
        constructor(props) {
            super(props);
            this.state = { count: 0 };
        }
    
        increment = () => {
            this.setState({ count: this.state.count + 1 });
        }
    
        render() {
            return (
                <div>
                    <p>计数: {this.state.count}</p>
                    <button onClick={this.increment}>增加</button>
                </div>
            );
        }
    }
    
  2. 函数组件中的状态管理

    function Counter() {
        const [count, setCount] = React.useState(0);
    
        return (
            <div>
                <p>计数: {count}</p>
                <button onClick={() => setCount(count + 1)}>增加</button>
            </div>
        );
    }
    

五、属性传递

组件通过 props 接收从父组件传递的数据。props 是只读的,不能在子组件中修改。通过 props,组件可以实现数据的传递和复用。

  1. 基本属性传递

    function Greeting(props) {
        return <h1>你好, {props.name}</h1>;
    }
    
    function App() {
        return <Greeting name="世界" />;
    }
    
  2. 传递回调函数

    可以通过 props 传递回调函数,以实现父子组件之间的通信。

    class Parent extends React.Component {
        handleChildClick = () => {
            console.log('子组件按钮被点击了');
        }
    
        render() {
            return <Child onClick={this.handleChildClick} />;
        }
    }
    
    function Child(props) {
        return <button onClick={props.onClick}>点击我</button>;
    }
    

六、组合与继承

React 提倡使用组合而非继承来复用组件逻辑。组合可以通过将子组件作为 props 传递给父组件,或使用 React 提供的 children 属性。

  1. 包含关系

    包含关系是指一个组件包含另一个组件,通过 children 属性传递子组件。

    function Container(props) {
        return <div className="container">{props.children}</div>;
    }
    
    function App() {
        return (
            <Container>
                <h1>标题</h1>
                <p>这是内容。</p>
            </Container>
        );
    }
    
  2. 特殊化关系

    特殊化关系是指一个组件通过 props 定制另一个组件,以实现特定的功能。

    function Dialog(props) {
        return (
            <div className="dialog">
                <h1>{props.title}</h1>
                <p>{props.message}</p>
            </div>
        );
    }
    
    function WelcomeDialog() {
        return <Dialog title="欢迎" message="欢迎使用我们的应用!" />;
    }
    

七、最佳实践

  1. 保持组件的单一职责

    每个组件应只负责一个功能。通过将功能拆分为多个小组件,可以提高代码的可读性和可维护性。

  2. 使用函数组件和 Hooks

    优先使用函数组件和 Hooks 来管理状态和副作用,除非需要使用生命周期方法或有复杂的逻辑需要封装。

  3. 使用 PropTypes 检查

    使用 PropTypes 来进行类型检查,可以在开发过程中捕获类型错误,提高代码的可靠性。

    import PropTypes from 'prop-types';
    
    function Greeting(props) {
        return <h1>你好, {props.name}</h1>;
    }
    
    Greeting.propTypes = {
        name: PropTypes.string.isRequired
    };
    
  4. 保持组件的纯净

    尽量编写纯函数组件,避免在渲染过程中引入副作用。所有的副作用操作(如数据请求、订阅等)应放在 useEffect 或生命周期方法中。


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电量采集模块—应用于工厂车间配电室电网监测系统的搭建

前言 随着社会经济发展&#xff0c;工厂配电电网系统的供电实时监测越来越重要&#xff0c;这不仅是影响工厂安全性&#xff0c;更是工厂自动化的必然环节。工厂电力监测具有长时间在线工作的可靠性、较强的现场操作和与中心站的通讯功能&#xff0c;同时具有长时间记录存储数据…

04 标识符与关键字

1 标识符 标识符用于命名程序中标识像变量和函数这样的元素。 number1 eval(input("number: ")) number2 eval(input("number: ")) number3 eval(input("number: ")) average (number1 number2 number3) / 3 print("average: "…

【MySQL进阶之路 | 高级篇】行锁之临键锁和插入意向锁

1. 临键锁&#xff08;Next-Key Locks&#xff09; 有时候我们既想锁住某条记录&#xff0c;又想阻止其他事务在该记录前边的间隙插入新记录&#xff0c;所以InnoDB就提出了一种称之为Next-Key Locks的锁&#xff0c;官方的类型名称为:LOCK_ORDINARY&#xff0c;我们也可以简称…

Ubuntu20.04 设置静态ip

Ubuntu 从 17.10 开始&#xff0c;已放弃在 /etc/network/interfaces 里固定 IP 的配置&#xff0c;interfaces 文件不复存在&#xff0c;即使配置也不会生效&#xff0c;而是改成 netplan 方式 &#xff0c;配置写在 /etc/netplan/01-netcfg.yaml &#xff0c;50-cloud-init.y…

手把手教你使用 Python 制作超级玛丽游戏

编写一个完整的《超级玛丽兄弟》&#xff08;Super Mario Bros.&#xff09;风格的游戏需要涉及到多个方面&#xff0c;包括游戏循环、玩家控制、敌人AI、碰撞检测、关卡设计、得分系统等等。由于这是一个复杂的项目&#xff0c;我将为你提供一个更加详细的框架&#xff0c;并解…

Xstate inspect状态图的使用 和 原理

状态图的好处之一是&#xff0c;在将状态图组合在一起的过程中&#xff0c;您可以探索流程中所有可能的状态。这种探索将帮助您避免代码中的错误和错误&#xff0c;因为您更有可能涵盖所有可能发生的情况。 因为状态图是可执行的&#xff0c;所以它们既可以表现为图&#xff0…

【YashanDB知识库】update/delete未选中行时,v$transaction视图没有事务,alter超时问题

问题现象 1、alter table修改表字段名&#xff0c;卡住&#xff0c;超时。 2、查看v$transaction事务视图&#xff0c;没有看到事务记录。 3、问题单&#xff1a;调整表结构时超时 问题风险及影响 无风险 问题影响版本 客户版本&#xff1a;22.2.8.3 问题发生原因 del…

2.1.卷积层

卷积 ​ 用MLP处理图片的问题&#xff1a;假设一张图片有12M像素&#xff0c;那么RGB图片就有36M元素&#xff0c;使用大小为100的单隐藏层&#xff0c;模型有3.6B元素&#xff0c;这个数量非常大。 识别模式的两个原则&#xff1a; 平移不变性&#xff08;translation inva…

MySQL学习(15):SQL优化:load、order by、group by

1.大批量插入数据指令load 当需要大批量插入数据时&#xff0c;insert的效率比较低&#xff0c;此时可以使用load命令 使用方法如下&#xff1a; &#xff08;1&#xff09;客户端连接服务端时&#xff0c;加上参数--local-infile mysql --local-infile -u root -p&#xf…

Java实现短信验证码服务

1.首先这里使用的是阿里云的短信服务。 package com.wzy.util;; import cn.hutool.captcha.generator.RandomGenerator; import com.aliyun.dysmsapi20170525.Client; import com.wzy.entity.Ali; import org.springframework.stereotype.Component;/*** Author: 顾安* Descri…

2024年铜川宜君半程马拉松,暴晒+爬坡152安全完赛

1、赛事背景 2024年7月21日&#xff0c;我参加了2024年铜川宜君半程马拉松赛&#xff0c;7月举办的赛事很少&#xff0c;全国都算温度比较高的&#xff0c;虽然宜君是一个山城&#xff0c;还是会担心气温会高。 临开赛1、2周&#xff0c;陕西区域降水比较多&#xff0c;赛前一…

C++从入门到起飞之——初始化列表类型转换static成员 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1、初始化列表 2、 类型转换 3. static成员 4、完结散花 1、初始化列表 • 之前我们实现构造函数…

在Linux中,部署及优化Tomcat

tomcat概述 自 2017 年 11月编程语言排行榜 Java 占比 13%,高居榜首&#xff0c;Tomcat 也一度成为 Java开发人员的首选。其开源、占用系统资源少、跨平台等特性深受广大程序员喜爱。本章主要学习如何部署 Tomcat 服务&#xff0c;根据生产环境实现多个虚拟主机的配置&#xf…

在el-table单元格中通过div绘制圆、直线和对角线

<el-table-column label"电源屏零层端子" align"center" prop"name2" width"220px"><template #default"scope"><div class"bigCircle"></div><div class"smallCircle">…

EtherNet/IP转Profinet协议网关(经典配置案例)

怎么样才能把EtherNet/IP和Profinet网络连接起来呢?这几天有几个朋友问到了这个问题&#xff0c;作者在这里统一为大家详细说明一下。其实有一个设备可以很轻松地解决这个问题&#xff0c;名为JM-PN-EIP&#xff0c;下面是详细介绍。 一&#xff0c;设备主要功能 1、捷米特J…

eqmx上读取数据处理以后添加到数据库中

目录 定义一些静态变量 定时器事件的处理器 订阅数据的执行器 处理json格式数据和将处理好的数据添加到数据库中 要求和最终效果 总结一下 定义一些静态变量 // 在这里都定义成全局的 一般都定义成静态的private static MqttClient mqttClient; // mqtt客户端 private s…

科研绘图系列:R语言组合堆积图(stacked barplot with multiple groups)

介绍 通常堆积图的X轴表示样本,样本可能会存在较多的分组信息,通过组合堆积图和样本标签分组信息,我们可以得到一张能展示更多信息的可发表图形。 加载R包 knitr::opts_chunk$set(warning = F, message = F) library(tidyverse) library(cowplot) library(patchwork)导入…

R包:plot1cell单细胞可视化包

介绍 plot1cell是用于单细胞数据seurat数据对象的可视化包。 安装 ## You might need to install the dependencies below if they are not available in your R library. bioc.packages <- c("biomaRt","GenomeInfoDb","EnsDb.Hsapiens.v86&qu…

基于飞腾FT2000的嵌入式计算机系统

作为中国嵌入式计算机的领导厂家&#xff0c;是最早进入轨道交通领域的 工业级AFC嵌入式计算机系列产品&#xff0c;充分体现了轨道交通新一代AFC主流新技术的各种特点&#xff0c;为轨道交通AFC系统的升级换代提供了良好的系统平台。 标准化 采用开放式架构的Intel新一代主流…

力扣高频SQL 50题(基础版)第八题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第八题1581. 进店却未进行过交易的顾客题目说明思路分析实现过程准备数据&#xff1a;实现方式&#xff1a;结果截图&#xff1a;总结&#xff1a; 力扣高频SQL 50题&#xff08;基础版&#xff09;第八题 1581. 进店…