react的组件的概念和使用

在这里插入图片描述

文章目录

    • 1. **组件的定义**
        • **函数组件**
        • **类组件**
    • 2. **组件的生命周期**
    • 3. **状态管理**
        • **类组件中的状态管理**
        • **函数组件中的状态管理**
    • 4. **组件之间的通信**
        • **通过 Props 传递数据**
        • **上下文(Context)**
    • 5. **组件的样式**
    • 6. **处理表单**
    • 7. **错误边界**


React 组件的核心概念,包括组件的定义、生命周期、状态管理、以及如何进行组件之间的通信。以下是对 React 组件的详细解释:

1. 组件的定义

函数组件

函数组件是最简单的组件类型,它是一个 JavaScript 函数,接受 props 作为参数,并返回一个 React 元素(通常是 JSX)。

示例:

function Welcome(props) {return <h1>Hello, {props.name}!</h1>;
}

使用:

<Welcome name="Alice" />

案例:

function Button() {return <button>Click me2</button>;
}function App() {const handleClick = (event) => {console.log(event.target);};return (<div className="App"><button onClick={handleClick}>Click me1</button><Button /></div>) 
}

类组件

类组件是一个 ES6 类,继承自 React.Component。它需要实现一个 render 方法,返回一个 React 元素。类组件通常用于需要状态管理和生命周期方法的场景。

示例:

class Welcome extends React.Component {render() {return <h1>Hello, {this.props.name}!</h1>;}
}

使用:

<Welcome name="Alice" />

2. 组件的生命周期

类组件有生命周期方法,这些方法在组件的不同阶段自动调用。常见的生命周期方法包括:

  • componentDidMount:组件挂载到 DOM 后调用。通常用于数据加载。
  • componentDidUpdate:组件更新后调用。可以用于对组件更新后的处理。
  • componentWillUnmount:组件卸载前调用。用于清理操作,如移除事件监听器。

示例:

class MyComponent extends React.Component {componentDidMount() {console.log('Component did mount!');}componentDidUpdate(prevProps, prevState) {console.log('Component did update!');}componentWillUnmount() {console.log('Component will unmount!');}render() {return <div>My Component</div>;}
}

3. 状态管理

组件可以有自己的状态(state),这是用于存储组件内部数据的对象。状态通常在类组件中通过 this.statethis.setState 来管理,而在函数组件中则通过 useState 钩子来管理。

类组件中的状态管理

示例:

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>Count: {this.state.count}</p><button onClick={this.increment}>Increment</button></div>);}
}
函数组件中的状态管理

示例:

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>);
}

4. 组件之间的通信

React 组件之间可以通过 props 和上下文(Context)来进行通信。

通过 Props 传递数据

父组件可以通过 props 将数据传递给子组件。

父组件示例:

function ParentComponent() {return <ChildComponent message="Hello from Parent" />;
}

子组件示例:

function ChildComponent(props) {return <p>{props.message}</p>;
}
上下文(Context)

上下文允许组件通过树状结构传递数据,而不必逐层传递 props。你可以使用 React.createContext 创建上下文,使用 Provider 组件提供数据,使用 Consumer 组件接收数据,或者使用 useContext 钩子在函数组件中使用上下文数据。

上下文创建与使用示例:

// 创建上下文
const MyContext = React.createContext();// 提供上下文
function MyProvider({ children }) {const [value, setValue] = useState('Default Value');return (<MyContext.Provider value={value}>{children}</MyContext.Provider>);
}// 消费上下文
function MyConsumer() {const contextValue = useContext(MyContext);return <p>Context Value: {contextValue}</p>;
}// 使用
function App() {return (<MyProvider><MyConsumer /></MyProvider>);
}

5. 组件的样式

你可以通过几种方式给组件添加样式:

  • 内联样式:使用 JavaScript 对象作为 style 属性。

示例:

function StyledComponent() {const style = { color: 'blue', fontSize: '20px' };return <div style={style}>This is a styled component</div>;
}
  • CSS 类名:使用 className 属性来应用 CSS 类。

示例:

// CSS 文件 (styles.css)
.my-style {color: red;font-size: 18px;
}// 组件
function StyledComponent() {return <div className="my-style">This is a styled component</div>;
}
  • CSS 模块:使用 CSS 模块来避免样式冲突。

示例:

// CSS 模块 (styles.module.css)
.myStyle {color: green;font-size: 16px;
}// 组件
import styles from './styles.module.css';function StyledComponent() {return <div className={styles.myStyle}>This is a styled component</div>;
}

6. 处理表单

