第二十一章 案例TodoList之新增数据

news2024/9/30 17:34:16

前一小节,我们已经完成了数据的动态展示,现在我们要完成数据的动态添加。如何添加呢?肯定是要通过Header组件来添加,但是Header组件如何将收集的任务数据,交给App组件并更新状态数据呢?

在Header组件中收集任务项数据

import React, { Component } from 'react'
import "./index.css"
export default class Header extends Component {

  // 收集输入的任务项数据
  getTodoData = (event) => {
    console.log(event.target.value)
  }

  render() {
    return (
      <div className="todo-header">
          <input onKeyUp={this.getTodoData} type="text" placeholder="请输入你的任务名称,按回车键确认"/>
      </div>
    )
  }
}

我们在组件的输入框元素上面添加了onKeyUp键盘事件,因为事件发生在元素本身,所以我们不要ref,而是通过事件源拿到输入的数据。

改造1:我们想要在按下enter(回车键)时,才打印我们收集的数据

  // 收集输入的任务项数据
  getTodoData = (event) => {
    const {keyCode,target} = event
    if (keyCode === 13) {
      console.log(target.value,keyCode)
    }   
  }

我们可以在事件身上拿到keyCode 和 target 来确认是否按下回车键,以及收集到的值。但是这里有一个问题:那就是输入框没有值时,按下回车键,也可以打印值,这不是我们想要的。

改造2:空值不处理后续逻辑

  // 收集输入的任务项数据
  getTodoData = (event) => {
    const {keyCode,target} = event
    if (target.value.trim() === '') return;
    if (keyCode === 13) {
      console.log(target.value,keyCode)
    }
  }

当我们判断输入框的值是空值,且按下了回车键,我们直接return不做后续处理。

改造3:将输入的任务名称组装为一个Todo对象

  // 收集输入的任务项数据
  getTodoData = (event) => {
    const {keyCode,target} = event
    if (target.value.trim() === '') return;
    if (keyCode === 13) {
      const newTodoObj = {id:'004',name:target.value,done:false}
      console.log(newTodoObj)
    }
  }

这里我们将拿到的输入值,拼装为一个对象,为后续做准备,但是这里有一个问题,那就是id值是004,这是一个固定值,当然我们只添加一条数据肯定没问题,但是我们肯定不止添加一条数据,因为那就没有意义了。

改造4:将ID值变成唯一标识且不重复

这里我们需要安装nanoid使用这个库我们可以生成不重复的uuid

步骤1:安装依赖

npm i nanoid

步骤2:引入依赖并改造代码

import { nanoid } from 'nanoid'  

// 收集输入的任务项数据
  getTodoData = (event) => {
    const {keyCode,target} = event
    if (target.value.trim() === '') return;
    if (keyCode === 13) {
      const newTodoObj = {id:nanoid(),name:target.value,done:false}
      console.log(newTodoObj)
    }
  }

步骤3:查看效果

 { id: "v1NnCpyHxlh4qrKwlv2W1", name: "45151", done: false }

我们可以看到这里的id已经变成长度为21的字符串了,每次方法nanoid()都会生成一个不重复的且默认长度为21的字符串。


将收集的数据交给App组件

我们如何将收集的数据交给App组件呢?答案还是props。但是这次传的props是一个函数,不是普通的值。

在这里插入图片描述


  • 步骤1:在App组件定义一个函数,并使用props传入Header组件。
import React, { Component } from 'react'
import Header from "./components/Header"
import List from "./components/List"
import Footer from "./components/Footer"
import "./index.css"

export default class App extends Component {
  // 定义列表的初始状态数据
  state = {todos: [
    {id:'001',name:'吃饭',done: true},
    {id:'002',name:'睡觉',done: true},
    {id:'003',name:'写代码',done: false},
  ]}

  // 获取Header组件收集的任务项数据
  addTodo = (todoObj) => {
    console.log(todoObj)
  }

  render() {
    const { todos } = this.state
    return (
      <div className="todo-container">
      <div className="todo-wrap">
        <Header addTodo={this.addTodo}/>
        <List todos={todos}/>
        <Footer/>
      </div>
    </div>
    )
  }
}
  • 步骤2:Header组件通过addTodo函数将组装的对象作为参数进行传递
  // 收集输入的任务项数据
  getTodoData = (event) => {
    const {keyCode,target} = event
    if (target.value.trim() === '') return;
    if (keyCode === 13) {
      const newTodoObj = {id:nanoid(),name:target.value,done:false}
      this.props.addTodo(newTodoObj)
      target.value = '' // 清空输入框
    }
  }
  • 步骤3:更新App组件的状态数据
  // 获取Header组件收集的任务项数据
  addTodo = (todoObj) => {
    const { todos } = this.state
    const newTodo = [todoObj, ...todos]
    this.setState({todos:newTodo})
  }

