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

简介: 第二十六章 案例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:查看效果

image.png

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

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

  • 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、查看效果

image.png

为什么没有效果呢?难道是我代码写的有问题?检查了一下,代码确实有问题,但是不是这里的问题,而是在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)}/>

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

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

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

  • 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、查看效果

image.png

由图可知该功能已完成。

查看完整功能

image.png

小总结

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

defaultChecked和checked是React中用于处理表单元素的两个属性。它们之间的区别在于:

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

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

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


相关文章
|
数据可视化 定位技术 API
百度地图开发:海量点、测距以及定位聚合功能
百度地图开发:海量点、测距以及定位聚合功能
464 0
|
7月前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——常见问题总结
本文总结了Spring Boot中使用事务的常见问题,虽然通过`@Transactional`注解可以轻松实现事务管理,但在实际项目中仍有许多潜在坑点。文章详细分析了三个典型问题:1) 异常未被捕获导致事务未回滚,需明确指定`rollbackFor`属性;2) 异常被try-catch“吃掉”,应避免在事务方法中直接处理异常;3) 事务范围与锁范围不一致引发并发问题,建议调整锁策略以覆盖事务范围。这些问题看似简单,但一旦发生,排查难度较大,因此开发时需格外留意。最后,文章提供了课程源代码下载地址,供读者实践参考。
147 0
|
11月前
|
存储 弹性计算 缓存
阿里云服务器通用型g8i实例性能与使用场景介绍及最新收费标准参考
阿里云ECS通用型g8i服务器采用阿里云全新CIPU架构,可提供稳定的算力输出、更强劲的I/O引擎以及芯片级的安全加固。ECS通用型g8i实例支持开启或关闭超线程配置,单台g8i实例最高支持100万IOPS。阿里云ECS通用型g8i实例CPU采用Intel®Xeon®Emerald Rapids或者Intel®Xeon®Sapphire Rapids,主频不低于2.7 GHz,全核睿频3.2GHz。本文为大家介绍通用型g8i实例性能与使用场景介绍及最新收费标准,以供参考。
|
12月前
|
SQL 数据库管理 索引
SQL语句查询教师表:高效构建与技巧分享
在数据库管理中,查询操作是最基础也是最重要的功能之一
|
数据采集 数据库 Python
为什么基于 Django 和 Scrapy 的项目需要 @sync_to_async 装饰器
通过使用 @sync_to_async 装饰器,我们可以在 Scrapy 的异步环境中高效地调用同步的 Django ORM 操作。这样可以避免阻塞事件循环,充分利用 Scrapy 的异步 I/O 优势,从而提升爬虫的性能和并发处理能力。在构建基于 Django 和 Scrapy 的项目时,理解并正确使用 @sync_to_async 是非常重要的,这将帮助你构建高效、健壮的应用程序。
|
网络协议
技术笔记:modbus通讯协议详解
技术笔记:modbus通讯协议详解
689 0
|
存储 缓存 安全
产品服务技术架构
产品服务技术架构
287 6
|
前端开发 搜索推荐 UED
单页面应用(SPA)与多页面应用(MPA)的区别及优缺点
单页面应用(SPA)与多页面应用(MPA)的区别及优缺点
356 1
|
存储 监控 安全
日志服务SLS:为数据安全保驾护航
日志服务SLS:为数据安全保驾护航 在数字化时代,数据安全成为企业关注的焦点。阿里云日志服务SLS(Log Service)通过密钥管理服务KMS(Key Management Service)对数据进行加密存储,提供数据静态保护能力。同时,SLS支持基于SSL/TLS的HTTPS加密传输,有效防止数据在云端的潜在安全风险。
318 7
|
数据采集 人工智能 自然语言处理
重磅!IDC、钉钉联合发布 2024 AIGC 应用层十大趋势
重磅!IDC、钉钉联合发布 2024 AIGC 应用层十大趋势
414 1