react中key的作用

2023-05-16

背景:

如果为父节点添加多个相同的子节点时,不添加key属性,会报错但同时也会渲染出dom,渲染出dom其实是证明能从差异对象中渲染出真实dom,但报错的原因是因为这种写法会影响渲染的性能,不利于生层dom节点。

作用:

key的作用主要是用来减少没必要的diff算法对比,因为对于一个组件或者节点来说,只要父节点状态或者属性发生变化,该组件就会进行diff对比,即使该组件没变化,而如果为组件引入了key值,就可以在diff对比前先做一个校验,判断该组件是否需要diff对比,即使是diff对比,也可以判断该组件是直接更新操作还是销毁或者新建操作,从而提高了diff算法的效率;

特别在渲染同级同结构的组件们时,key可以为它们加上了身份的标志,在rerender时,可以通过key来判断该组件是否已经存在,是否需要跟新或者销毁,新建等操作,提高了diff算法在同级节点上的操作。

原理:

因为在reactelement中有一个属性是key,该属性默认是为空值,所以一般情况下,只要组件不加上key值,react是不会去校验组件的key,而是直接采用diff算法进行对比,一旦组件加上了key值,react就会在渲染时对该组件的身份进行校验,首先校验新旧组件的key值是不是一致,不一致的话,该组件直接销毁,然后在新建该组件;如果一致,则比较组件的属性是否发生变化,如果发生变化,则采用diff算法进行对比,然后得出差异对象,如果属性没发生变化,则认为该组件不需要改变;

大概的流程图:

clipboard.png

  • key相同:若组件属性有所变化,则react只更新组件对应的属性;没有变化则不更新。
  • key值不同:则react先销毁该组件,然后重新创建该组件。

用法:

(一般同级同结构的子节点都需要采用key属性,方便diff算法的使用)

  • 纯静态的同级同结构节点的渲染,可以采用index作为key的值,因为这里不需要动态去变化节点里面的内容的值;
  • 对于一组动态变化的数组来说,采用index作为key的值,会有可能出现问题,因为index的值和数组内的元素内容不具有关联性,所以即使采用了index作为key,子组件的内容有可能不会随着属性的变化而发生变化(只要组件内该元素不与属性构成联系),所以一般采用数组中元素的某一个唯一值作为key,这样一来,只要统一位置的节点的key值不一致,就会直接销毁和新建而不是直接更新;
  • 对于一个不想受到父组件属性状态影响而导致没必要的渲染的组件,可以采用key值,因为只要key值不发生改变,组件的属性不变,即使父组件渲染,该组件也不会发生变化,只有组件的状态或者属性发生变化,组件才会二次渲染;一旦key值变化,就直接组件销毁然后再新建该组件。