表单可以使用受控组件来管理输入。受控组件将表单元素的值与组件的状态同步。

示例:

class ControlledForm extends React.Component {constructor(props) {super(props);this.state = { inputValue: '' };}handleChange = (event) => {this.setState({ inputValue: event.target.value });};handleSubmit = (event) => {alert('Submitted value: ' + this.state.inputValue);event.preventDefault();};render() {return (<form onSubmit={this.handleSubmit}><label>Input:<input type="text" value={this.state.inputValue} onChange={this.handleChange} /></label><button type="submit">Submit</button></form>);}
}

7. 错误边界

错误边界是 React 16 引入的一个特性,用于捕获子组件树中的 JavaScript 错误,并展示备用 UI。

示例:

class ErrorBoundary extends React.Component {constructor(props) {super(props);this.state = { hasError: false };}static getDerivedStateFromError() {return { hasError: true };}componentDidCatch(error, info) {console.error('Error caught by Error Boundary:', error, info);}render() {if (this.state.hasError) {return <h1>Something went wrong.</h1>;}return this.props.children;}
}// 使用 Error Boundary
function App() {return (<ErrorBoundary><SomeComponent /></ErrorBoundary>);
}

您好,我是肥晨。
欢迎关注我获取前端学习资源,日常分享技术变革,生存法则;行业内幕,洞察先机。

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

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

相关文章

51单片机-AD(模拟信号转数字信号)-实验()

介绍AD AD转换&#xff08;Analog to Digital Conversion&#xff0c;模数转换&#xff09;是将连续的模拟信号转换为离散的数字信号的过程。这个过程在各种电子设备中都非常重要&#xff0c;特别是在涉及传感器、音频信号、视频信号等需要进行数字化处理的领域。 个人理解&a…

正也科技-辖区与指标管理系统 强化决策支持

正也科技的“辖区与指标管理系统”设计理念先进&#xff0c;旨在通过科学合理的组织架构和精细化的指标管理&#xff0c;帮助企业实现更高效的市场布局、人员配置及业绩监控。以下是对该系统核心功能的进一步阐述及其对企业运营带来的优势&#xff1a; 正也科技辖区管理 1. 组…

最新PyCharm安装详细教程及pycharm配置

目录 一、PyCharm简介及其下载网站 二、单击网站的Downloads&#xff0c;进入二级页面&#xff0c;选择对应的操作系统下载PyCharm 三、PyCharm的安装程序的安装及其配置(configuration) 1、运行PyCharm Setup 2、安装位置设置 3、安装选项设置 4、开始菜单中PyCharm快捷方式的…

【Git使用】删除Github仓库中的指定文件/文件夹

前言&#xff1a; 上篇文章带大家上传了第一个项目至github,那要是想删除仓库中的指定文件夹怎么办&#xff1f;在Github中 仓库是无法通过鼠标操作直接删除文件和文件夹的&#xff0c;那只能通过 git 命令来执行删除操作。接下来就带大家进行操作。 详细步骤&#xff1a; 一…

AI大语言模型的全面解读

大语言模型&#xff08;Large Language Models, LLMs&#xff09;无疑是近年来最耀眼的星辰之一。他们以惊人的语言生成能力、上下文理解能力以及对复杂任务的泛化能力&#xff0c;正在深刻改变着自然语言处理&#xff08;NLP&#xff09;乃至整个AI领域的格局。 本文将从专业角…

C++速通LeetCode中等第10题-轮转数组(四种方法)

方法一&#xff1a;巧用deque双向队列容器 class Solution { public:void rotate(vector<int>& nums, int k) {deque<int> q;int tmp;if(nums.size() > 1){for(auto num:nums) q.push_back(num);for(int i 0;i < k;i){tmp q.back();q.pop_back();q.pu…

基于YOLOv8+LSTM的商超扶梯场景下行人安全行为姿态检测识别

基于YOLOv8LSTM的商超扶梯场景下行人安全行为姿态检测识别 手扶电梯 行为识别 可检测有人正常行走&#xff0c;有人 跌倒&#xff0c;有人逆行三种行为 跌倒检测 电梯跌倒 扶梯跌倒 人体行为检测 YOLOv8LSTM。 基于YOLOv8LSTM的商超扶梯场景下行人安全行为姿态检测识别&#xf…

Qt 状态机编程,双层状态机,实现暂停恢复

流程设计状态图 #ifndef WORKMACHINE_H #define WORKMACHINE_H#include <QObject> #include <QStateMachine> #include <QHistoryState> #include <QFinalState>#include "WorkThread.h"class WorkMachine : public QObject {Q_OBJECT publ…

