用 React 打造简易待办事项列表:功能全解析

74 阅读3分钟

用 React 打造简易待办事项列表:功能全解析

在现代 web 开发领域,React 以其高效、灵活且组件化的特性深受开发者喜爱。今天,我们就来利用 React 搭建一个简单却实用的待办事项列表,涵盖添加、编辑和删除功能,让日常任务管理变得轻松有序。

一、项目搭建与基础环境

首先,确保你的开发环境安装好了 Node.js 和 npm(Node 包管理器)。创建一个新的 React 项目,可以借助 create-react-app 这个便捷工具。在命令行中输入:npx create-react-app todo-list-app,稍作等待,一个基础的 React 项目结构就搭建好了。进入项目目录 cd todo-list-app,准备开启编码之旅。

二、组件设计思路

我们的待办事项列表应用主要围绕几个核心组件展开:

  1. App 组件:作为整个应用的根组件,负责整合其他组件,把控整体状态与逻辑流向。它将持有待办事项数组,并把操作函数(添加、编辑、删除)传递给子组件。
  2. TodoInput 组件:提供输入框与添加按钮,让用户输入新的待办事项内容,并触发添加操作,将新任务提交到父组件(App 组件)进行处理。
  3. TodoItem 组件:针对每条待办事项进行展示,包含任务描述文本、编辑按钮和删除按钮。编辑按钮点击后可切换至编辑态,修改任务内容;删除按钮则直接移除当前任务。

三、代码实现详解

App 组件(App.js)

import React, { useState } from 'react';
import TodoInput from './TodoInput';
import TodoItem from './TodoItem';

function App() {
    // 状态管理,存储待办事项数组
    const [todos, setTodos] = useState([]);
    // 用于生成每个事项的唯一 ID
    let id = 0;

    // 添加待办事项函数
    const addTodo = (text) => {
        if (text.trim()!== '') {
            setTodos([...todos, { id: id++, text, isEditing: false }]);
        }
    };

    // 编辑待办事项函数
    const editTodo = (todoId, newText) => {
        setTodos(todos.map(todo => {
            if (todo.id === todoId) {
                return {...todo, text: newText, isEditing: false };
            }
            return todo;
        }));
    };

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

    // 切换编辑状态函数
    const toggleEdit = (todoId) => {
        setTodos(todos.map(todo => {
            if (todo.id === todoId) {
                return {...todo, isEditing:!todo.isEditing };
            }
            return todo;
        }));
    };

    return (
        <div className="App">
            <h1>待办事项列表</h1>
            <TodoInput addTodo={addTodo} />
            {todos.map(todo => (
                <TodoItem
                    key={todo.id}
                    todo={todo}
                    editTodo={editTodo}
                    deleteTodo={deleteTodo}
                    toggleEdit={toggleEdit}
                />
            ))}
        </div>
    );
}

export default App;

这里,通过 useState 钩子管理 todos 数组状态,实现添加、编辑、删除与切换编辑态的逻辑函数,并传递给子组件。

TodoInput 组件(TodoInput.js)

import React, { useState } from 'react';

function TodoInput({ addTodo }) {
    const [inputValue, setInputValue] = useState('');

    const handleInputChange = (e) => {
        setInputValue(e.target.value);
    };

    const handleAddTodo = () => {
        addTodo(inputValue);
        setInputValue('');
    };

    return (
        <div>
            <input type="text" value={inputValue} onChange={handleInputChange} placeholder="输入待办事项" />
            <button onClick={handleAddTodo}>添加</button>
        </div>
    );
}

export default TodoInput;

内部状态 inputValue 跟踪输入框内容,通过 handleAddTodo 调用父组件传来的 addTodo 函数添加新任务。

TodoItem 组件(TodoItem.js)

import React from 'react';

function TodoItem({ todo, editTodo, deleteTodo, toggleEdit }) {
    const { id, text, isEditing } = todo;
    const [editValue, setEditValue] = React.useState(text);

    const handleEditChange = (e) => {
        setEditValue(e.target.value);
    };

    const handleEditSave = () => {
        editTodo(id, editValue);
    };

    return (
        <div>
            {isEditing? (
                <div>
                    <input type="text" value={editValue} onChange={handleEditChange} />
                    <button onClick={handleEditSave}>保存</button>
                </div>
            ) : (
                <div>
                    <span>{text}</span>
                    <button onClick={() => toggleEdit(id)}>编辑</button>
                    <button onClick={() => deleteTodo(id)}>删除</button>
                </div>
            )}
        </div>
    );
}

export default TodoItem;

依据 isEditing 状态展示编辑态或常态界面,编辑态下可修改内容保存,常态下能切换编辑、执行删除。

四、样式美化与交互体验提升

为了让列表视觉更舒适、操作更流畅,添加 CSS 样式。在项目目录新建 App.cssTodoInput.cssTodoItem.css,利用 flexbox、grid 等布局技巧,设置字体、颜色、按钮样式,如让按钮悬停变色、输入框聚焦有边框特效等,提升整体美观度与交互性。

五、总结与拓展

通过以上步骤,一个基础的 React 待办事项列表就诞生了。不过,还能继续拓展,像添加任务优先级标记、设置截止日期提醒、本地存储持久化数据等功能。React 强大的组件生态与灵活的状态管理,为我们后续迭代升级提供了无限可能,鼓励大家不断探索,优化这个日常小助手。