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

第7节——渲染列表+Key作用

一、列表渲染

我们再react中如果渲染列表,一般使用map方法进行渲染

import React from "react";export default class LearnJSX2 extends React.Component {state = {infos: [{name: "张三",age: 18,},{name: "李四",age: 20,},{name: "王五",age: 25,},],};render() {return (<div><div>{/*** 使用 map进行列表渲染* map返回要渲染的列表jsx** 使用箭头函数 可以直接return 但是要注意加括号* 并且 括号内 只能有一个根元素*/this.state.infos.map((item, index) => (// 循环的时候必须要在最上层的元素上加key<div key={index}>{item.name} -- {item.age}</div>))}</div></div>);}
}

二、为什么map的时候要加key

1、作用

key是react用来追踪哪些列表的元素被修改,被添加或者是被删除的辅助标示。在开发过程中我们需要保证某个元素的key在其同级元素中具有唯一性。

在react的diff算法中react会借助元素的key来判断该元素是最新创建的还是被移动而来的,从而减少不必要的元素渲染。除此之外,react还要根据key来判断元素与本地状态的关联关系。

2、注意

  • key的值一定要和具体的元素一一对应
  • 尽量不要用数组中的index来作为key的值
  • 当我们在做数组遍历批量生成子节点时,切记同层级的每个子节点的key值不能重复且不会发改变,否则将会产生不可预估的bug
  • key改变组件会重新渲染

2、为什么index不能作为key呢?

编写一个列表,点击列表中的每一项进行删除

使用index当做key

import React from "react";export default class LearnJSX3 extends React.Component {state = {arr: ["a", "b", "c", "d"],};delItem(index) {this.state.arr.splice(index, 1);this.setState({arr: this.state.arr,});}render() {return (<div><div>{/* 使用key当做下标*/}{this.state.arr.map((item, index) => (<div onClick={() => this.delItem(index)} key={index}>{item}</div>))}</div></div>);}
}

这么乍一看,好像可以正常实现功能,但是我们通过浏览器的控制台检查列表的渲染后发现,我们删除了一个项,竟然连带着整个列表都进行了重新渲染!

img

使用item或者其它不会改变的项当做key

import React from "react";export default class LearnJSX3 extends React.Component {state = {arr: ["a", "b", "c", "d"],};delItem(index) {this.state.arr.splice(index, 1);this.setState({arr: this.state.arr,});}render() {return (<div><div>{/* 使用item当做下标*/}{this.state.arr.map((item, index) => (<div onClick={() => this.delItem(index)} key={item}>{item}</div>))}</div></div>);}
}

img

原因

当我们用index做下标的时候,点击删除列表中的每一项,下标都会发生变化,如果用下标当做key就会触发dom重新渲染。如下图所示。

<!-- newVDom -->
<div><div>b</div>  <!-- key==0 --><div>c</div>  <!-- key==1 --><div>d</div>  <!-- key==2 -->
</div>
<!--  oldVDom -->
<div><div>a</div>  <!-- key==0 --><div>b</div>  <!-- key==1 --><div>c</div>  <!-- key==2 --><div>d</div>  <!-- key==3 -->
</div>oldVDom -->
<div><div>a</div>  <!-- key==0 --><div>b</div>  <!-- key==1 --><div>c</div>  <!-- key==2 --><div>d</div>  <!-- key==3 -->
</div>
http://www.lryc.cn/news/147018.html

相关文章:

  • NTP服务器时间配置
  • vulhub之MinIO信息泄露漏洞(CVE-2023-28432)
  • C语言:递归思想及实例详解
  • 好题分享0
  • python的asyncio事件循环
  • QT day1登录界面设计
  • (一)KITTI数据集用于3D目标检测
  • 手写Promise完整介绍
  • 【kubernetes系列】Calico原理及配置
  • RabbitMQ 的快速使用
  • VUE3添加全局变量
  • JavaScript基础语法01——初识JavaScript
  • 家宽用户家庭网的主要质量问题是什么?原因有哪些
  • ZooKeeper的典型应用场景及实现
  • 智能安全帽~生命体征检测与危险气体检测一体化集成设计还是蓝牙无线外挂式方式好?
  • 【Java并发】聊聊对象内存布局和syn锁升级过程
  • 【档案专题】八、电子档案鉴定与销毁
  • 进程与子进程
  • 如何对MySQL和MariaDB中的查询和表进行优化-提升查询效率
  • 【Android】关于binder_calls_stats服务
  • 给前端返回http链接,由于浏览器缓存不能获取到最新资源怎么办?
  • 【Java Web】检查用户登录状态,防止用户访问到非法页面
  • 数学建模——校园供水系统智能管理
  • 分布式集群——搭建Hadoop环境以及相关的Hadoop介绍
  • Python的os.walk()函数使用案例
  • 学习JAVA打卡第四十五天
  • 创建K8s pod Webhook
  • 抓包-要抓取Spring Boot应用程序的请求
  • jmeter+nmon+crontab简单的执行接口定时压测
  • ZooKeeper基础命令和Java客户端操作