这里我们拿到旧的状态数据与Header组件收集的数据组装在一起,在使用setState更新状态,由于会重新渲染页面,所以List组件也是拿到的最新的数据。


小总结

本小节主要学习了一下知识:

  • 使用keyCode属性判断回车键
  • 使用nanoid依赖库生成UUID
  • 使用props传递函数,使得父组件拿到子组件的数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/429104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实现vue的条件渲染

我的需求是根据设备不同的状态 渲染不同的标签。设备状态用device_State表示。 在线上面是一个vue的标签&#xff0c;我有一个数据state &#xff0c;如何让这个标签根据数据的取值 &#xff0c;修改内容&#xff0c;如state1时&#xff0c;标签修改为离线 要根据数据的取值动态…

Python曲线拟合详解

文章目录入门参数多元拟合入门 scipy.optimize中&#xff0c;curve_fit函数可调用非线性最小二乘法进行函数拟合&#xff0c;例如&#xff0c;现在有一个高斯函数想要被拟合 yaexp⁡−(x−bc)2y a\exp-(\frac{x-b}{c})^2 yaexp−(cx−b​)2 则调用方法如下 import numpy as…

STM32基础代码学习G070CB串口透传调试(出厂默认)代码

先下载 一定记得回车换行勾选 可以参考“Quectel_BC260Y-CN_AT命令手册_V1.0.pdf” ATCGMI 查询制造商信息 ATCGMM 查询模块型号 ATCSQ 上报信号质量 ATCGATT? PS 域附着或去附着查看板子是否正常 再激活 ATQIACT1&#xff0c;最后查询ATQIACT? 配置阿里云mqtt atqmtc…

【从零开始学Skynet】实战篇《球球大作战》(十三):场景代码设计(下)

1、主循环 《球球大作战》是一款服务端运算的游戏&#xff0c;一般会使用主循环程序结构&#xff0c;让服务端处理战斗逻辑。如下图所示&#xff0c;图中的balls和foods代表服务端的状态&#xff0c;在循环中执行“食物生成”“位置更新”和“碰撞检 测”等功能&#xff0c;从而…

学习笔记 —— C++并行库OpenMP

ContentsInstallationImplement1、一个最简单的OpenMP代码&#xff1a;2、如何规定线程数2、如何设置OpenMP分配线程的schedule3、 冲突避免机制 --Reduction&#xff08;规约&#xff09;Discovery写在最前面&#xff1a; 并行化虽好&#xff0c;但并不是所有任务在并行化后都…

【MySQL学习】MySQL表的操作

目录一、表的创建1.1 创建表的语法1.2 案例二、查看表结构三、查看建表语句四、修改表4.1 修改表的语法4.2 修改案例五、删除表一、表的创建 1.1 创建表的语法 语法&#xff1a; CREATE TABLE table_name (field1 datatype,field2 datatype,field3 datatype ) character set…

透视Android系统AMS、PMS和WMS,了解开发中的重要角色

原理 在Android系统中&#xff0c;AMS&#xff08;Activity Manager Service&#xff09;、PMS&#xff08;PackageManager Service&#xff09;和WMS&#xff08;Window Manager Service&#xff09;是三个重要的系统服务&#xff0c;它们负责管理应用程序的生命周期、处理应…

Backblaze + Cloudflare + Picgo 打造免费顺畅的图床体验

本文xlog地址&#xff1a;https://x.cosine.ren/backblaze-cloudflare-picgo-imgbed hexo 地址&#xff1a;https://ysx.cosine.ren/backblaze-cloudflare-picgo-imgbed 同步发布 最近有用到oss存储的需求&#xff0c;跟群友调研了下国内 & 国外的 oss 后&#xff0c;深感找…

大爽pygame入门教程 第一节 基础知识

作者自我介绍&#xff1a;大爽歌, b站小UP主 &#xff0c;编程1对1辅导老师 本节掌握要点&#xff1a; 文本, 图形, 键鼠事件&#xff0c;动态展示。 一、实现基础窗口 0 - 新建文件 新建001.py文件&#xff0c;内容如下 import pygamepygame.init() # pygame 初始化&#x…

什么是远程桌面连接?如何操作远程桌面?

