第二十五章 案例TodoList 之删除数据

本小节,我们来实现列表的删除按钮的功能,点击删除按钮,弹出一个弹出是否删除的弹窗,点击确定删除,点击取消就不删除。

因为我们之前已经写过祖孙组件的通信了我们直接写代码:

  • 1、在App组件里面定义一个删除数据的函数
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) => {
    const { todos } = this.state
    const newTodo = [todoObj, ...todos]
    this.setState({todos:newTodo})
  }

  // 更新状态数据
  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})
  }

  // 删除状态数据
  deleteTodo = (id) => {
    const { todos } = this.state
    const newTodos = todos.filter((todo)=>{
      return todo.id !== id
    })
    this.setState({todos: newTodos})
  }

  render() {
    const { todos } = this.state
    return (
      <div className="todo-container">
      <div className="todo-wrap">
        <Header addTodo={this.addTodo}/>
        <List todos={todos} updateTodo={this.updateTodo} deleteTodo={this.deleteTodo}/>
        <Footer/>
      </div>
    </div>
    )
  }
}

这里我们是通过id来过滤数组的,把我们要删除的任务项给过滤掉。

  • 2、在List组件里面接收该属性,并做好props限制
export default class List extends Component {
  // 对props做类型和必要性的限制
  static propTypes = {
    updateTodo: PropTypes.func.isRequired,
    todos: PropTypes.array.isRequired,
    deleteTodo: PropTypes.func.isRequired
  }

  render() {
    const {todos,updateTodo,deleteTodo } = this.props
    return (
      <ul className="todo-main">
        {
          todos.map(todo=>{
            return <Item key={todo.id} {...todo} updateTodo={updateTodo} deleteTodo={deleteTodo} />
          })
        }
      </ul>
    )
  }
}
  • 3、在Item组件里面给删除按钮添加点击事件
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)
  }

  // 删除任务项
  deleteHandle = (id) => {
    if(window.confirm('确定删除该任务吗?')) {
      this.props.deleteTodo(id)
    }
  }

  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 onClick={()=>this.deleteHandle(id)} className="btn btn-danger" style={{display:mouseIn?"block":"none"}}>删除</button>
      </li>
    )
  }
}
  • 最后看看效果

在这里插入图片描述


至此我们就实现对Todolist的删除功能。

  • 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、付费专栏及课程。

余额充值