React 入门:实战案例 TodoList 删除一条 Item

news2024/11/29 6:27:55

文章目录

  • 目标实现效果
  • 实现思路
  • 实现步骤
    • 第一步:App 组件中定义删除 Todo 的组件方法
    • 第二步:App 组件通过 props 传递删除 Todo 的方法到子组件 List
    • 第三步:List 组件接收删除 Todo 的方法,并传递给 Item 子组件
    • 第四步:Item 组件接收并使用 props 传入的删除 Todo 方法
  • 完整代码
    • App 组件完整代码
    • List 组件完整代码
    • Item 组件完整代码

前面我们已经实现了当鼠标悬浮在某条 Todo Item 上时,显示删除按钮,那么本文实现点击删除按钮时,从 TodoList 列表中删除一条 Todo 记录。

目标实现效果

在这里插入图片描述

实现思路

有了前面章节的基础和经验,实现删除功能就应该轻车熟路了。

还是通过父子组件之间通信,使用 props 从父组件把一个删除 Todo 的方法传递到子组件中,然后子组件通过调用父组件传递进来的删除方法,并把相关数据通过参数传递给父组件。

实现步骤

第一步:App 组件中定义删除 Todo 的组件方法

在 App 组件中定义一个 deleteTodo 的组件方法,用来删除一条 Todo 记录,代码片段如下:

// src/App.js

// 用于删除一条 Todo
deleteTodo = (id) => {
  // 获取原来的 todoList
  const { todoList } = this.state;
  // 删除指定 id 的 todo 对象
  const newTodoList = todoList.filter((todoObj) => {
    return todoObj.id !== id;
  });
  // 更新状态
  this.setState({ todoList: newTodoList });
};

代码解析: 通过数据 ES6 高级数据函数 filter 实现从 TodoList 数组中删除指定的元素。

第二步:App 组件通过 props 传递删除 Todo 的方法到子组件 List

通过 propsdeleteTodo 传递到 List 组件中,代码片段如下:

// src/App.js

<List
  todoList={todoList}
  updateTodo={this.updateTodo}
  deleteTodo={this.deleteTodo}
/>

第三步:List 组件接收删除 Todo 的方法,并传递给 Item 子组件

List 组件通过 props 将接收到的 deleteTodo 方法传递到 Item 组件中

代码片段如下:

// src/components/List/index.jsx

// 从 props 接收删除 Todo 的方法 deleteTodo
const { todoList, updateTodo, deleteTodo } = this.props;

// 将 deleteTodo 方法传递给 Item 组件
<Item
  key={todo.id}
  {...todo}
  updateTodo={updateTodo}
  deleteTodo={deleteTodo}
/>;

第四步:Item 组件接收并使用 props 传入的删除 Todo 方法

在 Item 组件中,在删除按钮 button 的 onClick 事件的回调方法内调用 props 传进来的 deleteTodo 方法并将要删除的 Todo 的记录 id 值作为参数传递到 App 组件中,
App 组件接收参数,并更新状态 state ,从而使得 List 数据列表的更新。

代码片段如下:

// src/components/Item/index.jsx

// 给 button 绑定 onClick 事件
<button
  onClick={() => this.handleDelete(id)}
  className="btn btn-danger btn-sm"
  style={{ display: mouse ? "block" : "none" }}
>
  删除
</button>;

// 点击删除按钮的回到
handleDelete = (id) => {
  if (window.confirm("确定删除吗?")) {
    this.props.deleteTodo(id);
  }
};

注意: confirm 前需要添加 window,否则会报错。

至此,完成了从 TodoList 列表中删除一条 Todo。

完整代码

App 组件完整代码

// file: src/App.js

// 创建“外壳”组件

import React, { Component } from "react";
import Header from "./components/Header";
import List from "./components/List";
import Footer from "./components/Footer";
import "./App.css";

export default class App extends Component {
  // 总结:状态在哪里,操作状态的方法就在哪里。

  // 初始化状态
  state = {
    todoList: [
      { id: 1, name: "参加晨会", done: true },
      { id: 2, name: "A功能开发", done: true },
      { id: 3, name: "B功能开发", done: false },
    ],
  };

  /**
   * addTodo 用于添加一条 Todo 记录,接收的参数是 Todo 对象
   */
  addTodo = (todoObj) => {
    // 获取原 TodoList
    const { todoList } = this.state;
    // 追加一条 Todo
    const newTodoList = [todoObj, ...todoList];
    // 更新状态
    this.setState({ todoList: newTodoList });
  };

  // 用于更新一个 Todo 对象
  updateTodo = (id, done) => {
    // 获取状态的中 todoList
    const { todoList } = this.state;
    // 匹配处理数据
    const newTodoList = todoList.map((todoObj) => {
      if (todoObj.id === id) return { ...todoObj, done };
      else return todoObj;
    });
    // 更新状态
    this.setState({ todoList: newTodoList });
  };

