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

65 阅读3分钟

项目结构拆分

graph TD
待办事项主组件 --> 输入提交新的待办事项
待办事项主组件 --> 待办事项列表 --> 显示单个事项组件

创建项目

npx create-react-app 项目名字
cd 项目名字
npm start

文件结构

src/
├── components/
│   ├── TodoApp.js
│   ├── TodoList.js
│   ├── TodoItem.js
│   └── TodoInput.js
└── App.js
└── App.css

输入提交待办事项

功能分析:

  • 维护待办事项列表状态 todos
  • 维护当前正在编辑的待办事项的索引 editingIndex
  • 包含了新增、编辑和删除待办事项的逻辑。
  • 渲染待办事项的输入框和列表。
image.png
  • todos 是存储所有待办事项的数组,使用 useState 进行状态管理。

  • editingIndex 用于跟踪当前正在编辑的待办事项索引,null 表示没有编辑状态。

事件处理

新增与编辑

image.png
  • 如果 editingIndexnull,表示新增待办事项,将新的待办事项添加到 todos 中。

  • 如果 editingIndex 不为 null,表示编辑待办事项,根据索引更新相应的待办事项文本。

设置待办事项的编辑状态

image.png

editingIndex 设为要编辑的索引

删除

image.png

显示待办事项的单个组件

功能分析:

接收四个 props:todoindexonEditonDelete

  • todo 是当前待办事项的对象(包含 text 属性)。
  • index 是当前待办事项的索引。
  • onEdit 是点击编辑按钮时触发的回调函数。
  • onDelete 是点击删除按钮时触发的回调函数。

image.png

编辑按钮:点击后调用 onEdit,并传递当前待办事项的索引。

删除按钮:点击后调用 onDelete,删除当前索引的待办事项。

显示待办事项列表

功能分析:

接收三个 props:todosonEditonDelete

  • todos 是包含所有待办事项的数组。
  • onEditonDelete 是父组件传递的回调函数,用于编辑和删除待办事项。
image.png

通过 todos.map 迭代待办事项数组,为每个待办事项渲染一个 TodoItem 组件。

传递 todoindexonEditonDelete 给每个 TodoItem,使其能够控制自身的编辑和删除功能。

运行

npm start

image.png

代码优化

原始版本编写完进行测试,代码出现以下问题:

  • 文本溢出组件
  • 文本溢出导致按钮也溢出
  • 修改文本溢出后按钮形式改变

首先,要把这两块分成两个部分,确保两个分离,然后保留按钮大小,文本内容根据剩余大小进行分布

1.flex布局

2.justify-content: space-between将文本与按钮左右分布

3.文本样式flex-grow: 1;,文本占据剩余空间

4.允许换行,以及允许长单词换行

5.text-align: left; display: block;确保换行后文本左对齐,强制文本块级显示,使左对齐样式生效。

6.要确保组件分布的宽度足够,并且还有最大宽度的设置

7.文本内容的最大宽度要计算max-width: calc(100% - 130px);,不能影响按钮分布

总结

React 状态管理

useState:使用 useState Hook 来管理待办事项的列表、输入框的内容等状态。当用户添加、删除或编辑待办事项时,React 会根据 state 自动更新 UI。

事件处理

事件绑定:React 的事件处理与 DOM 的事件处理非常相似。通过在元素上添加事件监听器(如 onClick),可以将用户的操作(如点击按钮)与相应的函数绑定。

样式和用户体验

样式方面,应用了现代的设计风格,如使用渐变背景、圆角按钮、悬停效果等。按钮的状态(如悬停时的颜色变化)也通过 CSS 的 transition 实现了平滑过渡。

使用盒阴影(box-shadow)和边框(border)增加元素的层次感和交互效果,使页面看起来更具视觉吸引力。

调试和优化

开发环境下的调试:可以在浏览器开发者工具中查看 console.log 输出,检查组件的状态变化和事件处理是否正常工作。

性能优化:对于较大的待办事项列表,可以使用 React.memouseCallback 来优化渲染性能,避免不必要的组件重新渲染。