React入门 - 06(TodoList 列表数据的新增和删除)

本章内容

目录

      • 一、实践一下 React 的列表渲染
      • 二、TodoList 新增功能
      • 三、列表循环的 key
      • 四、删除

上一节内容我们完成了输入框中可以自由输入内容,这一节我们继续 TodoList功能的完善:列表数据的新增和删除。

在开始之前,我们先介绍一下 React 如何渲染数组数据到界面上。打开官网,在这里明确告诉我们列表的渲染可以使用数组的 map或者 filter方法
在这里插入图片描述

一、实践一下 React 的列表渲染

1、首先打开 TodoList.js文件, state 状态中初始化一个 list数组,用于放置列表数据,我们可以里面填充一些数据,使用 React的列表渲染来渲染这些数据到页面。

import React, { Component, Fragment } from "react";class TodoList extends Component{constructor(props) {super(props) // ES6 的语法this.state = {inputValue: '', list: ['React 入门-01', 'React 入门-02', 'React 入门-03'] // 1、定义一个list ,用于放置列表数据}}render() {return (<Fragment><div><input value={this.state.inputValue} onChange={this.changeInputValue.bind(this)} /><button> 提交 </button></div>{/* 2、使用map 方法进行渲染数据 */}<ul>{this.state.list.map((item, index) => {return (<li> {item} </li>)})}</ul></Fragment>)}changeInputValue(e) {console.log(e.target.value)this.setState({inputValue: e.target.value})}
}export default TodoList

2、运行项目,打开浏览器观察页面,可以看到数据已经成功渲染
在这里插入图片描述

二、TodoList 新增功能

上面我们已经知道怎么去渲染一个数组列表了。接下来我们继续完善 TodoList功能:输入框输入内容后,点击提交,数据添加至列表

1、首先我们给 ”提交“ 按钮绑定点击事件,定义事件方法为 addListData
2、addListData方法里将 inputValue数据推到 list数组中,同时清空 inputValue的数据,让输入框清空。注意的是,在 React中数据的更新需要使用 setState方法
3、然后通过 map方法 将数据渲染到界面里
4、运行界面,发现新增功能已经实现。

import React, { Component, Fragment } from "react";class TodoList extends Component{constructor(props) {super(props) // ES6 的语法this.state = {inputValue: '', list: [] // 1、定义一个list 的空数组}}render() {return (<Fragment><div><input value={this.state.inputValue} onChange={this.changeInputValue.bind(this)} />{/* 2、按钮绑定点击事件 */}<button onClick={this.addListData.bind(this)}> 提交 </button></div>{/* 3、使用map 方法进行渲染数据 */}<ul>{this.state.list.map((item, index) => {return (<li> {item} </li>)})}</ul></Fragment>)}// 4、按钮点击事件中,将 inputValue 的值推到 list 数组中。addListData() {// 5、注意数据的更新还是使用 React 的 setState 方法this.setState({list: [...this.state.list, this.state.inputValue]})this.setState({inputValue: ''})}changeInputValue(e) {console.log(e.target.value)this.setState({inputValue: e.target.value})}
}export default TodoList

三、列表循环的 key

  • 上面我们似乎已经将功能完美实现了,可是打开控制台,你会发现如下图的错误警告。它提示我们: 在 React中,进行列表的循环渲染时,需要给渲染的每一项添加一个 key作为其唯一标识。

  • 我们根据提示修改一下代码,给列表的每一项都增加一个key,再运行就会发现错误警告已经消失了

  • 至于为什么需要添加 key以及这个 key的作用是什么,我们后面的章节中会进行介绍,现在请忽略它
    在这里插入图片描述

import React, { Component, Fragment } from "react";class TodoList extends Component{constructor(props) {super(props) // ES6 的语法this.state = {inputValue: '', list: [] // 1、定义一个list 的空数组}}render() {return (<Fragment><div><input value={this.state.inputValue} onChange={this.changeInputValue.bind(this)} />{/* 2、按钮绑定点击事件 */}<button onClick={this.addListData.bind(this)}> 提交 </button></div>{/* 3、使用map 方法进行渲染数据 */}<ul>{this.state.list.map((item, index) => {{/* 4、使用map 方法进行渲染数据 */}return (<li key={index}> {item} </li>)})}</ul></Fragment>)}// 4、按钮点击事件中,将 inputValue 的值推到 list 数组中。addListData() {// 5、注意数据的更新还是使用 React 的 setState 方法this.setState({list: [...this.state.list, this.state.inputValue]})this.setState({inputValue: ''})}changeInputValue(e) {console.log(e.target.value)this.setState({inputValue: e.target.value})}
}export default TodoList

四、删除

上面我们完成了 TodoList的新增功能。现在我们进行删除功能:点击列表的每一项,数据进行删除

1、首先我们给列表的每一项绑定一个点击事件, 事件方法为 deleteData,将循环的 index 传递给 deleteData方法

2、在 deleteData方法中,删除 list数组中的对应数据.注意在删除之前,需要对数据 list数据进行拷贝,否则会破坏原数组数据,出现数据错乱的现象

3、运行界面,进行操作,可以发现功能已经完美实现。

import React, { Component, Fragment } from "react";class TodoList extends Component{constructor(props) {super(props) // ES6 的语法this.state = {inputValue: '', list: [] // 1、定义一个list 的空数组}}render() {return (<Fragment><div><input value={this.state.inputValue} onChange={this.changeInputValue.bind(this)} /><button onClick={this.addListData.bind(this)}> 提交 </button></div><ul>{this.state.list.map((item, index) => {// 2、给 li 元素绑定点击事件return (<li key={index} onClick={(this.deleteData.bind(this,index))}> {item} </li>)})}</ul></Fragment>)}// 3、列表项的点击事件, 接收循环下标 indexdeleteData(index) {// 4、先拷贝一份 list 数据.注意如果直接修改 state 里 list 数据,会出现数据错乱问题const list = [...this.state.list]// 5、使用 splice 把数据剔除出去list.splice(index, 1)// 6、使用 setState 方法更新数据this.setState({list: list})}addListData() {this.setState({list: [...this.state.list, this.state.inputValue]})this.setState({inputValue: ''})}changeInputValue(e) {this.setState({inputValue: e.target.value})}
}export default TodoList

到此,本章内容结束!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 145. 二叉树的后序遍历

145. 二叉树的后序遍历 给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[3,2,1]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&…

YOLOv8-Seg改进:轻量化改进 | MobileNetV3,轻量级骨架首选

🚀🚀🚀本文改进:MobileNetV3的创新点包括:使用自适应瓶颈宽度、借鉴SENet中的Squeeze-and-Excitation机制、引入h-swish激活函数等。 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1)手把手教…

Jmeter+ant+jenkins持续集成

一、环境准备 1、 jdk环境 要求JDK1.8以上&#xff0c;命令行输入&#xff1a;java -version&#xff0c;出现如下提示说明安装成功。 2、 Jmeter环境 下载Jmeter最新版本&#xff0c;解压即可&#xff0c;添加bin目录到环境变量。 3、 Ant环境 设置ant环境变量&#xff0…

报错解决方法——http404(Spring MVC)

一.检查静态资源是否加载成功 成功的标志就是在项目跑起来之后再target文件夹中的classes文件夹中可以找到自己写的配置文件。 1.查看resources文件夹是否被识别为资源文件夹 如图所示&#xff0c;文件夹图标右下角有三条杠代表被识别为资源文件 2.在pox.xml文件中插入如下…

生信技能33 - gnomAD数据库hg19/hg38 VCF文件批量下载脚本

gnomAD数据库下载地址 gnomAD downloads gnomAD v2.1.1数据集包含来自125,748个外显子组和15,708个全基因组的数据,所有这些数据都映射到GRCh 37/hg 19和GRCh 38/hg 38 两个版本的参考序列。 gnomAD数据库hg19与hg39 VCF文件批量下载脚本 download.sh # 获取当前目录路径…

本地部署 big-AGI

本地部署 big-AGI 1. big-AGI 介绍2. Github 地址3. 本地部署 big-AGI4. 访问 big-AGI5. 配置 API key6. 测试一下 1. big-AGI 介绍 欢迎使用 big-AGI &#x1f44b;&#xff0c;这是一款面向需要功能、形式、简单性和速度的专业人士的 GPT 应用程序。 big-AGI 由 10 个供应商…

UML期末复习(带习题,选择题,判断题)(持续更新)

UML期末复习 UML简介UML模型图的构成UML事物UML包含4种事物&#xff1a;构件事物&#xff1a; UML模型的静态部分&#xff0c;描述概念或物理元素行为事物&#xff1a;UML模型图的动态部分&#xff0c;描述跨越空间和时间的行为分组事物&#xff1a; UML模型图的组织部分&#…

[Kubernetes]8. K8s使用Helm部署mysql集群(主从数据库集群)

上一节讲解了K8s包管理工具Helm、使用Helm部署mongodb集群(主从数据库集群),这里来看看K8s使用Helm部署mysql集群(主从数据库集群) 一.Helm 搭建mysql集群 1.安装mysql不使用persistence(无本地存储) 无本地存储:当重启的时候,数据库消失 (1).打开官网的应用中心 打开应用中…

Vue组件

一&#xff1a;组件化开发基础 1.组件是什么&#xff1f;有什么用&#xff1f; 组件就是&#xff1a;扩展 HTML 元素&#xff0c;封装可重用的代码&#xff0c;目的是复用 例如&#xff1a;有一个轮播图&#xff0c;可以在很多页面中使用&#xff0c;一个轮播有js&#xff0c;…

中年危机与自我成长职业女性的心理转型之路

中年危机与自我成长&#xff1a;职业女性的心理转型之路 案例&#xff1a;李女士&#xff0c;45岁&#xff0c;职业女性 李女士是一位职业女性&#xff0c;人到中年&#xff0c;她突然感到自己的生活仿佛失去了方向。她来找我咨询&#xff0c;希望能够找到一条心理转型的道路&a…

【OpenCV学习笔记07】- 【彩蛋】实现轨迹条控制画笔颜色和笔刷半径,并可以正常绘画

彩蛋 实现轨迹条控制画笔颜色和笔刷半径&#xff0c;并可以正常绘画。 直接上彩蛋代码 示例代码&#xff1a; # 彩蛋&#xff0c;创建一个可以调节颜色和笔刷半径的轨迹栏&#xff0c;并且可以通过鼠标进行绘画 import numpy as np import cv2 as cv# 定义全局变量 # 如果 …

DRF-源码解析-1.2-CBV流程(视图函数执行流程)

在DRF中&#xff0c;所有drf的操作都是在路由匹配完成后&#xff0c;即视图函数执行前和执行后做文章的。 一、代码准备 演示的视图&#xff1a; class TestAPIView(APIView):def get(self,request)return Respponse({code:200,msg:测试通过}) 演示的路由&#xff1a; path…