React 入门学习(六)-- TodoList 案例

简介: React 入门学习(六)-- TodoList 案例

image.png

大家好,我是小丞同学,一名准大二的前端爱好者


这篇文章是学习 React 练习中 TodoList 案例的操作笔记


非常感谢你的阅读,不对的地方欢迎指正


愿你忠于自己,热爱生活


引言

TodoList 案例在前端学习中挺重要的,从原生 JavaScript 的增删查改,到现在 React 的组件通信,都是一个不错的案例,这篇文章主要记录,还原一下通过 React 实现 TodoList 的全过程

1.png

一、拆分组件

首先第一步需要做的是将这个页面拆分成几个组件

首先顶部的输入框,可以完成添加项目的功能,可以拆分成一个 Header 组件

中间部分可以实现一个渲染列表的功能,可以拆分成一个 List 组件

在这部分里面,每一个待办事项都可以拆分成一个 Item 组件

最后底部显示当前完成状态的部分,可以拆分成一个 Footer 组件

2.png

在拆分完组件后,我们下一步要做的就是去实现这些组件的静态效果

二、实现静态组件

首先,我们可以先写好这个页面的静态页面,然后再分离组件,所以这就要求我们

以后写静态页面的时候,一定要有明确的规范

1.打好注释

2.每个部分的 CSS 要写在一个地方,不要随意写

3.命名一定要规范

4.CSS 选择器不要关联太多层级

5.在写 HTML 时就要划分好布局

这样有利于我们分离组件

首先,我们在 src 目录下,新建一个 Components 文件夹,用于存放我们的组件,然后在文件夹下,新建 Header 、Item、List 、Footer 组件文件夹,再创建其下的 index.jsx,index.css 文件,用于创建对应组件及其样式文件

todolist
├─ package.json
├─ public
│  ├─ favicon.ico
│  └─ index.html
├─ src
│  ├─ App.css
│  ├─ App.jsx
│  ├─ Components
│  │  ├─ Footer
│  │  │  ├─ index.css
│  │  │  └─ index.jsx
│  │  ├─ Header
│  │  │  ├─ index.css
│  │  │  └─ index.jsx
│  │  ├─ item
│  │  │  ├─ index.css
│  │  │  └─ index.jsx
│  │  └─ List
│  │     ├─ index.css
│  │     └─ index.jsx
│  └─ index.js
└─ yarn.lock

最终目录结构如上


然后我们将每个组件,对应的 HTML 结构 CV 到对应组件的 index.jsx 文件中 return 出来,再将 CSS 样式添加到 index.css 文件中


记得,在 index.jsx 中一定要引入 index.css 文件


实现了静态组件后,我们需要添加事件等,来实现动态组件


三、实现动态组件

1. 动态展示列表

我们目前实现的列表项是固定的,我们需要它通过状态来维护,而不是通过组件标签来维护


首先我们知道,父子之间传递参数,可以通过 state 和 props 实现


我们通过在父组件也就是 App.jsx 中设置状态

3.png

再将它传递给对应的渲染组件 List

const { todos } = this.state
<List todos={todos}/>

这样在 List 组件中就能通过 props 来获取到 todos

我们通过解构取出 todos

const { todos, updateTodo } = this.props

再通过 map 遍历渲染 Item 数量

{
  todos.map(todo => {
    return <Item key={todo.id} {...todo}/>
  })
}

同时由于我们的数据渲染最终是在 Item 组件中完成的,所以我们需要将数据传递给 Item 组件

这里有两个注意点

1.关于 key 的作用在 diff 算法的文章中已经有讲过了,需要满足唯一性

2.这里采用了简写形式 {...todo} ,这使得代码更加简洁,它代表的意思是

id = {todo.id} name = {todo.name} done = {todo.done}

在 Item 组件中取出 props 即可使用

const { id, name, done } = this.props

这样我们更改 APP.jsx 文件中的 state 就能驱动着 Item 组件的更新,如图

4.gif

同时这里需要注意的是


对于复选框的选中状态,这里采用的是 defaultChecked = {done},相比于 checked 属性,这个设定的是默认值,能够更改


2. 添加事项功能

首先我们需要在 Header 组件中,绑定键盘事件,判断按下的是否为回车,如果为回车,则将当前输入框中的内容传递给 APP 组件


因为,在目前的学习知识中,Header 组件和渲染组件 List 属于兄弟组件,没有办法进行直接的数据传递,因此可以将数据传递给 APP 再由 APP 转发给 List。

// Header/index.jsx
handleKeyUp = (event) => {
  // 结构赋值获取 keyCode,target
  const { keyCode, target } = event
  // 判断是不是回车
  if (keyCode !== 13) return
  if(target.value.trim() === '') {
    alert('输入不能为空')
  }
  // 准备一个todo对象
  const todoObj = { id: nanoid(), name: target.value, done: false }
  // 传递给app
  this.props.addTodo(todoObj)
  // 清空
  target.value = ''
}

我们在 App.jsx 中添加了事件 addTodo ,这样可以将 Header 组件传递的参数,维护到 App 的状态中

