第二十六章 案例TodoList 之实现Footer组件

本小节,我们来实现最后的Footer组件的功能,它的功能主要有:

  • 记录已完成全部的任务列表数量
  • 点击【复选框】可以实现全选全不选
  • 点击【删除已完成】按钮,可以将选中的任务项删除掉

实现已完成和全部的任务列表数量

步骤1:在App组件将todos的状态通过props传递给Footer组件

 <Footer todos={todos} />

步骤2:Footer组件接收数据并计算长度

export default class Footer extends Component {
  render() {
    const {todos} = this.props
    // 计算列表的长度
    const len = todos.length
    // 计算已完成的列表长度
    const doneLen = todos.reduce((pre,cur)=>{
      return pre + (cur.done ? 1:0)
    },0)
    
    return (
      <div className="todo-footer">
      <label>
        <input type="checkbox"/>
      </label>
      <span>
        <span>已完成{doneLen}</span> / 全部{len}
      </span>
      <button className="btn btn-danger">清除已完成任务</button>
    </div>
    )
  }
}

步骤3:查看效果

在这里插入图片描述

可以看到我们选中和取消选中时,已完成和全部的长度变化,和我们期望的一样。


实现【复选框】可以实现全选和全不选

  • 1、在App组件里面编写函数逻辑,并传递函数给Footer组件
  // 实现全选和全不选
  selectAllData = (done) => {
    console.log(done)
    const {todos} = this.state
    const newTodos = todos.map(todo=>{
      return {...todo,done}
    })
    this.setState({todos:newTodos})
  }
<Footer todos={todos} selectAllData={this.selectAllData} />
  • 2、给props添加限制
  // 对props做类型和必要性的限制
  static propTypes = {
    selectAllData:PropTypes.func.isRequired,
  }
  • 3、给Footer组件的复选框添加属性和事件回调
  // 全选和全不选的事件回调
  checkAllHandle = (event) => {
    this.props.selectAllData(event.target.checked)
  }
 <input type="checkbox" checked={len === doneLen && len!==0 ? true:false} onChange={this.checkAllHandle} />
  • 4、查看效果

在这里插入图片描述

为什么没有效果呢?难道是我代码写的有问题?检查了一下,代码确实有问题,但是不是这里的问题,而是在Item组件里面的复选框的defaultChecked属性的问题。我们改为checked属性就好。

<input type="checkbox" defaultChecked={done} onChange={event=>this.checkHandle(id,event)}/>

===>

<input type="checkbox" checked={done} onChange={event=>this.checkHandle(id,event)}/>

修改好后,我们再看效果:

在这里插入图片描述

我们看到已经可以全选和全不选了。


实现【删除已完成】按钮,可以将选中的任务项删除掉

  • 1、在App组件里面编写好删除已完成的列表数据的函数代码逻辑,并传递给Footer组件
  // 删除已完成的任务项
  deleteDoneData = () => {
    const {todos} = this.state
    const newTodos = todos.filter(todo=>{
      return !todo.done
    })
    this.setState({todos:newTodos})
  }
 <Footer todos={todos} selectAllData={this.selectAllData} deleteDoneData={this.deleteDoneData} />
  • 2、给props添加限制
  // 对props做类型和必要性的限制
  static propTypes = {
    selectAllData:PropTypes.func.isRequired,
    deleteDoneData:PropTypes.func.isRequired
  }
  • 3、给【删除已完成】按钮添加点击事件回调函数
// 删除已完成的任务项
  deleteDoneHandle = () => {
    this.props.deleteDoneData()
  }
<button onClick={this.deleteDoneHandle} className="btn btn-danger">清除已完成任务</button>
  • 4、查看效果

在这里插入图片描述

由图可知该功能已完成。


查看完整功能

在这里插入图片描述


小总结

  • 熟悉数组函数reduce/map/filter...
  • 了解react中的defaultCheckedchecked属性的区别

defaultCheckedcheckedReact中用于处理表单元素的两个属性。它们之间的区别在于:

