react的组件的概念和使用

news2024/9/19 12:54:24

在这里插入图片描述

文章目录

    • 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.coloradmin.cn/o/2146285.html

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

相关文章

[SAP ABAP] 修改内表数据

1.利用关键字修改数据 语法格式 MODIFY TABLE <itab> FTOM <wa> [TRANSPORTING f1 f2...].<itab>&#xff1a;代表内表 <wa>&#xff1a;代表工作区 示例1 内表修改前的数据 将上述数据行中的AGE字段值更改为25&#xff0c;SEX字段值更改为女 输出结…

基于windows下docker安装HDDM并运行

安装主要教程 如何安装HDDM(基于windows下 docker 和 linux) | 传鹏的实验室 (chuan-peng-lab.netlify.app) 安装时遇到的问题 1.下载完docker安装包&#xff0c;安装提示不适合本电脑 解决办法&#xff1a; 第一步&#xff1a;开启CPU虚拟化 Windows电脑如何开启CPU虚拟化…

JS全选反选案例

我们在进行网页制作的时候&#xff0c;通常会用到复选框&#xff0c;而复选框外面往往有一个大的勾选框来&#xff0c;控制里面的框是否全部选择&#xff0c;而里面的小复选框同时也是在控制着外面大的选择框&#xff0c;当里面全选的时候&#xff0c;外面的也会勾选上&#xf…

2018年国赛高教杯数学建模D题汽车总装线的配置问题解题全过程文档及程序

2018年国赛高教杯数学建模 D题 汽车总装线的配置问题 一&#xff0e;问题背景   某汽车公司生产多种型号的汽车&#xff0c;每种型号由品牌、配置、动力、驱动、颜色5种属性确定。品牌分为A1和A2两种&#xff0c;配置分为B1、B2、B3、B4、B5和B6六种&#xff0c;动力分为汽油…

自制数据库迁移工具-C版-04-HappySunshineV1.4-(支持Gbase8a、PG)

目录 一、环境信息 二、简述 三、架构图 四、升级点 五、支持功能 六、安装包下载地址 七、配置参数介绍 八、安装步骤 1、配置环境变量 2、生效环境变量 3、检验动态链接是否正常 4、修改配置文件MigrationConfig.txt &#xff08;1&#xff09;Gbase8a -> Gba…

机器学习模型中特征贡献度分析:预测贡献与错误贡献

在机器学习领域&#xff0c;特征重要性分析是一种广泛应用的模型解释工具。但是特征重要性并不等同于特征质量。本文将探讨特征重要性与特征有效性之间的关系&#xff0c;并引入两个关键概念&#xff1a;预测贡献度和错误贡献度。 核心概念 预测贡献度&#xff1a;衡量特征在…

【w0网页制作】Html+Css网页制作影视主题之庆余年Ⅱ含轮播表单(5页面附源码)

庆余年2HTMLCSS网页开发目录 &#x1f354;涉及知识&#x1f964;写在前面&#x1f367;一、网页主题&#x1f333;二、网页效果效果1、轮播效果图Page1、首页Page2、角色介绍Page3、剧情介绍Page4、剧集评价Page5、留言模块 &#x1f40b;三、网页架构与技术3.1 脑海构思3.2 整…

集装箱机房可视化:高效管理与监控

通过图扑可视化平台实时监控集装箱机房的运行状态和环境参数&#xff0c;优化资源配置&#xff0c;提升运维效率&#xff0c;确保数据中心安全可靠运行。

Java面试篇基础部分-Java中5种常用的线程池

Java中定义了一个Executor的接口并且在接口中定义了execute()方法用来执行一个线程任务。然后通过ExecutorService实现了Executor接口用来执行具体的线程操作。 ExecutorService接口实现了多个类用来创建不同的线程池,其中最常见的线程池有如下几种 newCachedThreadPool 可以缓…

工业一体机在汽车零部件工厂ESOP系统中的关键作用

在当今竞争激烈的汽车市场中&#xff0c;汽车零部件工厂的高效生产和严格质量控制至关重要。而工业一体机在汽车零部件工厂的 ESOP&#xff08;电子标准化作业程序&#xff09;系统中发挥着关键作用。 一、汽车零部件工厂面临的挑战 汽车零部件的生产过程复杂且要求严格&#…

