第二十六章 案例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会报错。


相关文章
|
10月前
|
人工智能 运维 资源调度
AI 赋能混合云运维:告别手工操作,迈向智能自愈!
AI 赋能混合云运维:告别手工操作,迈向智能自愈!
554 85
|
10月前
|
机器学习/深度学习 自然语言处理 TensorFlow
解锁 AIGC 工具:入门者到高级达人的终极蜕变手册
解锁 AIGC 工具:入门者到高级达人的终极蜕变手册
|
前端开发 UED
深入理解CSS中的文本对齐方式:水平对齐与垂直对齐
深入理解CSS中的文本对齐方式:水平对齐与垂直对齐
975 5
|
XML 小程序 前端开发
小程序制作教程
小程序制作教程
1074 3
小程序制作教程
|
安全 网络安全 数据安全/隐私保护
访问控制列表(ACL)是网络安全管理的重要工具,用于定义和管理网络资源的访问权限。
访问控制列表(ACL)是网络安全管理的重要工具,用于定义和管理网络资源的访问权限。ACL 可应用于路由器、防火墙等设备,通过设定规则控制访问。其类型包括标准、扩展、基于时间和基于用户的ACL,广泛用于企业网络和互联网安全中,以增强安全性、实现精细管理和灵活调整。然而,ACL 也存在管理复杂和可能影响性能的局限性。未来,ACL 将趋向智能化和自动化,与其他安全技术结合,提供更全面的安全保障。
1015 4
|
容器
Vue3回到顶部(BackTop)
这是一个基于 Vue3 的头像组件库,提供了圆形和方形两种头像形状,并支持自定义大小、图片、图标及字符展示。
289 0
Vue3回到顶部(BackTop)
朋友问我Java中“::”是什么意思?我汗流浃背了......
朋友问我Java中“::”是什么意思?我汗流浃背了......
427 0
|
SQL 安全 前端开发
软件测试指南:从策略到实践
【8月更文第21天】软件测试是为了评估软件的质量并验证其是否符合预期的功能要求而进行的一系列活动。本文将详细介绍软件测试的不同阶段、测试类型、测试策略与计划的制定、以及如何有效地管理与跟踪发现的缺陷。
921 1
|
机器学习/深度学习 数据采集 监控
基于机器学习的糖尿病风险预警分析系统
基于机器学习的糖尿病风险预警分析系统
328 1
|
移动开发 JavaScript 前端开发
分享111个JS时钟代码特效,总有一款适合您
分享111个JS时钟代码特效,总有一款适合您
767 0