随着时代越来越信息化、智能化、自动化&#xff0c;越来越多的企业和个人开始使用远程办公软件进行办公。其中远程桌面连接是一种非常流行的办公方式。那么&#xff0c;什么是远程桌面连接?如何操作远程桌面? 一、什么是远程桌面连接? 远程桌面连接是一种远程访问计算机的…

nginx缓冲区关闭导致下载失败问题-方案篇

问题描述 导出操作。小于200k的excel正常下载&#xff0c;大于200K的下载失败&#xff0c;异常信息如下: Cannot forward to error page for request [/xx/xx] as the response has already been committed. As a result,the response may have the wrong status code. If you…

程序员工作久了,都不会好好说人话了...互联网人的....黑话

原来工作也是会被腌入味的 前段时间有位博主吐槽 工作太久都不会说人话了 这张口的互联网味儿 瞬间梦回自己的工位 而评论区的网友们表示 这不就是”世另我“吗 一场关于互联网黑话的"掰头" 就此开始了... 维护厨房 &#xff08;厨房秒变公司&#xff09; 新…

Bagging算法预测银行客户流失率

Bagging算法预测银行客户流失率 描述 为了防止银行的客户流失&#xff0c;通过数据分析&#xff0c;识别并可视化哪些因素导致了客户流失&#xff0c;并通过建立一个预测模型&#xff0c;识别客户是否会流失&#xff0c;流失的概率有多大。以便银行的客户服务部门更加有针对性…

【CSS】使用 CSS 实现三角形 ( 宽高设置为 0 | 设置四个边框宽度 / 样式 / 颜色值 | 兼容低版本浏览器 | 基本示例 | 对话框示例 )

文章目录一、使用 CSS 实现三角形二、使用 CSS 实现三角形代码示例三、使用 CSS 实现 对话框 代码示例一、使用 CSS 实现三角形 使用 CSS 实现三角形步骤 : 首先 , 宽度 / 高度 设置为 0 ; /* 宽高设置为 0 像素 */width: 0;height: 0;然后 , 设置 4 个边框 , 每个边框都要设置…

【软考备战·希赛网每日一练】2023年4月14日

文章目录一、今日成绩二、错题总结第一题第二题第三题第四题三、知识查缺题目及解析来源&#xff1a;2023年04月14日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析&#xff1a; 具有 最优子结构 特点的问题可以使用 动态规划法 进行求解。计算m数组中每项的值&am…

日撸 Java 三百行day28-30

文章目录说明day28-30 Huffman 编码 (节点定义与文件读取)1.建树过程&#xff08;以图为例&#xff09;2.哈夫曼树特点3.分析代码过程3.1 抽象成员变量3.2结合文章梳理思路1.读文本2.解析文本内容&#xff1a;3.建树4.生成哈夫曼编码5.编码6.解码4.其他4.1 java 类型强转4.2 ja…

网络安全相关的知识

一、 什么是IDS&#xff1f; IDS是英文"Intrusion Detection Systems"的缩写&#xff0c;中文意思是"入侵检测系统"。专业上讲就是依照一定的安全策略&#xff0c;通过软、硬件&#xff0c;对网络、系统的运行状况进行监视&#xff0c;尽可能发现各种攻击…

TexMaker(Latex编辑器)软件的“文献引用”操作:Xelatex方式运行的操作方法

一、说明 1. 针对问题 本文主要讲解使用TexMaker进行**.bib的方法**的文献引用时&#xff0c;如何使用Xelatexpdf的方式完成文献引用。某些文章强调使用PDFlatex进行编译&#xff0c;但有时候会因为论文模板不同&#xff0c;无法运行padflatexPDF。所以&#xff0c;这里给出xe…

常用模块和模板引擎

私人博客 许小墨のBlog —— 菜鸡博客直通车 系列文章完整版&#xff0c;配图更多&#xff0c;CSDN博文图片需要手动上传&#xff0c;因此文章配图较少&#xff0c;看不懂的可以去菜鸡博客参考一下配图&#xff01; 系列文章目录 前端系列文章——传送门 后端系列文章——传送…

Android---导致OOM的常见原因

目录 内存溢出OOM 单应用可用的最大内存 导致 OOM 的常见原因 内存实时监控 内存溢出OOM 单应用可用的最大内存 dalvik.vm.heapstartsize&#xff0c;它表示堆分配的初始大小。 dalvik.vm.heapgrowthlimit&#xff0c;它表示单个进程内存限定值。 dalvik.vm.heapsize&#…