如何使用 ReactJS 创建 ToDo 应用?


创建 ToDo 应用是开始学习 ReactJS 的最佳方法。在本文中,我们将了解如何使用 React 构建一个简单的 ToDo 应用。该项目将涵盖 React 的关键概念,例如组件状态管理属性事件处理

待办事项列表的功能

ToDo 应用将允许用户。

  • 添加新的任务。
  • 将任务标记为已完成。
  • 从列表中删除任务。

为了更好地管理,我们将应用程序分解成小的可重用组件,并使用 React 的useState钩子来管理状态。

先决条件

首先,您必须在系统中安装 Node.js 和 npm。然后,使用以下命令创建一个新的 React 项目。

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

项目结构

以下是 ToDo 应用的基本项目结构。


创建组件

如您在项目结构中所见,我们创建了一个目录和 3 个组件文件,这些文件将导出到 App.js 文件。

TodoForm.js

TodoForm 组件包含一个带有输入字段和提交按钮的表单。提交表单时,将调用 App.js 中的 addTask 函数,并传入任务文本。

import React, { useState } from 'react';

function TodoForm({ addTask }) {
  const [task, setTask] = useState('');

  const handleSubmit = (e) => {
    e.preventDefault();
    if (task.trim()) {
      addTask(task);
      setTask('');
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        type="text"
        placeholder="Add a task..."
        value={task}
        onChange={(e) => setTask(e.target.value)}
      />
      <button type="submit">Add Task</button>
    </form>
  );
}

export default TodoForm;

TodoItem.js

此组件表示每个单独的任务,并提供标记为已完成和删除的选项。在 TodoItem.js 中,单击任务会通过调用 completeTask 函数来切换其完成状态。

import React from 'react';

function TodoItem({ task, completeTask, deleteTask }) {
  return (
    <div className={`task ${task.completed ? 'completed' : ''}`}>
      <span onClick={() => completeTask(task.id)}>{task.text}</span>
      <button onClick={() => deleteTask(task.id)}>Delete</button>
    </div>
  );
}

export default TodoItem;

TodoList.js

TodoItem.js 中的删除按钮通过调用 deleteTask 函数来删除任务。此组件遍历任务列表,并使用 TodoItem 显示每个任务。

import React from 'react';
import TodoItem from './TodoItem';

function TodoList({ tasks, completeTask, deleteTask }) {
  return (
    <div>
      {tasks.map((task) => (
        <TodoItem
          key={task.id}
          task={task}
          completeTask={completeTask}
          deleteTask={deleteTask}
        />
      ))}
    </div>
  );
}

export default TodoList;

App.js

将所有内容整合在一起的主要组件。它管理任务的状态。

import React, { useState } from 'react';
import TodoForm from './components/TodoForm';
import TodoList from './components/TodoList';
import './App.css';

function App() {
  const [tasks, setTasks] = useState([]);

  const addTask = (taskText) => {
    const newTask = { id: Date.now(), text: taskText, completed: false };
    setTasks([...tasks, newTask]);
  };

  const completeTask = (id) => {
    setTasks(
      tasks.map((task) =>
        task.id === id ? { ...task, completed: !task.completed } : task
      )
    );
  };

  const deleteTask = (id) => {
    setTasks(tasks.filter((task) => task.id !== id));
  };

  return (
    <div className="App">
      <h1>ToDo App</h1>
      <TodoForm addTask={addTask} />
      <TodoList tasks={tasks} completeTask={completeTask} 
            deleteTask={deleteTask} />
    </div>
  );
}

export default App;

App.css

添加一些基本样式以使应用程序更具吸引力。

.App {
  text-align: center;
  max-width: 500px;
  margin: auto;
}

form {
  display: flex;
  justify-content: space-between;
  margin-bottom: 20px;
}

input {
  width: 80%;
  padding: 10px;
  font-size: 16px;
}

button {
  padding: 10px;
  font-size: 16px;
}

.task {
  display: flex;
  justify-content: space-between;
  padding: 10px;
  border-bottom: 1px solid #ccc;
}

.task.completed span {
  text-decoration: line-through;
}

button {
  background-color: #40a944;
  border: none;
  border-radius: 3px;
  color: white;
  cursor: pointer;
}

button:hover {
  opacity: 0.8;
}

输出

因此,我们的待办事项列表可以使用了,如您所见,我们可以添加任务,将任务标记为已完成,并在任何时候我们想要删除它时删除它。

更新于: 2024年8月28日

42 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告