defaultChecked是用于设置表单元素的默认选中状态的属性。当组件首次渲染时,如果没有传递checked属性,则会使用defaultChecked属性来设置表单元素的选中状态。如果传递了checked属性,则defaultChecked属性将被忽略。

checked是用于设置表单元素的选中状态的属性。当组件渲染时,如果传递了checked属性,则会使用该属性来设置表单元素的选中状态。如果没有传递checked属性,则会使用defaultChecked属性来设置表单元素的选中状态。

简单的说: defaultChecked属性 用于设置复选框的 默认选中状态,而 checked属性 用于设置复选框的 当前选中状态。当复选框的选中状态发生变化时,我们使用onChange事件处理程序来更新组件的状态 。checked属性要配合onChange事件处理一起使用,不然react会报错。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OJ刷题 第十二篇

21308 - 特殊的三角形 时间限制 : 1 秒 内存限制 : 128 MB 有这样一种特殊的N阶的三角形&#xff0c;当N等于3和4时&#xff0c;矩阵如下&#xff1a; 请输出当为N时的三角形。 输入 输入有多组数据&#xff0c;每行输入一个正整数N&#xff0c;1<N<100 输出 按照给出…

【技巧】如何修改PDF文件?

PDF文件格式安全、标准化&#xff0c;很多人在工作中几乎离不开。可有些小伙伴想要修改PDF文件内容时&#xff0c;发现无法修改&#xff0c;那是什么情况呢&#xff1f;如何才能修改PDF文件呢&#xff1f;下面小编就来分享一些小技巧。 技巧一&#xff1a;使用PDF编辑器 如果使…

美国肝素钠专用树脂,医药肝素钠提取工艺专用树脂

具有控制孔径的大孔强碱性Ⅰ型阴离子交换树脂 Tulsimer A-72 MP 是一款具有便于颜色和有机物去除的控制孔径的&#xff0c;专门开发的大孔强碱性Ⅰ型阴离子交换树脂。 Tulsimer A-72 MP专门应用于去除COD以及其他有机物等。 Tulsimer A-72 MP 由于其本身的大孔特性而显示出…

差分运算放大电路原理解析

差分运算放大电路&#xff0c;对共模信号得到有效抑制&#xff0c;而只对差分信号进行放大&#xff0c;因而得到广泛的用。 注&#xff1a; &#xff08;1&#xff09;共模信号   共模信号&#xff08;common mode signal&#xff09;是指同时作用于多个电路或电子设备上的信…

Spring

目录 &#x1f43c;今日良言:道阻且长,行则将至 &#x1f407;一、Spring介绍 &#x1f407;二、Spring创建和使用 &#x1f407;三、Spring读取和存储对象 &#x1f407;四、Bean作用域和生命周期 &#x1f43c;今日良言:道阻且长,行则将至 &#x1f407;一、Spring介绍…

IEEE旗下SCI审稿流程及状态详细解读 (附科协高质量IEEE期刊目录)~

能够成功发表一篇IEEE旗下SCI论文 (尤其是TRANS系列) 是很多电气电子工程、计算机及通信领域科研工作者的梦想。很多学者初次投稿IEEE后&#xff0c;会不停登录投稿系统查看状态&#xff0c;其实不必如此心急&#xff0c;只需掌握几个重要的时间节点&#xff0c;定期登录系统查…

一文详解Spring事务传播机制

目录 背景 Spring事务 Transactional注解 使用场景 失效场景 原理 事务传播机制 处理嵌套事务流程 主事务为REQUIRED子事务为REQUIRED 主事务为REQUIRED子事务为REQUIRES_NEW 主事务为REQUIRED子事务为NESTED 实现方式 源码解析 背景 我们在使用Spring管理数据库…

项目结束倒数2

