React 使用手册
1. 简介
React 是一个用于构建用户界面 (UI) 的 JavaScript 库,由 Facebook 开发并开源。它主要用于构建单页应用程序 (SPA) 和移动应用程序中的视图层。React官网。
2. 安装与环境配置
在开始使用 React 之前,需要进行环境配置。以下是使用 Create React App 快速创建 React 项目的步骤:
# 安装 create-react-app
npx create-react-app my-app
# 进入项目目录
cd my-app
# 启动开发服务器
npm start
3. React 基本概念
3.1 组件化
React 的核心思想是组件化。组件是独立的、可复用的代码块,可以管理自己的一部分内容。组件有两种主要类型:函数组件和类组件。
函数组件:
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
类组件:
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
3.2 JSX 语法
JSX 是一种语法扩展,允许在 JavaScript 中编写类似 HTML 的代码。
const element = <h1>Hello, world!</h1>;
3.3 虚拟DOM
React 使用虚拟DOM来优化性能。虚拟DOM是实际DOM的轻量级副本,React通过对比虚拟DOM和实际DOM的差异,只更新必要的部分。
3.4 单向数据流
React 采用单向数据流,即数据从父组件流向子组件。这种方式使得数据流动更加清晰和可预测。
4. React 状态与生命周期
4.1 状态 (State)
状态是 React 组件中的一种数据结构,表示组件的当前状态。可以通过在类组件中定义 this.state
来初始化状态,并使用 this.setState
更新状态。
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = { date: new Date() };
}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
4.2 生命周期方法
React 提供了一系列生命周期方法,允许在组件的不同阶段执行代码。常见的生命周期方法有:
componentDidMount()
: 组件挂载后调用componentDidUpdate()
: 组件更新后调用componentWillUnmount()
: 组件卸载前调用
class Clock extends React.Component {
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>
);
}
}
5. React Hooks
React 16.8 引入了 Hooks,使得函数组件可以使用状态和其他 React 特性。
5.1 useState
useState
是一个 Hook,允许在函数组件中添加状态。
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
5.2 useEffect
useEffect
是一个 Hook,允许在函数组件中执行副作用操作,如数据获取、订阅等。
import React, { useEffect, useState } from 'react';
function Clock() {
const [date, setDate] = useState(new Date());
useEffect(() => {
const timerID = setInterval(() => tick(), 1000);
return () => clearInterval(timerID);
}, []);
const tick = () => {
setDate(new Date());
};
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {date.toLocaleTimeString()}.</h2>
</div>
);
}
6. React 路由
React Router 是常用的路由库,用于在 React 应用中实现导航。
# 安装 react-router-dom
npm install react-router-dom
import React from 'react';
import { BrowserRouter as Router, Route, Switch, Link } from 'react-router-dom';
function Home() {
return <h2>Home</h2>;
}
function About() {
return <h2>About</h2>;
}
function App() {
return (
<Router>
<div>
<nav>
<ul>
<li><Link to="/">Home</Link></li>
<li><Link to="/about">About</Link></li>
</ul>
</nav>
<Switch>
<Route path="/about"><About /></Route>
<Route path="/"><Home /></Route>
</Switch>
</div>
</Router>
);
}
export default App;
7. Redux 状态管理
Redux 是一个流行的状态管理库,适用于大型应用。
# 安装 redux 和 react-redux
npm install redux react-redux
import { createStore } from 'redux';
import { Provider, useSelector, useDispatch } from 'react-redux';
// 定义初始状态
const initialState = { count: 0 };
// 定义 reducer
function counterReducer(state = initialState, action) {
switch (action.type) {
case 'INCREMENT':
return { count: state.count + 1 };
case 'DECREMENT':
return { count: state.count - 1 };
default:
return state;
}
}
// 创建 Redux store
const store = createStore(counterReducer);
// 定义组件
function Counter() {
const count = useSelector(state => state.count);
const dispatch = useDispatch();
return (
<div>
<p>Count: {count}</p>
<button onClick={() => dispatch({ type: 'INCREMENT' })}>Increment</button>
<button onClick={() => dispatch({ type: 'DECREMENT' })}>Decrement</button>
</div>
);
}
// 渲染应用
function App() {
return (
<Provider store={store}>
<Counter />
</Provider>
);
}
export default App;
在深入描述 React 使用时,可以增加以下内容,以提供更全面的指导:
8. Context API
Context API 是 React 提供的一种方式,用于在组件树中传递数据,而不需要通过每一级的组件手动传递 props。
8.1 创建 Context
import React, { createContext, useContext, useState } from 'react';
const ThemeContext = createContext();
function ThemeProvider({ children }) {
const [theme, setTheme] = useState('light');
return (
<ThemeContext.Provider value={{ theme, setTheme }}>
{children}
</ThemeContext.Provider>
);
}
function ThemedComponent() {
const { theme, setTheme } = useContext(ThemeContext);
return (
<div style={{ background: theme === 'light' ? '#fff' : '#333', color: theme === 'light' ? '#000' : '#fff' }}>
<p>Current theme: {theme}</p>
<button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>Toggle Theme</button>
</div>
);
}
function App() {
return (
<ThemeProvider>
<ThemedComponent />
</ThemeProvider>
);
}
export default App;
9. Form Handling
处理表单是 React 应用中的常见需求。以下是一个简单的表单处理示例:
import React, { useState } from 'react';
function Form() {
const [name, setName] = useState('');
const [email, setEmail] = useState('');
const handleSubmit = (e) => {
e.preventDefault();
alert(`Name: ${name}, Email: ${email}`);
};
return (
<form onSubmit={handleSubmit}>
<div>
<label>
Name:
<input type="text" value={name} onChange={(e) => setName(e.target.value)} />
</label>
</div>
<div>
<label>
Email:
<input type="email" value={email} onChange={(e) => setEmail(e.target.value)} />
</label>
</div>
<button type="submit">Submit</button>
</form>
);
}
export default Form;
10. Error Boundaries
错误边界是 React 组件,用于捕获其子组件树中的 JavaScript 错误,记录错误并显示回退 UI。
import React, { Component } from 'react';
class ErrorBoundary extends Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
console.error("Error caught in ErrorBoundary:", error, errorInfo);
}
render() {
if (this.state.hasError) {
return <h1>Something went wrong.</h1>;
}
return this.props.children;
}
}
function BuggyComponent() {
throw new Error("I crashed!");
return <div>I'm buggy</div>;
}
function App() {
return (
<ErrorBoundary>
<BuggyComponent />
</ErrorBoundary>
);
}
export default App;
11. Custom Hooks
自定义 Hook 使你可以将组件逻辑提取到可重用的函数中。以下是一个简单的自定义 Hook 示例:
import React, { useState, useEffect } from 'react';
function useFetch(url) {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch(url)
.then((response) => response.json())
.then((data) => {
setData(data);
setLoading(false);
});
}, [url]);
return { data, loading };
}
function DataFetchingComponent() {
const { data, loading } = useFetch('https://api.example.com/data');
if (loading) {
return <div>Loading...</div>;
}
return (
<div>
<pre>{JSON.stringify(data, null, 2)}</pre>
</div>
);
}
export default DataFetchingComponent;
12. Performance Optimization
优化 React 应用的性能可以提高用户体验。以下是一些常用的优化方法:
12.1 使用 React.memo
React.memo
是一个高阶组件,用于防止不必要的重新渲染。
import React from 'react';
const MyComponent = React.memo(function MyComponent({ value }) {
return <div>{value}</div>;
});
12.2 使用 useCallback
和 useMemo
useCallback
和 useMemo
用于缓存函数和计算结果,减少不必要的计算。
import React, { useCallback, useMemo } from 'react';
function ExpensiveComponent({ compute, value }) {
const result = useMemo(() => compute(value), [compute, value]);
return <div>{result}</div>;
}
function ParentComponent() {
const compute = useCallback((value) => {
// some expensive computation
return value * 2;
}, []);
return <ExpensiveComponent compute={compute} value={10} />;
}
通过这些附加内容,可以进一步深入理解和使用 React,构建更加复杂和高效的应用。如果您有任何具体主题上的问题或需要更多详细信息,请随时告诉我!
13. 总结
本文涵盖了 React 的基本概念、安装与环境配置、状态与生命周期、Hooks、路由以及 Redux 状态管理的详细介绍和代码示例。通过这些内容,您可以快速上手并构建自己的 React 应用。