记录可编辑表格(未完整)

每一行都独立 <el-table-column label"操作" width"220" fixed"right"><template #default"{ row, $index }"><el-buttonv-if"!row.tableEditFlag"type"primary"size"small"click"…

螺栓与散装物体检测系统源码分享

螺栓与散装物体检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

[云服务器12] 搭建eaglercraft网页MC

众所周知&#xff0c;MC是一个炒鸡好玩的游戏&#xff01; 但是&#xff0c;Mojang开发出来是经过Java JAR打包过的的.jar文件&#xff0c;这就不得不依赖HMCL PCL BakaXL等启动器来启动了…… 所以今天&#xff0c;我们将使用开源的eaglercraft来搭建一个在线版MC&#xff0…

誉龙视音频 Third/TimeSyn 远程命令执行复现

0x01 漏洞描述&#xff1a; 誉龙公司定位为系统级的移动视音频记录解决方案提供商&#xff0c;凭借其深厚的行业经验&#xff0c;坚持自主研发&#xff0c;匠心打造记录仪领域行业生态&#xff0c;提供开放式的记录仪APK、GB28181 SDK、国网B协议、管理平台软件OEM。誉龙视音频…

C/S架构与B/S架构的适用场景分析

C/S架构&#xff08;客户端/服务器架构&#xff09;与B/S架构&#xff08;浏览器/服务器架构&#xff09;在适用场景上各有特点&#xff0c;主要取决于应用的具体需求、用户群体、系统维护成本、跨平台需求等因素。 一、C/S架构的适用场景 1、高性能与交互性要求高的应用&…

9月26日云技术研讨会 | SOA整车EE架构开发流程及工具实施方案

面向服务的架构&#xff08;Service Oriented Architecture, SOA&#xff09;实施需要复杂的基础技术作为支撑&#xff0c;伴随着整车硬件资源的集中化、车载以太网等高速通信技术在车内的部署&#xff0c;将在未来一段时间内成为行业技术研究和市场布局的热点。 近年来&#x…

使用Webpack创建vue脚手架并搭建路由---详解

1.使用 vue 库 vue 是一个非常好用的 javascript 库&#xff0c;现在已经发行了 vue 3&#xff0c;我们可以直接导入使用库文件&#xff0c;也可以使用单文件&#xff08;SFC&#xff09;的形式&#xff0c;直接使用库文件会简单一点&#xff0c;我们先来试一下吧。 1.1安装 v…

JdbcTemplate常用方法一览AG网页参数绑定与数据寻址实操

JdbcTemplate是Spring框架中的一个重要组件&#xff0c;主要用于简化JDBC数据库操作。它提供了许多常用的方法&#xff0c;如查询、插入、更新、删除等。本文将介绍JdbcTemplate的常用方法及其使用方式&#xff0c;以及参数绑定和删除数据的方法。 一、JdbcTemplate常用方法 查…

24/9/19 算法笔记 kaggle BankChurn数据分类

题目是要预测银行里什么样的客户会流失&#xff0c;流失的概率是多少 我这边先展示一下我写的二分类的算法 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.linear_model impo…

金砖软件测试赛项之Jmeter如何录制脚本!

一、简介 Apache JMeter 是一款开源的性能测试工具&#xff0c;用于测试各种服务的负载能力&#xff0c;包括Web应用、数据库、FTP服务器等。它可以模拟多种用户行为&#xff0c;生成负载以评估系统的性能和稳定性。 JMeter 的主要特点&#xff1a; 图形用户界面&#xff1a;…

Stable Diffusion绘画 | ControlNet应用-IP-Adapter:一致性角色就这么简单

IP-Adapter 更新了全新的模型—FaceID plus V2 版本&#xff0c;同时还支持 SDXL 模型。 FaceID plus V2 版本的优点&#xff1a; 解决任务一致性 一张图生成相似角色 下载地址&#xff1a;https://huggingface.co/h94/IP-Adapter-FaceID/tree/main 其中&#xff0c;两个 Lora文…

AIGC时代!AI的“iPhone时刻”与投资机遇

AIGC时代&#xff01;AI的“iPhone时刻”与投资机遇 前言AI的“iPhone时刻”与投资机遇 前言 AIGC&#xff0c;也就是人工智能生成内容&#xff0c;它就像是一股汹涌的浪潮&#xff0c;席卷了整个科技世界。它的出现&#xff0c;让我们看到了人工智能的无限潜力&#xff0c;也…