8--SpringBoot原理分析、注解-详解(面试高频提问点)

目录 SpringBootApplication 1.元注解 --->元注解 Target Retention Documented Inherited 2.SpringBootConfiguration Configuration Component Indexed 3.EnableAutoConfiguration&#xff08;自动配置核心注解&#xff09; 4.ComponentScan Conditional Co…

【Leetcode152】分割回文串(回溯 | 递归)

文章目录 一、题目二、思路三、代码 一、题目 二、思路 具体例子和步骤&#xff1a;假设 s "aab"&#xff0c;步骤如下&#xff1a; 初始状态&#xff1a; s "aab"path []res [] 第一层递归&#xff08;外层循环&#xff09;&#xff1a; path []检…

高精度乘法和除法

高精度乘法 高精度乘法的核心思想是将两个大数的乘法运算拆解为多个小规模运算&#xff0c;并最终将结果合并得到最后的乘积。 我们来做一道题 大整数乘法 代码如下&#xff1a; #include<iostream> #include<string> using namespace std;// 定义两个字符数…

黑龙江事业单位联考报名流程及照片处理方法

随着黑龙江省事业单位联考的报名帷幕即将拉开&#xff0c;众多考生已经摩拳擦掌&#xff0c;准备投身于这场职业发展的大潮中。在这个关键时刻&#xff0c;掌握报名流程和照片处理技巧&#xff0c;将是你成功迈出的第一步。本文将为你提供一份详尽的报名指南&#xff0c;让你在…

代理模式---静态代理和动态代理

代理模式 代理模式&#xff1a;给某一个对象提供一个代理&#xff0c;并由代理对象来控制对真实对象的访问。代理模式是一种结构型设计模式。 代理模式角色分为 3 种&#xff1a; Subject&#xff08;抽象主题角色&#xff09;&#xff1a;定义代理类和真实主题的公共对外方法…

【JavaScript】算法之排序搜索

排序 冒泡排序 选择排序 插入排序 从第一个元素开始&#xff0c;该元素可以被认为已经被排序取出下一个元素&#xff0c;在已经排序好的序列中&#xff0c;从后往前扫描直到找到小于或者等于该元素的位置将该位置后面的所有已经排序的元素从后往前移动将该元素插入到该位置重复…

鲲鹏云-docker安装mysql8.0-并设置参数(--lower-case-table-names=1)

前言&#xff1a; 由于鲲鹏云是arm架构&#xff0c;公司现有的镜像就用不了&#xff0c;为了搭建个测试环境&#xff0c;记录一下搭建过程 注意在mysql8.0里面lower-case-table-names必须在第一次安装时设置。 ①镜像的获取 鲲鹏镜像pull下来是不能跑的&#xff0c;会提示内…

自我评估与改进:TMS优化自检清单

自我评估与改进&#xff1a;TMS优化自检清单 在当今快速变化的物流行业中&#xff0c;运输管理系统&#xff08;TMS&#xff09;的优化成为企业提升运营效率、降低成本、增强竞争力的关键。为了帮助企业和物流管理者全面评估TMS的运行状况&#xff0c;识别并优化潜在问题&…

优思学院|中国六西格玛研究调查2025

四年前&#xff0c;优思学院与精益六西格玛专业协会&#xff08;LSSPA&#xff09;共同发起了一项具有里程碑意义的调查研究——《中国六西格玛调查研究 2020》。这是中国第一次全面了解六西格玛在本地企业中的发展现状、应用情况以及所面临的挑战和机遇的调研项目。这个调查不…

Matlab进阶绘图第68期—带分组折线段的分区柱状图

上一篇文章分享了分区柱状图的绘制方法&#xff1a; 带分组折线段的分区柱状图是在原始分区柱状图的基础上&#xff0c;再添加分组折线段&#xff0c;用以增加一个对象的表达。 由于Matlab中未收录的带分组折线段的分区柱状图的绘制方法&#xff0c;因此需要大家自行解决。 本…