React.js 基础与进阶教程
React.js 基础与进阶教程
React.js 是由 Facebook 开发的流行前端 JavaScript 库,专为构建用户界面(UI)设计,尤其适用于单页面应用(SPA)。它采用组件化开发模式,使 UI 结构更加清晰、可维护性更强。本文将带你快速入门 React,并深入了解其核心概念、关键特性及最佳实践。
1. React 基础概念
1.1 React 组件
React 采用组件化开发,一个组件代表 UI 的一个独立部分。组件主要分为函数组件和类组件。
函数组件示例:
function Welcome(props) {return <h1>Hello, {props.name}!</h1>;
}
类组件示例:
class Welcome extends React.Component {render() {return <h1>Hello, {this.props.name}!</h1>;}
}
1.2 JSX 语法
JSX 是 React 提供的一种 JavaScript 语法扩展,允许在 JavaScript 代码中直接编写 HTML 结构。
const element = <h1>Hello, World!</h1>;
JSX 语法需要 Babel 进行编译,最终转换成 React.createElement 形式。
1.3 State 与 Props
- Props(属性):用于组件间传递数据。
- State(状态):组件内部的可变数据,影响组件的渲染。
示例:
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>);}
}
2. React 进阶
2.1 组件生命周期
React 组件有三个主要生命周期阶段:
- 挂载(Mounting):组件创建并插入 DOM。
- 更新(Updating):组件状态或属性更新时触发。
- 卸载(Unmounting):组件从 DOM 中移除。
常见生命周期方法:
class Example extends React.Component {componentDidMount() {console.log('组件已挂载');}componentDidUpdate() {console.log('组件更新');}componentWillUnmount() {console.log('组件即将卸载');}
}
2.2 事件处理
在 React 中,事件处理类似于 HTML,但使用驼峰命名:
<button onClick={this.handleClick}>Click Me</button>
2.3 条件渲染
{isLoggedIn ? <UserDashboard /> : <LoginPage />}
2.4 列表渲染
const items = ['Apple', 'Banana', 'Cherry'];
const listItems = items.map(item => <li key={item}>{item}</li>);
3. React Hooks(React 16.8+)
React Hooks 允许在函数组件中使用 state 和生命周期。
3.1 useState
import { useState } from 'react';
function Counter() {const [count, setCount] = useState(0);return (<div><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increase</button></div>);
}
3.2 useEffect
import { useEffect } from 'react';
function Example() {useEffect(() => {console.log('组件渲染');}, []);
}
3.3 useContext
const ThemeContext = React.createContext('light');
function ThemedButton() {const theme = useContext(ThemeContext);return <button className={theme}>Click Me</button>;
}
4. React Router(前端路由)
React Router 允许实现单页面应用路由。
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
function App() {return (<Router><Routes><Route path="/" element={<Home />} /><Route path="/about" element={<About />} /></Routes></Router>);
}
5. Redux(状态管理)
Redux 解决组件间状态共享问题。
import { createStore } from 'redux';
const reducer = (state = { count: 0 }, action) => {switch (action.type) {case 'INCREMENT': return { count: state.count + 1 };default: return state;}
};
const store = createStore(reducer);
6. React 性能优化
6.1 使用 React.memo 进行组件优化
const MemoizedComponent = React.memo(MyComponent);
6.2 使用 useCallback 记忆化函数
const memoizedCallback = useCallback(() => doSomething(a, b), [a, b]);
6.3 使用 useMemo 记忆化计算结果
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
7. 结语
React 是现代前端开发的核心技术之一,掌握 React 组件、Hooks、路由和状态管理能帮助你构建强大的 Web 应用。本教程涵盖了 React 的基本用法和优化技巧,希望能帮助你入门并逐步深入!
相关文章:
React.js 基础与进阶教程
React.js 基础与进阶教程 React.js 是由 Facebook 开发的流行前端 JavaScript 库,专为构建用户界面(UI)设计,尤其适用于单页面应用(SPA)。它采用组件化开发模式,使 UI 结构更加清晰、可维护性更…...
网络变压器的主要电性参数与测试方法(4)
Hqst盈盛(华强盛)电子导读:网络变压器的主要电性参数与测试方法(4).. 今天我们继续来看看网络变压器的2个重要电性参数与它的测试方法: 1.反射损耗(Return loss&…...
【实战ES】实战 Elasticsearch:快速上手与深度实践-8.1.1基于ES的语义搜索(BERT嵌入向量)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 基于Elasticsearch与BERT的语义搜索架构设计与实战1. 传统搜索的局限性与语义搜索的崛起1.1 关键词搜索 vs 语义搜索1.2 Elasticsearch向量检索演进历程关键版本特性对比 2.…...
Windows10 WSL又又又一次崩了 Docker Desktop - Unexpected WSL error
问题:Windows10 WSL又又又一次崩了 这回报错: 然后再打开WSL Ubuntu就卡住了,等很长时间没反应,就关掉了。 手动启动Docker Desktop,报错: An unexpected error occurred while executing a WSL comman…...
XMI(XML Metadata Interchange)和XML之间的关系
XMI(XML Metadata Interchange)和XML之间的关系可以从以下几个方面进行阐述: 一、定义与背景 XML: XML(eXtensible Markup Language)是一种标记语言,被设计用来传输和存储数据。它是一种自描述…...
《深度剖析:鸿蒙系统下智能NPC与游戏剧情的深度融合》
在游戏开发领域,鸿蒙系统的崛起为开发者们带来了前所未有的机遇与挑战。尤其是在开发基于鸿蒙系统的人工智能游戏时,实现智能NPC的行为逻辑与游戏剧情紧密结合,成为了打造沉浸式游戏体验的关键。 鸿蒙系统作为一款面向全场景的分布式操作系统…...
【前端基础】:HTML
超链接标签: a href: 必须具备, 表示点击后会跳转到哪个页面. target: 打开方式. 默认是 _self. 如果是 _blank 则用新的标签页打开 <a href"http://www.baidu.com">百度</a>链接的几种形式: 外部链接: href 引用其他网站的地址 <a href"http…...
JVM垃圾收集器合集
前言:JVM GC收集器的回顾与比较 JVM(Java虚拟机)中的垃圾收集器是自动管理内存的重要机制,旨在回收不再使用的对象所占用的内存空间。以下是JVM中几种常见的垃圾收集器的详细介绍: 一、新生代垃圾收集器 1.Serial收集…...
Sourcetree——使用.gitignore忽略文件或者文件夹
一、为何需要文件忽略机制? 1.1 为什么要会略? 对于开发者而言,明智地选择忽略某些文件类型,能带来三大核心优势: 仓库纯净性:避免二进制文件、编译产物等污染代码库 安全防护:防止敏感信息&…...
unity使用mesh 画图(1)
plane 圆 空心椭圆 椭圆 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class DrawMeshManager {static DrawMeshManager instance;public static DrawMeshManager Instance {get {if (instance ! null){retu…...
本地部署 OpenManus 保姆级教程(Windows 版)
一、环境搭建 我的电脑是Windows 10版本,其他的没尝试,如果大家系统和我的不一致,请自行判断,基本上没什么大的出入啊。 openManus的Git地址:https://github.com/mannaandpoem/OpenManus 根据官网的两种安装推荐方式如…...
视频推拉流:EasyDSS平台直播通道重连转推失败原因排查与解决
视频推拉流EasyDSS视频直播点播平台,集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体,可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务。 用户使用EasyDSS平台对直播通道进行转推,发现只要关闭…...
机器人领域专业名词汇总
1. 电机与驱动 电机类型 DC Motor(直流电机):通过直流电源驱动的电机。Stepper Motor(步进电机):通过脉冲信号控制旋转角度的电机。Servo Motor(伺服电机):带有反馈控制的…...
成为超人 21:超人怎么学?技能的学习,如编程
成为超人 21:超人怎么学?技能的学习,如编程 ① 搞定全能自恋② 超人怎么学?③ 耐心怎么来? 宇树机器人王兴兴:奇迹也有算法,做成事没有那么难,就是把不可能三个字,拆解成…...
【科研绘图系列】python绘制分组点图(grouped dot plot)
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据函数`generateRectBoxDF` 函数主要作用参数解释逻辑流程`nmfDotPlot` 函数主要作用参数解释逻辑流程画图1画图2画图3画图4介绍 【科研绘图系列】python绘制…...
Springfox、Springdoc和Swagger
Springfox、Swagger 和 Springdoc Springfox、Swagger 和 Springdoc 是用于在 Spring Boot 项目中生成API文档的工具,但它们之间有显著的区别和演进关系: 1.Swagger 简介 Swagger 是一个开源项目,旨在为 RESTful APIs 提供交互式文档。最…...
在Spring Boot项目中如何实现获取FTP远端目录结构
Java语言实现获取FTP远端目录结构的实现方式有多种,在Spring Boot 项目中,最简单和快速的方式就是使用Spring Integration 实现FTP相关的功能。 前言 本篇的示例和演示基于Windows 的FTP 服务,关于如何在Windows 开启FTP服务可以参考: Windows 如何开启和使用FTP服务 本…...
Flutter_学习记录_device_info_plus 插件获取设备信息
引入三方库device_info_plus导入头文件 import package:device_info_plus/device_info_plus.dart;获取设备信息的主要代码 DeviceInfoPlugin deviceInfoPlugin DeviceInfoPlugin(); BaseDeviceInfo deviceInfo await deviceInfoPlugin.deviceInfo;完整案例 import package…...
Java高频面试之集合-10
hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:详解红黑树?HashMap为什么不用二叉树/平衡树呢? 一、红黑树(Red-Black Treeÿ…...
never_give_up
一个很有意思的题: never_give_up - Bugku CTF平台 注意到注释里面有1p.html,我们直接在源代码界面看,这样就不会跳转到它那个链接的: 然后解码可得: ";if(!$_GET[id]) {header(Location: hello.php?id1);exi…...
Python Selenium库入门使用,图文详细。附网页爬虫、web自动化操作等实战操作。
文章目录 前言1 创建conda环境安装Selenium库2 浏览器驱动下载(以Chrome和Edge为例)3 基础使用(以Chrome为例演示)3.1 与浏览器相关的操作3.1.1 打开/关闭浏览器3.1.2 访问指定域名的网页3.1.3 控制浏览器的窗口大小3.1.4 前进/后…...
聊天室Python脚本——ChatGPT,好用
下面提供两个 Python 脚本,一个作为服务器端(chat_server.py),一个作为客户端(chat_client.py)。你可以在一台电脑上运行服务器脚本,然后在不同电脑上运行客户端脚本(连接时指定服务…...
AI4CODE】3 Trae 锤一个贪吃蛇的小游戏
【AI4CODE】目录 【AI4CODE】1 Trae CN 锥安装配置与迁移 【AI4CODE】2 Trae 锤一个 To-Do-List 这次还是采用 HTML/CSS/JAVASCRIPT 技术栈 Trae 锤一个贪吃蛇的小游戏。 1 环境准备 创建一个 Snake 的子文件夹,清除以前的会话记录。 2 开始构建 2.1 输入会…...
【语料数据爬虫】Python爬虫|批量采集会议纪要数据(1)
前言 本文是该专栏的第2篇,后面会持续分享Python爬虫采集各种语料数据的的干货知识,值得关注。 在本文中,笔者将主要来介绍基于Python,来实现批量采集“会议纪要”数据。同时,本文也是采集“会议纪要”数据系列的第1篇。 采集相关数据的具体细节部分以及详细思路逻辑,笔…...
Linux 进程的一生(一):进程与线程的创建机制解析
在 Linux 操作系统中,每个任务都以「进程」的形式存在。但 Linux 下的「线程」又是什么?Linux 并没有单独定义一种全新数据结构来表示线程,而是将线程视为一种特殊的进程——一种共享资源的轻量级进程。然而,在具体实现和运行机制…...
【面试题集合】
目录 强缓存VS协商缓存**一、强缓存(本地缓存)**1. **定义**2. **核心 HTTP 头**3. **缓存生效流程**4. **应用场景** **二、协商缓存(条件请求)**1. **定义**2. **核心 HTTP 头**3. **缓存生效流程**4. **应用场景** **三、强缓存…...
【Academy】SSRF ------ Server-side request forgery
SSRF ------ Server-side request forgery 1. 什么是 SSRF?2. SSRF 攻击的影响是什么?3. 常见的 SSRF 攻击3.1 针对服务器的 SSRF 攻击3.2 针对其他后端系统的 SSRF 攻击 4. 规避常见的 SSRF 防御4.1 具有基于黑名单的输入过滤器的 SSRF4.2 具有基于白名…...
Git 的详细介绍及用法
一、Git 的优点 分布式版本控制 每个开发者都拥有完整的仓库副本,无需依赖中央服务器(如 SVN)。支持离线操作(提交、查看历史、创建分支等)。 高效的分支管理 创建和切换分支速度快(几乎是瞬间完成&#x…...
Ubuntu22.04安装数据
数据库安装步骤: sudo apt-get update sudo apt install mysql-server mysql-client sudo systemctl start mysql sudo systemctl status mysql (1)在命令行登录 MySQL 数据库,并使用 mysql 数据库 (必须使用这个…...
2025 ubuntu24系统宿主机上在线安装mysql数据库完整演示
说明:这是ubuntu24系统和安装后mysql的版本 rootmaster:/home/ubuntu# cat /etc/os-release PRETTY_NAME"Ubuntu 24.04.2 LTS" NAME"Ubuntu" VERSION_ID"24.04" VERSION"24.04.2 LTS (Noble Numbat)" VERSION_CODENAMEnob…...