今天,解决了,多个点的最短路问题 用的dfs,配上了floyed计算出的广源距离 难点是要记录路线,dfs记录路线就很烦 但是好在结束了,经过无数的测试,确保没啥问题(应该把) 来看看我的代码 void dfs(int b[], int x, int* sum, int last, int sums, int a[], BFS& s, Floyd_A…

零基础搭建私人影音媒体平台【远程访问Jellyfin播放器】

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 1. 前言 2. Jellyfin服务网站搭建 2.1. Jellyfin下载和安装 2.2. Jellyfin网页测试 3.本地网页发布 3.1 cpolar的安装和注册 3.2 Cpolar云端设置 3.3 Cpolar本地设置 4.…

springboot+RateLimiter+AOP自定义注解限流

springbootRateLimiterAOP自定义注解限流 RateLimiter简介springboot集成RateLimiterpom.xml引入RateLimiter常用api代码实现自定义注解Limiter限流切面验证 RateLimiter简介 RateLimiter是Guava库中的一个限流器&#xff0c;它提供如下功能&#xff1a; (1)基于PPS进行限流 (…

ext-1:PDK工具包编译出例程

1、TI的单独StarterWare不更新后&#xff0c;后续维护和更新的是 PROCESSOR-SDK-AM335X 软件开发套件 &#xff08;PDK&#xff09;&#xff0c;对比以前的&#xff0c;里面没有例程&#xff0c;所以下载安装完需要自己编译出example例程。 因为编译出example例程中间会出现很…

深元边缘计算盒子在社区的应用,提高社区的安全性和生活质量

近年来&#xff0c;随着人工智能技术的不断发展和普及&#xff0c;越来越多的社区开始应用边缘计算盒子AI视觉分析技术&#xff0c;以提高社区的安全性和管理效率。本文将介绍边缘计算盒子AI视觉分析技术在社区中的应用及其优势。 一、边缘计算盒子AI视觉在社区中的应用 1.安防…

C++类的模拟实现

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容讲解了简单模拟实现string类 C类的模拟实现 文章目录 C类的…

centos7部署FastDFS服务

一、安装需要的相关依赖 yum -y install make cmake gcc gcc-c 因为我的服务器已经安装了gcc&#xff0c;所以略去 使用gcc -v查看版本 yum -y install zip unzip 安装性能事件通知库 yum -y install libevent 安装nginx依赖 yum -y install libevent yum -y install zli…

OSCP-Fail(rsync、fail2ban提权)

目录 扫描 rsync 提权 扫描 rsync 基于nmap,确信将进一步研究rsync。 为此,将使用netcat使用的rsync枚举。 使用netcat,我们可以列出rsync托管的当前共享。 我们看到“fox”和“fox home

大数据管理中心规划设计方案(ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 统一汇聚 推动业务数据协同5 价值提炼 支撑精准服务与科学管理6 实时感知 辅助城市治理高效运行7 大数据资源平台目标体系规划11 建设目标与思路12 使能高效协同&#xff0…

PLM听过很多遍,却依旧不知道是什么?看完这篇你就懂

上周参加展会&#xff0c;很多客户在现场了解到e企拆图解决方案后&#xff0c;向我们咨询了很多问题&#xff0c;发现有几个名词经常被提及&#xff0c;比如PLM、PDM、BOM等。随着技术的爆炸发展&#xff0c;新的名词概念也与日俱增&#xff0c;对于这些名词&#xff0c;可能我…

Sa-Token源码简单阅读

一.权限登录模块包括几个基本子模块&#xff1a; 1.登录。 实现方式大致为&#xff1a;先检验用户名密码是否正确&#xff0c;如正确则在缓存中存入用户信息&#xff08;一般必须要有用户标识和访问token&#xff0c;或再加一些附加信息如用户的角色权限&#xff09;&#xf…

【unity细节】—(Can‘t add script)脚本文件无法拖拽到对象的问题

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;unity细节和bug ⭐关于脚本文件无法拖拽到对象的问题⭐ 文章目录 ⭐关于脚本文件无法拖拽到对象的…

不得不说的结构型模式-装饰器模式

目录 装饰器模式是什么 下面是装饰器模式的一个通用的类图&#xff1a; 以下是使用C实现装饰器模式的示例代码&#xff1a; 下面是面试中关于桥接器模式的常见的问题&#xff1a; 下面是问题的答案&#xff1a; 装饰器模式是什么 装饰器模式是一种结构型设计模式&#xff…