第二十三章 案例TodoList之数据更新

本小节,我们要实现点击复选框,修改任务项的实时状态,但是Item组件和App组件是祖孙关系,不是父子关系,我们还能使用props进行通信吗?答案是可以的。

在App组件定义一个更新的函数并传递给Item组件

  • 1、定义一个更新状态数据的函数
 // 更新状态数据
  updateTodo = () => {
    const { todos } = this.state
    console.log(todos)
  }
  • 2、先传递给List组件
 render() {
    const {todos,updateTodo} = this.props
    return (
      <ul className="todo-main">
        {
          todos.map(todo=>{
            return <Item key={todo.id} {...todo} updateTodo={updateTodo}/>
          })
        }
      </ul>
    )
  }
  • 3、在Item组件定义一个onChange事件的回调
import React, { Component } from 'react'
import "./index.css"
export default class Item extends Component {

  // 初始化状态数据
  state = {mouseIn:false}

  // 鼠标移入移出回调函数 
  mouseHandle = (flag) => {
    this.setState({mouseIn:flag})
  }

  // 更新任务项状态
  checkHandle = (id,event) => {
    this.props.updateTodo(id,event.target.checked)
  }

  render() {
    const {id,name,done} = this.props
    const {mouseIn} = this.state
    return (
      <li onMouseEnter={()=>this.mouseHandle(true)} onMouseLeave={()=>this.mouseHandle(false)}  style={{backgroundColor: mouseIn?'gainsboro':''}}>
            <label>
              <input type="checkbox" defaultChecked={done} onChange={event=>this.checkHandle(id,event)}/>
              <span>{name}</span>
            </label>
            <button className="btn btn-danger" style={{display:mouseIn?"block":"none"}}>删除</button>
      </li>
    )
  }
}

我们给复选框绑定了一个onChange的回调函数checkHandle(id,event)并把idevent作为参数。当我们点击复选框的时候,我们将参数传递给updateTodo函数,让其修改App组件的状态数据。

  • 4、改造updateTodo函数
 // 更新状态数据
  updateTodo = (id,done) => {
    const { todos } = this.state
    const newTodos = todos.map(todoObj=>{
      if (id === todoObj.id) return {...todoObj,done}
      return todoObj
    })
    this.setState({todos:newTodos})
  }

这里我们判断如果id值与列表里面的id值匹配,我们就更新done值的状态,否则不做改变,原样返回。

  • 5、具体效果

在这里插入图片描述

我们可以从图中看到,当我们点击列表的复选框,修改了任务项的状态时,react开发者工具里面的state值也会实时变化,至此,说明我们已经完成数据的实时更新。


小总结

  • 获取复选框的状态值使用:event.target.checked
  • 祖孙组件之间的通信也可以使用props进行传递。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,TodoList是一种常见的待办事项管理工具,可以帮助人们记录和管理日常生活和工作中需要完成的任务。以下是一个简单的TodoList案例,您可以了解一下: 假设您正在开发一个简单的TodoList应用。该应用需要实现以下功能: 1. 用户可以添加新的待办事项,包括任务名称、截止日期和优先级。 2. 用户可以查看所有待办事项的列表,并根据截止日期和优先级进行排序。 3. 用户可以编辑和删除待办事项。 4. 用户可以标记已完成的任务。 下面是一个使用Python和Flask框架实现上述功能的简单示例代码: ```python from flask import Flask, render_template, request, redirect, url_for import datetime app = Flask(__name__) # 初始任务列表 tasks = [ { 'name': '购买牛奶', 'due_date': datetime.date(2021, 9, 30), 'priority': '高', 'completed': False }, { 'name': '发送邮件', 'due_date': datetime.date(2021, 10, 1), 'priority': '中', 'completed': False } ] # 首页 @app.route('/') def index(): return render_template('index.html', tasks=tasks) # 添加新任务 @app.route('/add_task', methods=['POST']) def add_task(): name = request.form['name'] due_date = datetime.datetime.strptime(request.form['due_date'], '%Y-%m-%d').date() priority = request.form['priority'] task = { 'name': name, 'due_date': due_date, 'priority': priority, 'completed': False } tasks.append(task) return redirect(url_for('index')) # 删除任务 @app.route('/delete_task/<int:task_index>') def delete_task(task_index): tasks.pop(task_index) return redirect(url_for('index')) # 标记任务完成 @app.route('/complete_task/<int:task_index>') def complete_task(task_index): tasks[task_index]['completed'] = True return redirect(url_for('index')) if __name__ == '__main__': app.run() ``` 在上述示例代码中,我们使用了Python的datetime模块来处理日期,使用了Flask框架来实现Web应用程序的相关功能。当用户添加、删除或标记已完成的任务时,使用了重定向来返回到主页。当然,这只是一个简单的TodoList案例,您可以根据自己的需求对其进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天界程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值