React 入门指南
更新: 8/6/2025 字数: 0 字 时长: 0 分钟
什么是 React?
React 是一个用于构建用户界面的 JavaScript 库,由 Facebook 开发并维护。它允许开发者创建大型的 Web 应用,这些应用可以在不重新加载页面的情况下更新和渲染数据。
为什么选择 React?
- 组件化开发:React 使用组件化的开发方式,使代码更加模块化和可复用。
- 虚拟 DOM:React 使用虚拟 DOM 来提高性能,只更新需要更新的部分。
- 单向数据流:React 采用单向数据流,使应用的状态管理更加可预测。
- 大型社区:React 拥有庞大的社区支持和丰富的生态系统。
环境搭建
使用 Create React App
最简单的方式是使用官方脚手架工具 Create React App:
bash
# 使用 npm
npm create react-app my-app
# 使用 yarn
yarn create react-app my-app
# 使用 pnpm
pnpm create react-app my-app
# 进入项目目录
cd my-app
# 启动开发服务器
npm start
使用 Vite
Vite 是一个更快的构建工具,也可以用来创建 React 项目:
bash
# 使用 npm
npm create vite@latest my-app -- --template react
# 使用 yarn
yarn create vite my-app --template react
# 使用 pnpm
pnpm create vite my-app --template react
# 进入项目目录
cd my-app
# 安装依赖
npm install
# 启动开发服务器
npm run dev
第一个 React 组件
创建一个简单的 React 组件:
jsx
// App.jsx
import React from 'react';
function App() {
return (
<div className="app">
<h1>Hello, React!</h1>
<p>Welcome to my first React application.</p>
</div>
);
}
export default App;
JSX 语法
JSX 是 JavaScript 的语法扩展,允许在 JavaScript 中编写类似 HTML 的代码:
jsx
// 基本 JSX 语法
const element = <h1>Hello, world!</h1>;
// 在 JSX 中使用 JavaScript 表达式
const name = 'React';
const element = <h1>Hello, {name}!</h1>;
// JSX 中的属性
const element = <img src={user.avatarUrl} alt="User Avatar" />;
// JSX 中的子元素
const element = (
<div>
<h1>Hello!</h1>
<p>Welcome to React.</p>
</div>
);
组件和 Props
React 组件可以接收参数,这些参数称为 Props:
jsx
// 函数组件
function Welcome(props) {
return <h1>Hello, {props.name}!</h1>;
}
// 使用组件
function App() {
return (
<div>
<Welcome name="Alice" />
<Welcome name="Bob" />
<Welcome name="Charlie" />
</div>
);
}
状态和生命周期
使用类组件管理状态:
jsx
import React, { Component } from 'react';
class Clock extends Component {
constructor(props) {
super(props);
this.state = { date: new Date() };
}
componentDidMount() {
this.timerID = setInterval(() => this.tick(), 1000);
}
componentWillUnmount() {
clearInterval(this.timerID);
}
tick() {
this.setState({ date: new Date() });
}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
使用 Hooks
Hooks 是 React 16.8 引入的新特性,允许在函数组件中使用状态和其他 React 特性:
jsx
import React, { useState, useEffect } from 'react';
function Clock() {
const [date, setDate] = useState(new Date());
useEffect(() => {
const timerID = setInterval(() => tick(), 1000);
return () => clearInterval(timerID); // 清理函数
}, []); // 空依赖数组表示只在组件挂载和卸载时执行
function tick() {
setDate(new Date());
}
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {date.toLocaleTimeString()}.</h2>
</div>
);
}
事件处理
React 中的事件处理与 DOM 元素的事件处理类似:
jsx
import React, { useState } from 'react';
function Toggle() {
const [isToggleOn, setIsToggleOn] = useState(true);
const handleClick = () => {
setIsToggleOn(!isToggleOn);
};
return (
<button onClick={handleClick}>
{isToggleOn ? 'ON' : 'OFF'}
</button>
);
}
条件渲染
在 React 中可以根据条件渲染不同的组件:
jsx
function UserGreeting(props) {
return <h1>Welcome back!</h1>;
}
function GuestGreeting(props) {
return <h1>Please sign up.</h1>;
}
function Greeting(props) {
const isLoggedIn = props.isLoggedIn;
if (isLoggedIn) {
return <UserGreeting />;
}
return <GuestGreeting />;
}
// 使用三元运算符
function Greeting(props) {
const isLoggedIn = props.isLoggedIn;
return (
<div>
{isLoggedIn ? <UserGreeting /> : <GuestGreeting />}
</div>
);
}
// 使用逻辑与运算符
function Mailbox(props) {
const unreadMessages = props.unreadMessages;
return (
<div>
<h1>Hello!</h1>
{unreadMessages.length > 0 &&
<h2>You have {unreadMessages.length} unread messages.</h2>
}
</div>
);
}
列表和 Keys
使用 map()
函数渲染列表:
jsx
function NumberList(props) {
const numbers = props.numbers;
const listItems = numbers.map((number) =>
<li key={number.toString()}>
{number}
</li>
);
return <ul>{listItems}</ul>;
}
const numbers = [1, 2, 3, 4, 5];
function App() {
return <NumberList numbers={numbers} />;
}
表单处理
在 React 中处理表单:
jsx
import React, { useState } from 'react';
function NameForm() {
const [name, setName] = useState('');
const handleChange = (event) => {
setName(event.target.value);
};
const handleSubmit = (event) => {
alert('A name was submitted: ' + name);
event.preventDefault();
};
return (
<form onSubmit={handleSubmit}>
<label>
Name:
<input type="text" value={name} onChange={handleChange} />
</label>
<button type="submit">Submit</button>
</form>
);
}
组合与继承
React 推荐使用组合而非继承来复用组件之间的代码:
jsx
function FancyBorder(props) {
return (
<div className={'FancyBorder FancyBorder-' + props.color}>
{props.children}
</div>
);
}
function WelcomeDialog() {
return (
<FancyBorder color="blue">
<h1 className="Dialog-title">Welcome</h1>
<p className="Dialog-message">Thank you for visiting our spacecraft!</p>
</FancyBorder>
);
}
下一步学习
- React Router - 用于处理 React 应用中的路由
- Redux 或 Context API - 用于状态管理
- Styled Components 或 CSS Modules - 用于样式管理
- React Testing Library - 用于测试 React 组件