以上就是我对react中key的认识和了解,虽然没有过多的深入研究react里面关于key的源码分析,但通过这篇博客,也会一定程度上对react的key有更深入的认识,若有不正确的地方,欢迎指出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react中key的作用 的相关文章

  • 如何通过 RSA 生成唯一的公钥和私钥

    我正在构建一个自定义购物车 其中 CC 编号和到期日期将存储在数据库中直至处理 然后删除 我需要加密这些数据 显然 我想使用 RSACryptoServiceProvider 类 这是我创建密钥的代码 public static void
  • 将js对象键名称中的点替换为下划线

    我需要遍历 js 对象并将该对象键中的所有点替换为下划线 例如 a a test to a a test 这是我的代码 Object getOwnPropertyNames match forEach function val idx ar
  • 如何在python字典中为每个键添加多个值

    我的程序需要输出一个名称列表 每个名称对应三个数字 但是我不知道如何编码 有一种方法可以将其作为字典来实现 例如cat1 james 6 bob 3 但每个键有三个值 两个答案都很好 santosh ankr 使用列表字典 Jaco de
  • 带有数字键的动态 json 对象

    我有一个 json 对象 在以下命令的帮助下将其转换为动态 C 对象this https stackoverflow com questions 3142495 deserialize json into c dynamic object
  • Android提供的onKey()、OnKeyDown()和dispatchKeyEvent()方法之间的区别?

    Android提供的onKey OnKeyDown 和dispatchKeyEvent 方法有什么区别 我想知道这些都可以在何时何地使用 请对此进行一些说明 追踪源代码5 1 视图类的源码 http grepcode com file re
  • Python 字典键中的空格

    我知道 Python 字典键中可以有空格 但这被认为是糟糕的编程吗 我在 PEP 中找不到任何与此相关的内容 编辑以澄清 在我正在做的一个项目中 我正在研究解析 Apache 的记分板输出的东西mod status 请参阅下面的示例输出 我
  • EntityType 未定义键

    我正在创建一个应用程序 用户通过 Facebook oAuth 登录 然后设置歌曲列表 我收到以下错误消息 BandFinderCsharp Models IdentityUserLogin EntityType IdentityUserL
  • 为什么我的 Google 地图 API 密钥无效?

    这是我的第一个问题 我在研究中没有找到答案 我在旧网站 不是我的网站 上的 google 地图 API 密钥出现问题 tao yin com 法国气功协会 有两个月的时间 我为这个网站做了一张地图 在两个地方 Here http www t
  • 将两个键与 std::map 一起使用的最佳方法是什么?

    我有一个std map我用来存储 x 和 y 坐标的值 我的数据非常稀疏 所以我不想使用数组或向量 这会导致内存的大量浪费 我的数据范围从 250000到250000 但我最多只有几千个点 目前我正在创建一个std string与两个坐标
  • 返回 dynamodb 中具有最大排序键的项目

    我正在使用 python 脚本访问 AWS 中的 dynamodb 数据库 我有一个带有哈希键和排序键的表 对于给定的哈希键 我想找到具有小于某个值的最大排序键的项目 我怎样才能做到这一点 或者 有没有办法从给定的键查找前一项 I am n
  • 在java中注入击键

    我正在寻找一种将击键注入操作系统键盘输入缓冲区的方法 就像当您单击一个按钮时 程序会插入一个 或多个 键盘敲击 我想在java中执行此操作 因为我想在 win linux和osx 中运行它 我想我必须利用 JNI 有人有什么想法吗 感谢所有
  • 字典键有字符限制吗?

    在 NET 中我可以使用任何字符串作为字典键吗 这是模板引擎的一部分 我计划允许用户添加他们的自定义标头和值 标题将类似于 X 的值 或 分析和 XYZ 报告摘要 我担心他们是否会在罕见字符或类似内容中遇到异常 我假设存在大小限制 但希望它
  • Oh-my-zsh 哈希(井号)符号错误模式或未找到匹配项

    我很确定是与我的 Oh my zsh 配置相关的东西 但我不知道它是什么 当我在 git 命令中使用 符号时 但也适用于其他所有命令 例如 ls 2 我收到 错误模式 错误或 找不到匹配项 我猜是要计算一些东西 但我找不到在哪里配置它 I
  • 在 Vim 中的缩进线上按“Home”

    我有一个坏习惯 就是使用 home 键返回到行首 当我最近开始使用 vim 时 我注意到当我在缩进的行上按 home 键时 它会让我回到该行的开头 在 Notepad 我曾经使用的编辑器 中 它会让我返回到该行代码的开头 就在缩进之后 有没
  • 在 django 模板中显示字典键

    我想知道如何在 django 模板中显示字典键本身 字典示例 resources coin coin grain grain iron iron stone stone wood wood 模板 b Coin b upgrade coin
  • 在 Android 中存储 API 密钥,混淆就足够了吗?

    我正在使用 Dropbox API 在示例应用程序中 它包含以下几行 Replace this with your consumer key and secret assigned by Dropbox Note that this is
  • Android:如何在键盘上创建自定义形状键?

    我想知道如何在 Android 键盘上制作自定义形状键 创建自定义键盘相对容易 但创建新按钮需要做什么 他们还需要像普通键盘一样响应所有事件 有什么想法从哪里开始吗 您需要为自定义键盘上所需的每个键创建一个图像 然后创建支持键盘设计的 xm
  • 如何更改Android软键盘中任意键的按键背景

    我想让键盘上的一些键与其他键不同 例如下图中的shift 删除 空格键 根据google的参考文档 我们可以通过使用 来改变按键的背景android keybackground drawable xxx in input xml 但它改变了
  • 用java解密AES加密文件

    我有一个使用 AES 使用 java 应用程序加密的文件 我还有一个加密的密钥文件 但我不明白如何使用密钥来解密文件 大多数教程和示例都会在一个地方创建临时随机密钥 加密文件和解密 所以 问题是如何指定解密时必须使用的密钥 EDIT 我发现
  • 如何在 Codeigniter 中我自己的控制器中生成 API 密钥

    只是想提一下 我确实是 API 开发 概念 结构 最佳实践 方面的新手 我对它一点也不熟悉 所以如果您发现我正在使用 Phil 请原谅我可悲的愚蠢问题Sturgeon 的 REST API 服务器 Curl 库和 REST API 客户端这

