React框架入门:构建现代用户界面
# 前言
嗨,大家好!我是Jorgen。在我维护的技术博客中,已经介绍过Vue.js框架的强大之处(还记得那篇《Vue.js-从入门到实践-构建现代前端应用》吗?),但似乎忽略了一个同样重要的前端框架——React。🤦♂️
作为一名前端开发者,如果你只了解Vue而不知道React,那就像一个只会用右手写字的人一样,虽然能完成工作,但总是少了点什么。今天,就让我们一起走进React的世界,探索这个由Facebook(现在是Meta)开发的强大框架!
提示
React是用于构建用户界面的JavaScript库,由Facebook开发并在2013年开源。它采用组件化开发模式,使用虚拟DOM提高性能,是目前最流行的前端框架之一。
# 为什么选择React?
在开始学习React之前,我们得先明白为什么要学习它。毕竟,市面上已经有那么多前端框架了,为什么React能脱颖而出呢?
# 1. 组件化开发
React最核心的理念就是组件化开发。将UI拆分成独立、可复用的组件,每个组件管理自己的状态和渲染逻辑。
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
2
3
这种开发方式让代码更加模块化,易于维护和扩展。🏗
# 2. 虚拟DOM
React使用虚拟DOM来优化性能。当状态发生变化时,React会比较虚拟DOM的差异,然后只更新实际DOM中需要变化的部分,而不是重新渲染整个页面。
这就像是在修改一份文档时,你不会重新打印整份文档,而是只修改需要更改的部分。💡
# 3. 丰富的生态系统
React拥有庞大的生态系统,包括:
- React Router:用于处理路由
- Redux:状态管理库
- Material-UI:UI组件库
- Next.js:服务端渲染框架
这些工具和库让React开发变得更加高效和便捷。📦
# React基础概念
让我们深入了解React的一些基础概念,这些是构建React应用的基础。
# JSX语法
JSX是React的语法扩展,它允许我们在JavaScript代码中编写类似HTML的标记。
const element = <h1 className="greeting">Hello, world!</h1>;
虽然看起来像HTML,但JSX实际上会被编译成JavaScript对象,最终渲染为真实的DOM元素。
THEOREM
JSX不是必须的,但使用JSX可以更直观地描述UI,提高代码的可读性。
# 组件与Props
React应用由组件构成。组件可以接收输入(称为props)并返回描述UI的React元素。
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
const element = <Welcome name="Sara" />;
2
3
4
5
在这个例子中,Welcome是一个组件,name是传递给它的prop。
# 状态管理
每个组件都有自己的状态(state),状态改变会触发组件的重新渲染。
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}
componentDidMount() {
this.timerID = setInterval(
() => this.setState({date: new Date()}),
1000
);
}
componentWillUnmount() {
clearInterval(this.timerID);
}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>现在是 {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 实战:构建一个简单的React应用
理论说再多不如动手实践。下面,我们一起来构建一个简单的待办事项(Todo List)应用。
# 1. 创建React应用
首先,我们需要创建一个新的React应用。最简单的方式是使用Create React App:
npx create-react-app todo-app
cd todo-app
npm start
2
3
这会创建一个基本的React应用,并在浏览器中自动打开。
# 2. 组件结构
我们的Todo应用将包含以下组件:
App:主组件,管理整体状态TodoList:显示待办事项列表TodoItem:单个待办事项AddTodo:添加新待办事项的表单
# 3. 实现TodoList组件
让我们先实现TodoList组件:
import React from 'react';
function TodoList({ todos, toggleTodo }) {
return (
<ul>
{todos.map(todo => (
<TodoItem
key={todo.id}
todo={todo}
toggleTodo={toggleTodo}
/>
))}
</ul>
);
}
function TodoItem({ todo, toggleTodo }) {
return (
<li>
<input
type="checkbox"
checked={todo.completed}
onChange={() => toggleTodo(todo.id)}
/>
<span style={{ textDecoration: todo.completed ? 'line-through' : 'none' }}>
{todo.text}
</span>
</li>
);
}
export default TodoList;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 4. 实现AddTodo组件
接下来,我们实现添加新待办事项的表单:
import React, { useState } from 'react';
function AddTodo({ addTodo }) {
const [text, setText] = useState('');
const handleSubmit = e => {
e.preventDefault();
if (!text.trim()) return;
addTodo(text);
setText('');
};
return (
<form onSubmit={handleSubmit}>
<input
type="text"
value={text}
onChange={e => setText(e.target.value)}
placeholder="添加新待办事项"
/>
<button type="submit">添加</button>
</form>
);
}
export default AddTodo;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 5. 整合到App组件
最后,我们将所有组件整合到App组件中:
import React, { useState } from 'react';
import AddTodo from './AddTodo';
import TodoList from './TodoList';
import './App.css';
function App() {
const [todos, setTodos] = useState([
{ id: 1, text: '学习React', completed: false },
{ id: 2, text: '构建应用', completed: false },
{ id: 3, text: '部署上线', completed: false }
]);
const addTodo = text => {
const newTodo = {
id: Date.now(),
text,
completed: false
};
setTodos([...todos, newTodo]);
};
const toggleTodo = id => {
setTodos(todos.map(todo =>
todo.id === id ? { ...todo, completed: !todo.completed } : todo
));
};
return (
<div className="app">
<h1>React待办事项</h1>
<AddTodo addTodo={addTodo} />
<TodoList todos={todos} toggleTodo={toggleTodo} />
</div>
);
}
export default App;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# React Hooks
React Hooks是React 16.8引入的新特性,它允许你在函数组件中使用状态和其他React特性,而不必编写类组件。
# useState Hook
useState是最常用的Hook,用于在函数组件中添加状态:
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>你点击了 {count} 次</p>
<button onClick={() => setCount(count + 1)}>
点击我
</button>
</div>
);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
# useEffect Hook
useEffect用于处理副作用,如数据获取、订阅或手动修改DOM:
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
// 类似于componentDidMount和componentDidUpdate
useEffect(() => {
// 更新文档的标题
document.title = `你点击了 ${count} 次`;
});
return (
<div>
<p>你点击了 {count} 次</p>
<button onClick={() => setCount(count + 1)}>
点击我
</button>
</div>
);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 结语
通过这篇文章,我们初步了解了React的基本概念和用法。React以其组件化开发、虚拟DOM和丰富的生态系统成为了前端开发的重要工具。
React与Vue.js各有优势,选择哪个框架主要取决于项目需求和个人偏好。作为前端开发者,掌握多种框架会让你更加灵活地应对不同的开发场景。
"学习React不是终点,而是前端开发旅程中的一个重要里程碑。"
如果你对React感兴趣,可以继续深入学习以下主题:
- React Router:处理应用路由
- Redux:状态管理
- React Testing Library:测试React应用
- Next.js:React的服务端渲染框架
希望这篇文章对你有所帮助!如果你有任何问题或建议,欢迎在评论区留言交流。😊
记住,技术学习是一个持续的过程,保持好奇心和学习的热情,你会在前端开发的道路上走得更远!