  // 用于删除一条 Todo
  deleteTodo = (id) => {
    // 获取原来的 todoList
    const { todoList } = this.state;
    // 删除指定 id 的 todo 对象
    const newTodoList = todoList.filter((todoObj) => {
      return todoObj.id !== id;
    });
    // 更新状态
    this.setState({ todoList: newTodoList });
  };

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

List 组件完整代码

// file: src/components/List/index.jsx

import React, { Component } from "react";
import PropTypes from "prop-types";
import Item from "../Item";
import "./index.css";

export default class List extends Component {
  // 对接收的 props 进行:类型、必要性的限制
  static propTypes = {
    todoList: PropTypes.array.isRequired,
    updateTodo: PropTypes.func.isRequired,
    deleteTodo: PropTypes.func.isRequired,
  };

  render() {
    const { todoList, updateTodo, deleteTodo } = this.props;
    return (
      <ul className="todo-main">
        {todoList.map((todo) => {
          return (
            <Item
              key={todo.id}
              {...todo}
              updateTodo={updateTodo}
              deleteTodo={deleteTodo}
            />
          );
        })}
      </ul>
    );
  }
}

Item 组件完整代码

// file: src/components/Item/index.jsx

import React, { Component } from "react";
import PropTypes from "prop-types";
import "./index.css";

export default class Item extends Component {
  // 对接收的 props 进行:类型、必要性的限制
  static propTypes = {
    id: PropTypes.number.isRequired,
    name: PropTypes.string.isRequired,
    done: PropTypes.bool.isRequired,
    updateTodo: PropTypes.func.isRequired,
    deleteTodo: PropTypes.func.isRequired,
  };

  state = { mouse: false }; //标识鼠标移入、移出

  // 鼠标移入、移出的回调
  handleMouse = (flag) => {
    return () => {
      this.setState({ mouse: flag });
    };
  };

  // 勾选、取消勾选某一个 Todo 的回调
  handleCheck = (id) => {
    return (event) => {
      this.props.updateTodo(id, event.target.checked);
    };
  };

  // 点击删除按钮的回到
  handleDelete = (id) => {
    if (window.confirm("确定删除吗?")) {
      this.props.deleteTodo(id);
    }
  };

