React 实现一个简单的待办事项列表 | 青训营

81 阅读5分钟

#青训营笔记创作活动下面是一个简单的使用React实现待办事项列表的示例代码。在这个示例中,我会展示如何创建一个具有添加、编辑和删除功能的基本待办事项列表应用。

首先,你需要创建一个React应用并安装所需的依赖项。如果你还没有设置好React应用,可以使用以下命令创建一个新的React应用:

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

然后,进入你的项目文件夹并在src文件夹中创建以下文件:

  1. src/components/TodoItem.js - 待办事项组件
import React, { useState } from 'react';

const TodoItem = ({ todo, index, editTodo, deleteTodo }) => {
  const [isEditing, setIsEditing] = useState(false);
  const [updatedText, setUpdatedText] = useState(todo.text);

  const handleEdit = () => {
    if (isEditing && updatedText.trim() !== '') {
      editTodo(index, updatedText);
    }
    setIsEditing(!isEditing);
  };

  const handleDelete = () => {
    deleteTodo(index);
  };

  return (
    <div className="todo-item">
      {isEditing ? (
        <input
          type="text"
          value={updatedText}
          onChange={(e) => setUpdatedText(e.target.value)}
        />
      ) : (
        <span>{todo.text}</span>
      )}
      <button onClick={handleEdit}>{isEditing ? 'Save' : 'Edit'}</button>
      <button onClick={handleDelete}>Delete</button>
    </div>
  );
};

export default TodoItem;
  1. src/components/TodoList.js - 待办事项列表组件
import React from 'react';
import TodoItem from './TodoItem';

const TodoList = ({ todos, editTodo, deleteTodo }) => {
  return (
    <div className="todo-list">
      {todos.map((todo, index) => (
        <TodoItem
          key={index}
          todo={todo}
          index={index}
          editTodo={editTodo}
          deleteTodo={deleteTodo}
        />
      ))}
    </div>
  );
};

export default TodoList;
  1. src/App.js - 主应用组件
import React, { useState } from 'react';
import './App.css';
import TodoList from './components/TodoList';

function App() {
  const [todos, setTodos] = useState([]);
  const [newTodo, setNewTodo] = useState('');

  const addTodo = () => {
    if (newTodo.trim() !== '') {
      setTodos([...todos, { text: newTodo }]);
      setNewTodo('');
    }
  };

  const editTodo = (index, newText) => {
    const updatedTodos = [...todos];
    updatedTodos[index].text = newText;
    setTodos(updatedTodos);
  };

  const deleteTodo = (index) => {
    const updatedTodos = todos.filter((_, i) => i !== index);
    setTodos(updatedTodos);
  };

  return (
    <div className="app">
      <h1>Todo List</h1>
      <input
        type="text"
        value={newTodo}
        onChange={(e) => setNewTodo(e.target.value)}
      />
      <button onClick={addTodo}>Add</button>
      <TodoList todos={todos} editTodo={editTodo} deleteTodo={deleteTodo} />
    </div>
  );
}

export default App;
  1. src/App.css - 样式文件(可根据需要自定义样式)

完成上述步骤后,运行应用:

npm start

这将启动一个开发服务器,你可以在浏览器中查看并测试待办事项列表应用。你可以在输入框中添加新的待办事项,编辑已有的事项并保存,以及删除事项。

  1. 首先,我们创建了一个TodoItem.js组件,用于渲染单个待办事项条目。在这个组件中,我们使用了React的useState钩子来管理状态。每个待办事项有一个"编辑"按钮和一个"删除"按钮。

  2. TodoList.js组件中,我们接收一个todos数组,表示待办事项列表。我们使用map函数遍历每个待办事项,并将它们渲染为TodoItem组件的实例。我们将editTododeleteTodo函数作为属性传递给TodoItem组件,以便在编辑或删除操作时触发。

  3. 在主应用组件App.js中,我们使用useState定义了两个状态:todosnewTodotodos状态是一个数组,用于存储待办事项对象,每个对象包含一个text字段表示事项内容。newTodo状态用于存储用户在输入框中输入的新待办事项文本。

  4. addTodo函数用于将新待办事项添加到列表中。当用户点击"Add"按钮时,如果输入的新事项文本不为空,我们将新的待办事项对象添加到现有的todos数组中,并将newTodo状态重置为空。

  5. editTodo函数接收待办事项的索引和新的文本内容,用于编辑指定索引的待办事项。我们首先创建一个副本updatedTodos来更新待办事项列表中的内容,然后将修改后的内容保存回todos状态。

  6. deleteTodo函数接收待办事项的索引,用于从列表中删除指定索引的事项。我们使用filter函数来创建一个新的待办事项数组,该数组不包含要删除的事项。

  7. 在渲染部分,我们展示一个标题、一个输入框、一个"Add"按钮和一个TodoList组件实例,用于展示待办事项列表。用户可以在输入框中输入新的待办事项,点击"Add"按钮添加到列表中。TodoList组件将接收的待办事项数组作为属性,并将其渲染为一系列TodoItem组件。

以下是实现待办事项列表应用的核心原理:

  1. 组件化开发:React 将用户界面拆分为独立的组件,每个组件都有自己的状态和行为。在待办事项列表应用中,你可以将整个应用拆分为多个组件,例如输入框组件、待办事项组件、待办事项列表组件等。

  2. 状态管理:React 组件可以拥有自己的状态(state),这些状态可以随着时间的推移而变化。在待办事项列表中,你可以使用状态来存储待办事项的数组以及用户在输入框中输入的新待办事项。

  3. 渲染与更新:React 使用虚拟 DOM(Virtual DOM)来管理页面上的元素,以提高性能。当状态发生变化时,React 会自动更新虚拟 DOM,并将变化的部分重新渲染到实际 DOM 中,从而实现页面的更新。

  4. 事件处理:React 使用事件处理函数来响应用户的操作。在待办事项列表应用中,你可以通过事件处理函数来捕获用户的点击、输入等操作,并根据操作更新状态。

  5. 单向数据流:React 的数据流是单向的,即从父组件向子组件传递数据。子组件无法直接修改父组件的数据,而是通过回调函数将数据的修改请求传递给父组件,父组件再决定是否更新状态。

  6. 组件传递属性:通过属性(props)将数据从一个组件传递到另一个组件。在待办事项列表中,你可以将待办事项数据传递给列表组件,使其能够渲染每个待办事项。

  7. 生命周期方法:在类组件中,React 提供了生命周期方法,用于在组件不同阶段执行特定的操作。例如,componentDidMount 可以在组件挂载到页面后执行初始化操作。

总之,React 基于这些原理使得构建交互式用户界面变得更加容易和可维护。在实现待办事项列表应用时,你会涉及到组件的创建、状态管理、事件处理、数据传递等核心概念。