当前位置: 首页 > news >正文

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++——求3*3矩阵对角元素之和。
  • go语言 swagger 查询 json 字段注释
  • 教你用 python 在国内实现 openAi 的调用
  • 以小人之心度君子之腹
  • Go语言现代web开发14 协程和管道
  • QT中各数据基础类型互转方式有哪些?
  • Docker:简化应用部署与管理的神奇容器
  • 【Kubernetes】常见面试题汇总(二十三)
  • AI音乐创作带给音乐原创人的挑战和机遇
  • 深入浅出Docker
  • unity 高性能对象池解决方案
  • Uniapp 跨域
  • 冒泡排序,选择排序,插入排序,归并排序,快速排序五种排序方法
  • JavaScript Window localStorage使用
  • 基于springboot的智慧社区微信小程序
  • ----------
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • CODING 缺陷管理功能正式开始公测
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • js学习笔记
  • Linux下的乱码问题
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • vue 个人积累(使用工具,组件)
  • Vue2 SSR 的优化之旅
  • 阿里云前端周刊 - 第 26 期
  • 高度不固定时垂直居中
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 使用权重正则化较少模型过拟合
  • 数据仓库的几种建模方法
  • 学习Vue.js的五个小例子
  • 如何用纯 CSS 创作一个货车 loader
  • ​520就是要宠粉,你的心头书我买单
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • # 数论-逆元
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #if和#ifdef区别
  • #微信小程序:微信小程序常见的配置传值
  • $.proxy和$.extend
  • (补)B+树一些思想
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (一)认识微服务
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • (原創) 未来三学期想要修的课 (日記)
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .net core docker部署教程和细节问题
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET的数据绑定
  • .NET企业级应用架构设计系列之技术选型
  • @RequestBody与@RequestParam
  • [240527] 谷歌 CEO 承认 AI 编造虚假信息问题难解(此文使用 @gemini 命令二次创作)| ICQ 停止运作
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • [Angularjs]ng-select和ng-options