  render() {
    const { id, name, done } = this.props;
    const { mouse } = this.state;
    return (
      <li
        style={{ backgroundColor: mouse ? "#eee" : "#fff" }}
        onMouseEnter={this.handleMouse(true)}
        onMouseLeave={this.handleMouse(false)}
      >
        <label className="container">
          <input
            type="checkbox"
            defaultChecked={done}
            onChange={this.handleCheck(id)}
          />
          <span>{name}</span>
        </label>
        <button
          onClick={() => this.handleDelete(id)}
          className="btn btn-danger btn-sm"
          style={{ display: mouse ? "block" : "none" }}
        >
          删除
        </button>
      </li>
    );
  }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA毕业设计——基于Springboot+vue的图书管理系统(源代码+数据库)

github代码地址 https://github.com/ynwynw/bookmanage2-public 毕业设计所有选题地址 https://github.com/ynwynw/allProject 基于Springbootvue的图书管理系统(源代码数据库) 一、系统介绍 本项目分为管理员与普通用户两种角色 体实现功能如下: 用户系统权限控制管理:主要…

热插拔技术--以ADM1177为例说明

综述 ADM1177是一款热插拔控制器&#xff0c;并且还支持电压电流采集&#xff08;12bitADC&#xff09;和传输(IIC).本文着重说明热插拔技术&#xff0c;所以仅说明ADM热插拔处理过程&#xff0c;对于ADC和IIC部分不予说明&#xff0c;请读者自行研究。 热插拔的应用背景 服务…

【GRU回归预测】基于粒子群优化门控循环单元PSO-GRU神经网络实现多输入单输出回归预测附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

SeleniumUI自动化的POM三层架构

目录 1、定义log.py日志 2、在基础封装层初始化类uitls.__init__.py中选择了日志的打印级别, 3、定义页面基础类base_page.py&#xff0c;定义了页面找元素的方法&#xff0c; 4、将百度页面的元素以代码形式保存&#xff0c;baidu.py 5、重新封装浏览器方法, browser.py …

ChatGPT版微信个人号搭建流程

[TOC] 参考链接&#xff1a; github仓库 准备服务器 进入腾讯云服务器官网&#xff0c;搜索“轻量应用服务器”立即选购 注意&#xff0c;地区要选海外&#xff0c;镜像选Docker镜像 购买之后&#xff0c;就进入控制台 然后登陆到shell 安装部署 查看一下docker&#xff0…

【探索Spring底层】11.切点匹配

文章目录1. 前言2. 给一个类中的其中一个方法增强3. 根据注解给方法增强4. Spring中Transactional的底层实现1. 前言 这里主要讲述一些切点匹配的相关例子&#xff0c;其主要是关于切点表达式匹配的实现。 主要有三种例子&#xff1a; 给一个类中的其中一个方法增强根据注解…

Gitee创建自己的仓库并且上传项目

Gitee创建自己的仓库并且上传项目前言在码云上创建仓库上传项目到远程仓库前言 之前用了一段时间的Gitee&#xff08;码云&#xff09;一直想写一篇文章记录下&#xff0c;结果赶上世界杯 被人把苦茶子给抢走了。。。正好这几天筹钱&#xff0c;那就简单记录下。 这里的Git的安…

[附源码]Python计算机毕业设计动漫网站Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

机器人开发--Pepperl+Fuchs倍加福激光雷达系列

机器人开发--PepperlFuchs倍加福激光雷达系列1 介绍2 R2000系列2.1 按键操作2.2 测量方法2.3 协议2.3.1 文档2.3.2 特点2.3.3 控制 HTTP收发报文格式get_protocol_info设置传感器参数list_parameters – list parametersget_parameter – read a parameterset_parameter – cha…

springboot simple (10) springboot protobuf

教程列表&#xff1a; springboot simple&#xff08;0&#xff09; springboot简介 springboot simple&#xff08;1&#xff09; springboot Helloworld springboot simple&#xff08;2&#xff09; springboot Starter springboot simple&#xff08;3 &#xff09;spri…

Flutter Web CORS问题

Flutter Web CORSCORS 相关概念协议请求跨域问题App2WebCodingAppCORS 相关概念 关于 CORS 概念&#xff0c;可参考 mozilla 的相关文档资料&#xff1a; Cross-Origin Resource Sharing (CORS)Reason: CORS header ‘Access-Control-Allow-Origin’ missing An example of …

震撼发布,快鲸企微工单任务管理系统上线了

快鲸推出的企微SCRM系统被大家所熟知&#xff0c;这是一款帮助企业通过企微维护客户的管理系统。在客户管理服务过程中&#xff0c;很多企业需要通过工单来进行事项处理和文件内容流转&#xff0c;为了满足这方面客户的需求&#xff0c;快鲸工单系统也应运而生。 品牌都将客户的…

关于json的集合接收和多表关联查询

文章目录一、json的接收与发送1.postman工具发送格式2.controller接收处理二、查询集合数据1.利用mybatis-plus进行分页处理三.读取数据配置mapper.xml输出结果提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、json的接收与发送 1.postman工具发送格…

selenium之鼠标操作详解

前言 人类频繁的用手操作鼠标和键盘&#xff0c;为了解决这个问题&#xff0c;selenium工具为我们提供了一个类来处理这些事件— Actionchains &#xff0c;该类可以完成鼠标移动&#xff0c;鼠标点击事件、键盘输入、内容菜单交互等交互行为。 1、常见的鼠标操作有&#xff1…

DSPE-Thiol; DSPE-SH; 二硬脂酰磷脂酰乙醇胺改性巯基

名称&#xff1a;DSPE-Thiol DSPE-SH 全称&#xff1a;18:0 PE Thiol 中文名称&#xff1a;二硬脂酰磷脂酰乙醇胺改性巯基 结构式: 外观&#xff1a;白色粉末 溶剂&#xff1a;HCCl3及其他有机溶剂 反应基团&#xff1a;马来酰亚胺&#xff0c;可以跟任何带有马来酰亚胺活…

【计算机毕业设计】html学生管理系统 OA管理系统设计与实现 HTML网页设计结课作业

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

[附源码]Nodejs计算机毕业设计基于JAVA语言的宠物寄养管理Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

Java基于springboot+vue+elementUI城乡精准扶贫信息管理系统

系统设计的主要意义在于&#xff0c;一方面&#xff0c;对于网站来讲&#xff0c;系统上线后可以带来很大的便利性&#xff0c;精准扶贫网站管理属于非常细致的管理模式&#xff0c;要求数据量大&#xff0c;计算机管理可以提高精确性&#xff0c;更为便利的就是信息的查询&…

短信引导用户关注公众号短信唤起小程序h5跳转公众号引导用户关注

背景 想要短信唤起微信并引导用户关注公众号&#xff0c;经过调研这样是做不了的&#xff0c;但是我们发现可以通过短信唤起小程序&#xff0c;那么我们只需要在小程序中内嵌一个h5&#xff0c;用 h5 来引导跳转公众号就好了。 那么我们拆解一下要做的事情&#xff1a; 短信唤…

数字孪生园区创新实验室落地解决方案

园区实验室管理实质上是对园区、人员、实验试剂耗材、仪器等的整体管理。借助数字孪生技术&#xff0c;实现数字化管理&#xff0c;可以大大提高实验室管理者以及科研人员的工作效率。 数字孪生园区创新实验室落地解决方案 北京智汇云舟科技有限公司成立于2012年&#xff0c;专…