// App.jsx
addTodo = (todoObj) => {
  const { todos } = this.state
  // 追加一个 todo
  const newTodos = [todoObj, ...todos]
  this.setState({ todos: newTodos })
}

在这小部分中,需要我们注意的是,我们新建的 todo 对象,一定要保证它的 id 的唯一性

这里采用的 nanoid 库,这个库的每一次调用都会返回一个唯一的值

npm i nanoid

安装这个库,然后引入

通过 nanoid() 即可生成唯一值0234bbb90e9e1a0ba6dacc65c1bf24de.gif

3. 实现鼠标悬浮效果

接下来我们需要实现每个 Item 中的小功能

首先是鼠标移入时的变色效果

我的逻辑是,通过一个状态来维护是否鼠标移入,比如用一个 mouse 变量,值给 false 当鼠标移入时,重新设定状态为 true 当鼠标移出时设为 false ,然后我们只需要在 style 中用mouse 去设定样式即可

下面我们来代码实现

在 Item 组件中,先设定状态9.gif

9. 删除已完成

给删除按钮添加一个点击事件,回调中调用 App 中添加的删除已完成的函数,全都一个套路

强烈建议这个自己打

首先在 Footer 组件中调用传来的函数,在 App 中定义函数,过滤掉 done 为 true 的,再更新状态即可

// App.jsx
clearAllDone = () => {
  const { todos } = this.state
  const newTodos = todos.filter((todoObj) => {
    return todoObj.done !== true
  })
  this.setState({ todos: newTodos })
}

10.gif

总结

1.注意:className、style 写法

2.父组件给子组件传递数据,采用 props

3.子组件给父组件传递数据,通过 props,同时提前给子组件传递一个函数

4.注意 defaultChecked 和 checked 的区别

5.一定要自己敲一下,好好理解数据传递

相关文章
|
4月前
|
前端开发 JavaScript 编译器
React编程新手入门实践教程
本书深入解析React核心思想与设计哲学,涵盖组件化思维、虚拟DOM原理及JSX本质,探讨函数组件与类组件特性,详解状态管理、生命周期控制及事件处理机制,帮助开发者掌握高效构建用户界面的技巧。
119 0
|
8月前
|
缓存 前端开发 JavaScript
学习React的最佳实践有哪些?
学习React的最佳实践有哪些?
288 86
|
前端开发 JavaScript
学习react基础(3)_setState、state、jsx、使用ref的几种形式
本文探讨了React中this.setState和this.state的区别,以及React的核心概念,包括核心库的使用、JSX语法、类与函数组件的区别、事件处理和ref的使用。
183 3
学习react基础(3)_setState、state、jsx、使用ref的几种形式
|
前端开发 JavaScript
React学习之——条件渲染
【10月更文挑战第16天】React 中没有像Vue中v-if这种指令。React 中的条件渲染和 JavaScript 中的一样,使用 JavaScript 运算符 if 或者条件运算符去创建元素来表现当前的状态,然后让 React 根据它们来更新 UI。
|
8月前
|
Web App开发 移动开发 前端开发
React音频播放器样式自定义全解析:从入门到避坑指南
在React中使用HTML5原生&lt;audio&gt;标签时,开发者常面临视觉一致性缺失、样式定制局限和交互体验割裂等问题。通过隐藏原生控件并构建自定义UI层,可以实现完全可控的播放器视觉风格,避免状态不同步等典型问题。结合事件监听、进度条拖拽、浏览器兼容性处理及性能优化技巧,可构建高性能、可维护的音频组件,满足跨平台需求。建议优先使用成熟音频库(如react-player),仅在深度定制需求时采用原生方案。
281 12
|
8月前
|
前端开发 JavaScript API
如何快速学习React?
如何快速学习React?
215 1
|
12月前
|
前端开发 JavaScript 定位技术
React 地图组件 Mapbox 入门指南
Mapbox 是一个强大的地图平台,提供丰富的地图数据和工具,支持多种开发语言和框架。本文介绍如何在 React 项目中使用 Mapbox,涵盖基础概念、安装配置、基本用法、常见问题及解决方法、高级用法等内容,并通过代码示例详细说明,帮助开发者提升地图应用的开发效率和用户体验。
604 2
|
12月前
|
前端开发 API UED
React 图片轮播 Carousel:从入门到进阶
本文介绍了在 React 中实现图片轮播(Carousel)的方法,从基础安装和配置 `react-slick` 开始,逐步讲解了常见问题如图片路径、性能优化、自定义样式和交互处理,以及高级话题如动态数据加载和响应式设计。通过详细示例,帮助开发者避免易错点,提升轮播图的用户体验。
288 3
|
监控 前端开发 JavaScript
React 静态网站生成工具 Next.js 入门指南
【10月更文挑战第20天】Next.js 是一个基于 React 的服务器端渲染框架,由 Vercel 开发。本文从基础概念出发,逐步探讨 Next.js 的常见问题、易错点及解决方法,并通过具体代码示例进行说明,帮助开发者快速构建高性能的 Web 应用。
552 10
|
前端开发 JavaScript 安全
学习如何为 React 组件编写测试:
学习如何为 React 组件编写测试:
140 2