随机推荐

  • 云计算部署与管理----Openstack(一)

    一 云计算介绍 基于互联网的相关服务的增加 使用和交付模式 xff1b 这种模式提供可用的 便捷的 按需的网络访问 进入可配置的计算资源共享池 资源包括网络 服务器 存储 应用软件 服务 xff1b 这些资源能够被快速提供 只需投入很少的管
  • 嵌入式软件工程师需要哪些知识

    最近想不到好的专题 xff0c 所以与大家一起聊聊 xff0c 在我眼中 xff0c 一名优秀的嵌入式软件工程师需要具备哪些能力 嵌入式软件工程师需要哪些知识 基本职业技能 编码能力 xff1a 至少精通C C 43 43 语言进行codi
  • Docker 更新镜像

    docker镜像如下 xff1a 今天在运行的容器内使用 apt get update 命令进行更新时 xff0c 发下很多404错误 1 Err http archive ubuntu com wily updates restricte
  • 普通用户crontab -e报错

    root crontab e 34 crontab u5u4Zm crontab 34 34L 1478C written crontab installing new crontab var spool cron mkstemp Perm
  • 读书笔记之《Windows内核原理与实现》

    最近学习 Windows内核原理与实现 发现其博大精深 xff0c 粗略过了一遍 xff0c 很多东西比较茫然 xff0c 看书之余把书中涉及的函数 xff0c 结构 xff0c 全局变量的所在页数总结出来 xff0c 便于以后查阅 由于半
  • 使用者——初见Pixhawk

    是什么 Pixhawk简单介绍 直接使用二次开发 Pixhawk总体概述怎么用 Pixhawk初次使用 搭建调试环境初始化配置测试试飞调整参数提高性能 xff08 是什么 Pixhawk简单介绍 PixHawk是著名飞控厂商3DR推出的新一
  • Kazam 1.3.99 发布,Python 3端口和BUG修复

    Kazam 是一款linux上的简洁并且功能强大的桌面录制工具 xff0c 喜欢录屏的童鞋可以尝试下安装改软件 您也可以选择录制声音的支持和pulseaudio的任何声音设备输入 xff0c 记录任何VP8 WebM视频格式的视频 添加 P
  • XCOM串口助手打印不出数据

    本次实验是在基于原子的战舰开发板上的做定时器捕获实验 xff0c 程序源码下载到板子上运行正常 指示灯正常显示 xff0c 打开XCOM识别不来串口 xff0c 原因 xff1a 硬件上没有插USB转串口线 xff1b 连接上USB转串口线
  • Android+GPS轨迹跟踪器(一)

    Android 43 GPS轨迹跟踪器 今天的第一步 xff1a 获取Key 使用高德地图 xff0c 查看高德官方API xff1a http lbs amap com 使用Android studio做开发平台 xff08 我还纠结了Q
  • sdformatter格式化选项设置_SD卡低级格式化方法演示,需要用到SDFormatter

    相信很多用户在使用手机的时候都会遇到过sd内存卡无法被识别的情况 而遇到这一情况是无法通过一般的方法来修复的 xff0c 所以 xff0c 一般都会使用sdformatter对其进行低级格式化 可是 xff0c 对于没有接触过sdforma
  • 自己用树莓派做了一个电视盒子,还可以看优酷和cctv

    我刚接触树莓派时间不久 xff0c 安装过raspberry xff08 树莓派官方系统 xff09 xff0c ubuntu mate xff0c openelec等系统 xff0c openelec是一个电视盒子系统 xff0c 但是我
  • 关闭和开启USB功能

    关闭和开启USB功能 一 xff0c 开启USB功能 USB Enable 64 echo off step1 if exist C Windows INF usbstor inf cls amp goto step2 else cls a
  • 地面站进行航迹规划任务设置

    地面站 xff1a Qgound Control MissionPlayUAV gt 3 2版本 飞控 xff1a Pixhawk 连接 xff1a 数传连接 TCP UDP网络连接 设定任务 APM Pixhawk地面站航迹规划指令单 C
  • 偏差(Bias)和方差(Variance)——机器学习中的模型选择

    模型性能的度量 在监督学习中 xff0c 已知样本 x 1 y 1 x 2 y 2 x n y n xff0c 要求拟合出一个模型 xff08 函数 xff09 hat f xff0c 其预测值 hat f x 与样本实际值 y 的误差最小
  • linux/debian/ubuntu/下can't open XXX.sh

    linux debian ubuntu下执行某 sh出现了 Can 39 t open xxx sh 执行 chmod 777 xxx sh 转载于 https www cnblogs com light zhang p 8417333 h
  • 1、智能盆栽初步了解

    第一个 xff1a 最好养的植物 Click and Grow智能盆栽 2014年03月14 http www pcpop com doc 0 991 991784 shtml 对于现在的人来说 xff0c 家里种个花啊 xff01 种个草
  • Linux下添加静态路由表设置网关出现SIOCADDRT: Network is unreachable的问题分析

    场景 xff1a route add default gw 192 168 4 1 route SIOCADDRT Network is unreachable 解释 xff1a 1 先ping一下网关 xff0c 但是ping的通不代表一
  • spring4笔记----报错publicid systemid之间要有空格的解决方法

    lt xml version 61 34 1 0 34 encoding 61 34 GBK 34 gt lt beans xmlns xsi 61 34 http www w3 org 2001 XMLSchema instance 34
  • 深入理解Redis的scan命令

    熟悉Redis的人都知道 xff0c 它是单线程的 因此在使用一些时间复杂度为O N 的命令时要非常谨慎 可能一不小心就会阻塞进程 xff0c 导致Redis出现卡顿 有时 xff0c 我们需要针对符合条件的一部分命令进行操作 xff0c
  • react中key的作用

    背景 xff1a 如果为父节点添加多个相同的子节点时 xff0c 不添加key属性 xff0c 会报错但同时也会渲染出dom xff0c 渲染出dom其实是证明能从差异对象中渲染出真实dom xff0c 但报错的原因是因为这种写法会影响渲染