使用React 实现一个简单的待办事项列表 | 豆包MarsCode AI刷题

87 阅读4分钟

使用 React 构建待办事项列表应用

在现代 web 开发中,React 已成为构建用户界面的热门库之一。本文将详细介绍如何使用 React 实现一个简单的待办事项列表应用,该应用允许用户添加新的待办事项、编辑已有的事项以及删除不再需要的任务。

一、项目初始化与基本设置

首先,确保你的开发环境中已安装了 Node.js 和 npm(Node Package Manager)。使用create-react-app工具快速搭建 React 项目的基础结构:

收起

plaintext

复制

npx create-react-app todo-app
cd todo-app

这将创建一个名为todo-app的新项目,并自动生成一些基础文件和目录,包括src目录(用于存放源代码)、public目录(存放公共资源)以及package.json(项目依赖和脚本配置文件)等。

二、组件设计与实现

在 React 中,应用通常由多个组件构成,每个组件负责特定的功能或界面部分。对于待办事项列表应用,我们主要设计以下几个组件:

(一)TodoList组件

这是整个应用的核心组件,负责管理和展示待办事项列表,以及处理与待办事项相关的各种操作(添加、编辑、删除)。

收起

jsx

复制

import React, { useState } from 'react';

const TodoList = () => {
    // 状态管理:使用 useState 钩子来存储待办事项数组、新待办事项文本以及当前正在编辑的事项 ID
    const [todos, setTodos] = useState([]);
    const [newTodoText, setNewTodoText] = useState('');
    const [editingTodoId, setEditingTodoId] = useState(null);

    // 添加待办事项的函数
    const addTodo = () => {
        if (newTodoText.trim()!== '') {
            // 创建新的待办事项对象,并添加到 todos 数组中
            const newTodo = { id: Date.now(), text: newTodoText, isEditing: false };
            setTodos([...todos, newTodo]);
            // 清空新待办事项文本输入框
            setNewTodoText('');
        }
    };

    // 切换待办事项编辑状态的函数
    const toggleEdit = (todoId) => {
        setEditingTodoId(editingTodoId === todoId? null : todoId);
    };

    // 更新正在编辑的待办事项文本的函数
    const updateTodoText = (e, todoId) => {
        const updatedTodos = todos.map(todo => {
            if (todo.id === todoId) {
                return {...todo, text: e.target.value };
            }
            return todo;
        });
        setTodos(updatedTodos);
    };

    // 保存编辑后的待办事项的函数
    const saveEdit = (todoId) => {
        const updatedTodos = todos.map(todo => {
            if (todo.id === todoId) {
                return {...todo, isEditing: false };
            }
            return todo;
        });
        setTodos(updatedTodos);
        setEditingTodoId(null);
    };

    // 删除待办事项的函数
    const deleteTodo = (todoId) => {
        const updatedTodos = todos.filter(todo => todo.id!== todoId);
        setTodos(updatedTodos);
    };

    return (
        <div>
            <h1>待办事项列表</h1>
            {/* 输入框用于输入新待办事项文本 */}
            <input
                type="text"
                placeholder="添加新的待办事项"
                value={newTodoText}
                onChange={(e) => setNewTodoText(e.target.value)}
            />
            {/* 添加按钮,点击时调用 addTodo 函数 */}
            <button onClick={addTodo}>添加</button>
            <ul>
                {/* 遍历 todos 数组,为每个待办事项生成一个列表项 */}
                {todos.map(todo => (
                    <li key={todo.id}>
                        {/* 如果事项处于编辑状态,显示文本输入框,否则显示普通文本 */}
                        {todo.isEditing? (
                            <input
                                type="text"
                                value={todo.text}
                                onChange={(e) => updateTodoText(e, todo.id)}
                            />
                        ) : (
                            <span>{todo.text}</span>
                        )}
                        {/* 根据编辑状态显示不同的按钮:编辑或保存、删除 */}
                        {todo.isEditing? (
                            <>
                                <button onClick={() => saveEdit(todo.id)}>保存</button>
                                <button onClick={() => toggleEdit(todo.id)}>取消</button>
                            </>
                        ) : (
                            <>
                                <button onClick={() => toggleEdit(todo.id)}>编辑</button>
                                <button onClick={() => deleteTodo(todo.id)}>删除</button>
                            </>
                        )}
                    </li>
                ))}
            </ul>
        </div>
    );
};

export default TodoList;

(二)App组件

作为应用的入口点,App组件主要用于渲染TodoList组件,并提供整个应用的基本布局和样式。

收起

jsx

复制

import React from'react';
import TodoList from './TodoList';
import './App.css';

const App = () => {
    return (
        <div className="app-container">
            <TodoList />
        </div>
    );
};

export default App;

三、样式设计

为了使应用具有较好的视觉效果和用户体验,我们可以为组件添加一些简单的 CSS 样式。在src/App.css文件中,可以添加以下样式:

收起

css

复制

.app-container {
    max-width: 400px;
    margin: 0 auto;
    padding: 20px;
    font-family: Arial, sans-serif;
}

h1 {
    text-align: center;
    margin-bottom: 20px;
}

input[type="text"] {
    width: 100%;
    padding: 10px;
    margin-bottom: 10px;
}

button {
    margin-right: 10px;
    padding: 8px 16px;
    cursor: pointer;
}

ul {
    list-style-type: none;
    padding: 0;
}

li {
    display: flex;
    justify-content: space-between;
    align-items: center;
    border-bottom: 1px solid #ccc;
    padding: 10px 0;
}

四、应用运行与测试

在项目目录下的命令行中运行以下命令启动开发服务器:

收起

plaintext

复制

npm start

这将自动在浏览器中打开应用,地址为http://localhost:3000。此时,你可以看到待办事项列表应用的界面,尝试添加新的待办事项、编辑已有的事项以及删除不再需要的任务,验证应用的功能是否正常。

通过以上步骤,我们使用 React 成功构建了一个简单的待办事项列表应用。这个示例展示了 React 的基本概念和核心特性,如组件化开发、状态管理以及事件处理等。在实际开发中,你可以根据需求进一步扩展和优化这个应用,例如添加数据持久化功能(将待办事项保存到本地存储或服务器端数据库)、实现待办事项的分类和优先级设置、进行更复杂的用户界面设计等。