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、列表项的点击事件, 接收循环下标 index
  deleteData(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.mfbz.cn/a/319838.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++力扣题目222--完全二叉树的节点个数

给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的节点都集中在该层最左边的若干位置。若最…

目标检测-One Stage-YOLOv7

文章目录 前言一、YOLOv7的不同版本二、YOLOv7的网络结构二、YOLOv7的创新点三、创新点的详细解读ELAN和E-ELANBoF训练技巧计划型重参化卷积辅助训练模块标签分配Lead head guided label assignerCoarse-to-fine lead head guided label assigner 基于级联模型的复合缩放方法 总…

面试官问,如何在十亿级别用户中检查用户名是否存在?

面试官问&#xff0c;如何在十亿级别用户中检查用户名是否存在&#xff1f; 前言 不知道大家有没有留意过&#xff0c;在使用一些app注册的时候&#xff0c;提示你用户名已经被占用了&#xff0c;需要更换一个&#xff0c;这是如何实现的呢&#xff1f;你可能想这不是很简单吗…

java获取已经发送谷歌邮件的打开状态

1.前言 现在网上的方案都是在邮件里面插入一张图片的地址&#xff0c;当收件人打开之后&#xff0c;就会发送请求到指定路径的服务器上&#xff0c;然后在请求的controller里面处理邮件的状态&#xff0c;这个方案确实是行得通的&#xff0c;本文章只是给大家避个坑&#xff0…

从传统训练到预训练和微调的训练策略

目录 前言1 使用基础模型训练手段的传统训练策略1.1 随机初始化为模型提供初始点1.2 目标函数设定是优化性能的关键 2 BERT微调策略: 适应具体任务的精妙调整2.1 利用不同的representation和分类器进行微调2.2 通过fine-tuning适应具体任务 3 T5预训练策略: 统一任务形式以提高…

Vue学习计划-Vue3--核心语法(七)pinia

pinia案例gitee地址 1. pinia 准备一个效果 【搭建 pinia 环境】 安装pinia: npm install pinia/yarn add pinia第二步&#xff1a;操作src/main.ts import { createApp } from vue import App from ./App.vue/* 引入createPinia&#xff0c;用于创建pinia */ import { crea…

阿里云优惠券介绍、种类、领取入口及使用教程

阿里云优惠券是阿里云提供的一种优惠活动&#xff0c;旨在帮助用户节省购买云服务产品的费用。本文将为大家详细介绍阿里云优惠券的相关信息&#xff0c;包括优惠券的介绍、种类、领取入口以及使用教程。 一、阿里云优惠券介绍 阿里云优惠券是阿里云提供给用户的一种优惠凭证&…

vue前端开发自学,异步加载组件,提升用户端的客户体验度

vue前端开发自学,异步加载组件,提升用户端的客户体验度&#xff01;现实项目开发时&#xff0c;组件的数量非常庞大&#xff0c;如果都是一口气加载完&#xff0c;对手机用户来说&#xff0c;体验度会很差。因此&#xff0c;非常有必要使用异步加载。 那就是&#xff0c;用到了…

Neo4j知识图谱(2)创建与删除

Neo4j - CQL简介_w3cschoolhttps://www.w3cschool.cn/neo4j/neo4j_cql_introduction.html一、创建节点 create(n:Person{name:何仙鸟,age:21}) create就是创建&#xff0c;无论是点还是边都是用create来创建 n相当于一个别名&#xff0c;比如创建一个Person&#xff0c;而Pe…

React16源码: React中的schedule调度整体流程

schedule调度的整体流程 React Fiber Scheduler 是 react16 最核心的一部分&#xff0c;这块在 react-reconciler 这个包中这个包的核心是 fiber reconciler&#xff0c;也即是 fiber 结构fiber 的结构帮助我们把react整个树的应用&#xff0c;更新的流程&#xff0c;能够拆成…

JVM基础(10)——老年代调优

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

[ACM算法学习] 诱导排序与 SA-IS算法

学习自诱导排序与SA-IS算法 - riteme.site 为了简化一些操作&#xff0c;定义 # 是字典序最小的字符&#xff0c;其字典序小于字母集里任意字符&#xff0c;并且将其默认作为每个字符串的最后一个字符&#xff0c;即作 S[|S|] SA-IS 算法 SA-IS 算法是基于诱导排序这种思想。…

Python基础知识:整理14 利用pyecharts生成地图

1 地图可视化的基本使用 from pyecharts.charts import Map from pyecharts.options import VisualMapOpts # 准备地图对象 map Map()# 准备数据 data [("北京市", 8), ("上海市", 99), ("广州省", 199), ("重庆市", 400), ("…

JavaScript学习笔记——变量、作用域、var、const和let

JavaScript学习笔记——变量、作用域、var、const和let 学习链接&#xff08;原链接&#xff09;变量变量声明的三种方式 作用域作用域介绍作用域分类全局作用域局部作用域&#xff08;函数作用域&#xff09;块级作用域块级作用域和局部(函数)作用域区别 varvar的作用域(全局函…

在数据中查找峰值

使用 findpeaks 函数求出一组数据中局部最大值的值和位置。 文件 spots_num 包含从 1749 年到 2012 年每年观测到的太阳黑子的平均数量。求出最大值及其出现的年份。将它们与数据一起绘制出来。 load("spots_num")[pks,locs] findpeaks(avSpots);plot(year,avSpots…

ssm基于vue的儿童教育网站的设计与实现论文

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;视频信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广大…

【26 预处理详解】

目录 预定义符号#define定义常量#define定义宏带有副作用的宏参数宏替换的规则宏函数的对比#和##命名约定#undef命令行定义条件编译头文件的包含其他预处理指令 1. 预定义符号 c语言设置了一些预定义符号&#xff0c;可以直接使用&#xff0c;预定义符号也是在预处理期间处理…

响应式编程初探-自定义实现Reactive Streams规范

最近在学响应式编程&#xff0c;这里先记录下&#xff0c;响应式编程的一些基础内容 1.名词解释 Reactive Streams、Reactor、WebFlux以及响应式编程之间存在密切的关系&#xff0c;它们共同构成了在Java生态系统中处理异步和响应式编程的一系列工具和框架。 Reactive Streams…

ruoyi后台管理系统部署-1-安装JDK

CentOS 7 安装JDK 1. 最简单方法 部署JDK最简单的方法是使用&#xff1a;yum 首先查看原服务器有没有安装 jdk # 没有输出 java -version yum list installed | grep javayum 安装 查看可供安装的jdk&#xff1a; yum search java | grep jdk yum -y list java*应该输出一堆…

C#无标题栏窗体拖动代码

文章目录 一、概念二、案例三、常见问题四、链接 一、概念 C#&#xff08;C Sharp&#xff09;是由微软公司开发的一种面向对象的编程语言。它是从C和C语言演化而来的&#xff0c;并结合了Java和其他编程语言的特性。C#是微软.NET平台的一部分&#xff0c;允许开发人员创建各种…
最新文章