React 入门:实战案例 TodoList 添加一条 Todo 到列表
创始人
2024-03-23 07:17:52
0

文章目录

  • 实现思路
  • 实现步骤
    • 第一步:App 组件中定义添加 Todo 的组件方法
    • 第二步:App 组件通过 props 传递添加 Todo 的方法到子组件 Header
    • 第三步:Header 组件接收并使用 props 传入的添加 Todo 方法
  • 完整代码
    • App 组件完整代码
    • Header 组件完整代码

本文实现添加一条 Todo,并显示到 TodoList 列表中。

实现思路

通过父子组件之间通信,使用 props 从父组件把一个函数传递到子组件中,然后子组件通过调用父组件传递进来的函数以参数的形式把子组件的数据传递给父组件。

实现步骤

第一步:App 组件中定义添加 Todo 的组件方法

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

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

第二步:App 组件通过 props 传递添加 Todo 的方法到子组件 Header

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

// src/App.js
this.addTodo} />

第三步:Header 组件接收并使用 props 传入的添加 Todo 方法

在 Header 组件中,通过触发 input 的 onKeyUp 事件,获取输入框的值,
然后通过调用 props 传进来的 addTodo 方法并将输入框的值作为参数传递到 App 组件中,
App 组件接收参数,并更新状态 state ,从而使得 List 数据列表的更新。

代码片段如下:

// src/components/Header/index.jsx// 给 input 绑定 onKeyUp 事件
this.handleKeyUp}type="text"placeholder="请输入你的任务名称,按回车键确认"
/>;// 定义 onKeyUp 事件的处理函数
handleKeyUp = (event) => {// 解构赋值获取 keyCode, targetconst { keyCode, target } = event;// 判断是否是回车按键if (keyCode !== 13) return;// 添加的任务名称不能为空if (target.value.trim() === "") {alert("任务名称不能为空");return;}// 构建一个 Todo 对象const todoObj = { id: nanoid(), name: target.value, done: false };// 将 todoObj 传递给 App 组件this.props.addTodo(todoObj);// 清空输入target.value = "";
};

至此,完成了添加一条 Todo 到 TodoList 列表。

完整代码

App 组件完整代码

// file: src/App.jsimport 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) => {// 获取原 TodoListconst { todoList } = this.state;// 追加一条 Todoconst newTodoList = [todoObj, ...todoList];// 更新状态this.setState({ todoList: newTodoList });};render() {const { todoList } = this.state;return (
this.addTodo} />todoList} />
);} }

Header 组件完整代码

// file: src/components/Header/index.jsximport React, { Component } from "react";
import { nanoid } from "nanoid";
import "./index.css";export default class Header extends Component {handleKeyUp = (event) => {// 解构赋值获取 keyCode, targetconst { keyCode, target } = event;// 判断是否是回车按键if (keyCode !== 13) return;// 添加的任务名称不能为空if (target.value.trim() === "") {alert("任务名称不能为空");return;}// 构建一个 Todo 对象const todoObj = { id: nanoid(), name: target.value, done: false };// 将 todoObj 传递给 App 组件this.props.addTodo(todoObj);// 清空输入target.value = "";};render() {return (
this.handleKeyUp}type="text"placeholder="请输入你的任务名称,按回车键确认"/>
);} }

扩展
Header 组件中引入了一个扩展 nanoid 用来生成一个唯一的 id 字符串,来作为 Todo 记录的唯一标识。
安装命令:yarn add nanoid 或者 npm install nanoid

至此完成添加一条 Todo 记录到 TodoList 列表。

相关内容

热门资讯

原创 吉... 12月26日,欣旺达公告自家子公司欣旺达动力被吉利旗下的威睿电动汽车告了,索赔金额高达23.14亿元...
无惧苹果起诉,爆料人再发iPh... IT之家 12 月 27 日消息,据科技媒体 Phone Arena 昨天报道,在今年 7 月被苹果...
因电芯质量问题索赔23.14亿... 齐鲁晚报·齐鲁壹点 郭辰昊 12月26日,欣旺达发布公告称,子公司欣旺达动力于2025年12月25日...
民族团结进步促进法草案等重要法... 原标题:三部重要法律案将提请2026年全国人代会审议 十四届全国人大常委会第十九次会议12月27日表...
改革开放再深化,激活制度创新“... 改革开放再深化,激活制度创新“关键一招” ——聚焦省委经济工作会议④ 刚刚结束的省委经济工作会议提出...
“理论+百姓+文艺” 北京城市... “从城市绿心的生态蝶变到社区服务的温度升级,党的二十届四中全会精神正悄然融入城市副中心市民的日常生活...
咖啡因风波中的霸王茶姬,“将对... 因为产品咖啡因含量问题,现制茶饮品牌霸王茶姬(NASDAQ.CHA)再次登上热搜。 12月26日,霸...
丰田UA80八速变速箱存设计缺... 据汽车媒体CarScoops,丰田近期遭遇两起集体诉讼,核心指控其广泛使用的UA80八速自动变速箱存...
搭建温暖桥梁:湖南芙蓉律师事务... 这个冬天,湖南芙蓉律师事务所想搭一座“温暖桥梁”——发起“橙”意满满助农公益捐赠活动,计划捐赠20万...