当前位置: 首页 > news >正文

React基础教程:TodoList案例

todoList案例——增加

定义状态

// 定义状态state = {list: ["kevin", "book", "paul"]}

利用ul遍历list数组

<ul>{this.state.list.map(item =><li style={{fontWeight: "bold", fontSize: "20px"}} key={item.id}>{item.name}</li>)}</ul>

绑定点击事件,把input的值添加到list

不推荐这种写法❌

handlerClick = ()=>{console.log("Click4", this.myRef.current.value);// 不要这样写,因为不要直接修改状态,可能会造成不可预期的问题this.state.list.push(this.myRef.current.value);this.setState({list: this.state.list,})}

推荐这样的写法✅

handlerClick = ()=>{console.log("Click4", this.myRef.current.value);// 定义一个新的数组接收let newList = [...this.state.list];newList.push(this.myRef.current.value);this.setState({list: newList})}

效果展示:

在这里插入图片描述

这里会存在一个问题,如果我插入同样的key,比如paul,这里会提示报错,提示children存在相同的key,但是这个key应该是唯一的。

在这里插入图片描述

修改方式如下:

给list加入唯一标识id

// 定义状态state = {list: [{id: 1,name: "kevin"},{id: 2,name: "book"},{id: 3,name: "paul"}]}

ul进行遍历的时候,绑定唯一标识符item.id

<ul>{this.state.list.map(item =><li style={{fontWeight: "bold", fontSize: "20px"}} key={item.id}>{item.name}</li>)}</ul>

注意在push的时候也要添加id

newList.push({id: Math.random()*100000000, // 生产不同的idname: this.myRef.current.value});

再次添加相同的名字,也不会报错

在这里插入图片描述

todoList案例——删除

首先给每一个li标签后,添加删除按钮

<ul>{this.state.list.map(item =><li style={{fontWeight: "bold", fontSize: "20px"}} key={item.id}>{item.name}<Button size={"small"}style={{marginLeft:10}}type={"primary"}shape={"circle"}dangericon={<DeleteOutlined/>} /></li>)}</ul>

实现效果如下:

在这里插入图片描述

接着给按钮,绑定删除事件onClick={()=>this.handlerDeleteClick(index)},并且修改列表渲染的方式,(item,index),这里的index将作为后续的额参数传递使用

<ul>{this.state.list.map((item, index) =><li style={{fontWeight: "bold", fontSize: "20px"}} key={item.id}>{item.name}<Button size={"small"}style={{marginLeft:10}}type={"primary"}shape={"circle"}dangeronClick={()=>this.handlerDeleteClick(index)}icon={<DeleteOutlined/>} /></li>)}</ul>

实现handlerDeleteClick函数

handlerDeleteClick(index) {console.log("Del-", index);// 深复制let newList = this.state.list.concat();newList.splice(index, 1);this.setState({list: newList})}

实现效果如下:

在这里插入图片描述

完整的代码

注意,这里我使用了react前端的UI框架antd,大家需要自行安装使用即可。

npm install antd --save
import React, {Component} from "react";
import {Button} from 'antd';
import {DeleteOutlined} from '@ant-design/icons';import './css/App.css'export default class App extends Component {a = 35;myRef = React.createRef();// 定义状态state = {list: [{id: 1,name: "kevin"},{id: 2,name: "book"},{id: 3,name: "paul"}]}render() {return (<div style={{marginTop: 10, marginLeft: 10}}><input style={{width: 200}}ref={this.myRef}/>{/*非常推荐*/}<Button style={{backgroundColor: '#2ba471', border: "none"}} size={"middle"} type={"primary"}onClick={() => {this.handlerClick() // 非常推荐,传参数}}>添加</Button><ul>{this.state.list.map((item, index) =><li style={{fontWeight: "bold", fontSize: "20px"}} key={item.id}>{item.name}<Button size={"small"}style={{marginLeft: 10}}type={"primary"}shape={"circle"}dangeronClick={() => this.handlerDeleteClick(index)}icon={<DeleteOutlined/>}/></li>)}</ul></div>)}handlerClick = () => {console.log("Click4", this.myRef.current.value);// 不要这样写,因为不要直接修改状态,可能会造成不可预期的问题// this.state.list.push(this.myRef.current.value);let newList = [...this.state.list];newList.push({id: Math.random() * 100000000, // 生产不同的idname: this.myRef.current.value});this.setState({list: newList})}handlerDeleteClick(index) {console.log("Del-", index);// 深复制let newList = this.state.list.concat();newList.splice(index, 1);this.setState({list: newList})}
}

相关文章:

  • 【探索Linux】P.34(HTTPS协议)
  • [AIGC] 解题神器:Python中常用的高级数据结构
  • GenICam标准(一)
  • Java基础知识巩固自测(上)
  • 大模型-人类病理学的语言视觉AI助手
  • DataWhale - 吃瓜教程学习笔记(一)
  • mybatis-plus使用拦截器实现sql完整打印
  • 一款经典BUCK DCDC降压芯片TPS5430适合24V转5V转12V及其电路图
  • Python 踩坑记 -- 调优
  • 超拟人大模型:AI心理健康服务的未来
  • QuickLook最强大的C#开源文件预览神器
  • 计算机行业
  • JWT令牌、过滤器Filter、拦截器Interceptor
  • LeetCode 230.二叉搜索树中第K小的元素
  • Android中蓝牙设备的状态值管理
  • hexo+github搭建个人博客
  • 【css3】浏览器内核及其兼容性
  • Golang-长连接-状态推送
  • java8 Stream Pipelines 浅析
  • Java程序员幽默爆笑锦集
  • java中的hashCode
  • js
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • pdf文件如何在线转换为jpg图片
  • python大佬养成计划----difflib模块
  • react-native 安卓真机环境搭建
  • React的组件模式
  • 复习Javascript专题(四):js中的深浅拷贝
  • 工作中总结前端开发流程--vue项目
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 浏览器缓存机制分析
  • 七牛云假注销小指南
  • 前端
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 数据科学 第 3 章 11 字符串处理
  • 算法系列——算法入门之递归分而治之思想的实现
  • 与 ConTeXt MkIV 官方文档的接驳
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #{} 和 ${}区别
  • #{}和${}的区别是什么 -- java面试
  • #QT项目实战(天气预报)
  • (+4)2.2UML建模图
  • (9)STL算法之逆转旋转
  • (第27天)Oracle 数据泵转换分区表
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (十一)手动添加用户和文件的特殊权限
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (杂交版)植物大战僵尸
  • (转) Android中ViewStub组件使用
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .Net Core 中间件与过滤器