React 初体验:从零搭建一个响应式任务列表应用
作为一名刚刚接触前端开发的大学生,最近深入学习了 React 这个流行的 JavaScript 库,并尝试用它搭建了一个简单的任务列表(TODOS)应用。这个过程让我对 React 的组件化开发模式、状态管理以及响应式数据处理有了更直观的理解,以下是我的学习笔记和实践总结。
从原生 JS 到 React 的思考转变
在接触 React 之前,我们通常使用原生 JavaScript 进行开发,直接操作 DOM。这种开发方式虽然可以实现功能,但存在一些明显的问题,比如代码复用性差、维护成本高,以及在处理复杂交互时容易导致代码混乱。原生 JS 侧重于底层 API 的操作,对于业务逻辑的抽象能力较弱。
而 React 提供了一种完全不同的开发思路:通过组件化的方式构建用户界面,将页面拆分为多个独立的组件,每个组件负责一部分功能和 UI 展示,这样不仅提高了代码的复用性,也使得代码结构更加清晰,便于维护。在 React 中,我们不再需要频繁地手动操作 DOM,而是通过声明式编程的方式,让 React 自动管理 DOM 的更新,从而提高开发效率。
React 项目的快速搭建
必备工具:npm 与 Vite
在开始 React 项目之前,我们需要了解两个重要的工具:npm 和 Vite。npm 是 Node.js 的包管理器,类似于 Python 的 pip,它可以帮助我们快速安装和管理项目所需的依赖包。而 Vite 是一个现代化的前端构建工具,它可以显著提升项目的开发效率。
项目创建步骤
- 初始化项目 :使用
npm init vite命令,按照提示选择 React 和 JavaScript 作为项目模板,Vite 会为我们生成一个基本的项目结构。 - 进入项目目录 :使用
cd 项目名称命令进入项目文件夹。 - 安装依赖 :运行
npm i命令,这会根据项目配置自动下载并安装所需的依赖包,所有安装的包都会存储在node_modules文件夹中。 - 启动开发服务器 :使用
npm run dev命令启动项目,Vite 会自动监听文件变化,并在本地启动一个开发服务器,默认端口是 5173,我们可以在浏览器中访问http://localhost:5173来查看项目效果。
React 组件开发的核心要点
组件是开发的基本单元
在 React 中,组件是构建用户界面的最小单元,它将 HTML、CSS 和 JavaScript 逻辑封装在一起。一个组件可以是一个函数,也可以是一个类,目前函数组件配合 Hooks 的使用更为普遍。函数组件的编写非常简单,它就是一个普通的 JavaScript 函数,返回相应的 JSX 代码,用于描述 UI 的结构。
用 JSX 编写混合代码
JSX 是 React 中的一种语法扩展,它允许我们在 JavaScript 代码中直接编写类似 HTML 的结构。在 JSX 中,我们可以使用花括号{}来嵌入 JavaScript 表达式,这样就可以很方便地在 UI 中动态展示数据或执行逻辑,而不需要像原生 JS 那样频繁地切换 DOM 操作和 JS 逻辑。
例如,如果我们有一个任务列表的数据['脱单', '学习', '健身'],在 React 组件中可以这样渲染:
JavaScript
复制
function TodoList() {
const todos = ['脱单', '学习', '健身'];
return (
<ul>
{todos.map((todo, index) => (
<li key={index}>{todo}</li>
))}
</ul>
);
}
这里我们使用了map函数来遍历任务数组,并在 JSX 中动态生成列表项。
状态管理:useState 的妙用
在实际应用中,数据往往会随着时间发生变化,这就需要我们对数据状态进行管理。React 提供了useState这个 Hook,它可以让我们在函数组件中使用状态。
useState的使用方法是:调用useState(初始值)会返回一个数组,数组的第一个元素是当前的状态值,第二个元素是一个函数,用于更新状态。例如:
JavaScript
复制
import React, { useState } from 'react';
function TodoApp() {
const [todos, setTodos] = useState(['脱单', '学习', '健身']);
// ...
}
在这里,todos是我们定义的状态变量,setTodos是用于更新todos的函数。当我们需要修改任务列表时,只需要调用setTodos并传入新的数据,React 会自动重新渲染组件,确保 UI 与状态保持一致,这种响应式的数据处理方式大大简化了开发过程。
案例实战:构建一个响应式 TODO 列表应用
基于上述知识,我动手实现了一个简单的任务列表应用,以下是完整的代码实现:
App.js
JavaScript
复制
import React, { useState } from 'react';
function App() {
const [todos, setTodos] = useState(['脱单', '学习', '健身']);
const [newTodo, setNewTodo] = useState('');
const addTodo = () => {
if (newTodo.trim() !== '') {
setTodos([...todos, newTodo]);
setNewTodo('');
}
};
const deleteTodo = (index) => {
const newTodos = todos.filter((_, i) => i !== index);
setTodos(newTodos);
};
return (
<div className="todo-app">
<h1>我的任务列表</h1>
<div className="input-container">
<input
type="text"
value={newTodo}
onChange={(e) => setNewTodo(e.target.value)}
placeholder="添加新任务..."
/>
<button onClick={addTodo}>添加任务</button>
</div>
<ul className="todo-list">
{todos.map((todo, index) => (
<li key={index} className="todo-item">
{todo}
<button onClick={() => deleteTodo(index)}>删除</button>
</li>
))}
</ul>
</div>
);
}
export default App;
index.js
JavaScript
复制
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
index.css
css
复制
.todo-app {
max-width: 500px;
margin: 0 auto;
padding: 20px;
font-family: Arial, sans-serif;
}
.input-container {
display: flex;
margin-bottom: 20px;
}
input {
flex: 1;
padding: 8px;
font-size: 16px;
border: 1px solid #ccc;
border-radius: 4px 0 0 4px;
}
button {
padding: 8px 16px;
background-color: #007bff;
color: white;
border: none;
cursor: pointer;
font-size: 16px;
}
button:hover {
background-color: #0056b3;
}
.todo-list {
list-style-type: none;
padding: 0;
}
.todo-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px;
margin-bottom: 8px;
background-color: #f8f9fa;
border: 1px solid #dee2e6;
border-radius: 4px;
}
这个应用实现了以下功能:
- 初始页面展示三个任务:'脱单'、'学习'、'健身'。
- 用户可以在输入框中添加新的任务,点击“添加任务”按钮后,新任务会被添加到列表中。
- 每个任务项右侧都有一个“删除”按钮,点击后可以删除对应的任务。
React 学习的收获
通过这次 React 项目实践,我深刻体会到了 React 的优势所在。它通过组件化开发提高了代码的可维护性和复用性,通过状态管理和响应式数据处理机制,大大简化了 UI 的更新和维护过程。相比原生 JS 开发,React 让我可以更加专注于业务逻辑本身,而不是被复杂的 DOM 操作所困扰