React学习计划-React16--React基础(四)生命周期和diffing算法,key的作用

news2025/1/24 0:59:04

1. 生命周期

1. 声命周期的三个阶段(旧)

在这里插入图片描述

  1. 初始化阶段:由ReactDOM.render()触发—初次渲染
1. constructor()
2. componentWillMount()
3. render()
4. componentDidMount() ==> 常用
    一般在这个钩子中做一些初始化的事情,例如:开启定时器,订阅消息,发起网络请求
  1. 更新阶段:由组件内部this.setState()或父组件重新render触发
1. shouldComponentUpdate()
2. componentWillUpdate()
3. render() ==> 必须使用的一个
4. componentDidUpdate()
  1. 卸载组件:由ReactDOM.unmountComponentAtNode()触发
    1. componentWillUnmount() ==> 常用
    一般在这个钩子中做一些收尾的事,例如:关闭定时器,取消订阅消息

2. 声命周期的三个阶段(新)

新旧生命周期对比:

去掉了三个生命周期

  1. componentWillMount
  2. componentWillReceiveProps
  3. componentWillUpdate
    新增两个生命周期
  4. getDerivedStateFromProps()
  5. getSnapshotBeforeUpdate()

在这里插入图片描述

在这里插入图片描述

  1. 初始化阶段:由ReactDOM.render()触发—初次渲染

    1. constructor()
    2. getDerivedStateFromProps()

    若state的值在任何时候都取决于props,那么可以使用

    1. render()
    2. componentDidMount() =====> 常用
      一般在这个钩子中做一些初始化的事,例如:开启定时器、发送网络请求、订阅消息
  2. 更新阶段:由组件内部this.setState()或父组件重新render触发

    1. getDerivedStateFromProps()
    2. shouldComponentUpdate()
    3. render() ==> 必须使用的一个
    4. getSnapshotBeforeUpdate()
    5. componentDidUpdate()
  3. 卸载组件:由ReactDOM.unmountComponentAtNode()触发
    1. componentWillUnmount() ==> 常用
    一般在这个钩子中做一些收尾的事,例如:关闭定时器,取消订阅消息

2. diffing算法

在这里插入图片描述

  1. 虚拟DOM中key的作用:
    1. 简单的说: key是虚拟DOM对象的标识, 在更新显示时key起着极其重要的作用。
    2. 详细的说: 当状态中的数据发生变化时,react会根据【新数据】生成【新的虚拟DOM】,随后React进行【新虚拟DOM】与【旧虚拟DOM】的diff比较,比较规则如下:
      1. 旧虚拟DOM中找到了与新虚拟DOM相同的key:
        (1).若虚拟DOM中内容没变, 直接使用之前的真实DOM
        (2).若虚拟DOM中内容变了, 则生成新的真实DOM,随后替换掉页面中之前的真实DOM
      2. 旧虚拟DOM中未找到与新虚拟DOM相同的key,根据数据创建新的真实DOM,随后渲染到到页面
  2. 用index作为key可能会引发的问题:
    1. 若对数据进行:逆序添加、逆序删除等破坏顺序操作:
      会产生没有必要的真实DOM更新 ==> 界面效果没问题, 但效率低。
    2. 如果结构中还包含输入类的DOM:
      会产生错误DOM更新 ==> 界面有问题。
    3. 注意!如果不存在对数据的逆序添加、逆序删除等破坏顺序操作,
      仅用于渲染列表用于展示,使用index作为key是没有问题的。
  3. 开发中如何选择key?:
    1.最好使用每条数据的唯一标识作为key, 比如id、手机号、身份证号、学号等唯一值。
    2.如果确定只是简单的展示数据,用index也是可以的。

示例:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Javascript知识点锦集

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/135165704 出自【进步*于辰的博客】 文章目录 1、其他知识点链接7、关于 false8、关于 null 与 …

【设计模式】命令模式

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、什么是命令模式? 二、命令模式的优点和应用场景 三、命令模式的要素和实现 3.1 命令 3.2 具体命令 3.3 接受者 …

抖店只能用官方电子面单?2024抖店玩法解读,附面单使用教程

我是王路飞。 正在做抖店的商家,应该都发现一件事情了,那就是现在的抖店好像不让拍单了,只能使用抖音的电子面单,打单发货。 说实话,这种情况已经出现过太多次了,导致很多商家不以为然。 我曾经也说过&a…

Midjourney v6 正式发布,AI创新工坊同步更新

Midjourney v6 开发团队将从2023 年 12 月 21 日今晚开始,在寒假期间让社区测试Midjourney v6模型的 alpha 版本。 要打开它,V6请从提示下方的下拉菜单中选择/settings或--v 6在提示后键入。 Midjourney v6 基本型号有哪些新功能? 更准确的…

受控代码生成-CCS 23

Large Language Models for Code: Security Hardening and Adversarial Testing 1.Introduction2.Background3.受控代码生成4.SVEN4.1.Inference4.2.Training4.2.1.训练样本4.2.2.loss函数 4.3.数据集构建 5.使用场景5.1.安全性增强5.2.对抗测试 6.实验6.1.实验设置6.2.Main Ex…

【数据结构和算法】---栈和队列的互相实现

目录 一、用栈实现队列1.1初始化队列1.2模拟入队列1.3模拟出队列1.4取模拟的队列头元素1.5判断队列是否为空 二、用队列实现栈2.1初始化栈2.2模拟出栈2.3模拟入栈2.4取模拟的栈顶元素2.5判读栈是否为空 一、用栈实现队列 具体题目可以参考LeetCode232. 用栈实现队列 首先要想到…

目标检测应用场景—数据集【NO.24】行人车辆检测数据集2

写在前面:数据集对应应用场景,不同的应用场景有不同的检测难点以及对应改进方法,本系列整理汇总领域内的数据集,方便大家下载数据集,若无法下载可关注后私信领取。关注免费领取整理好的数据集资料!今天分享…

Neural-Chat-7B:Intel如何塑造下一代对话AI

引言 在人工智能的领域中,对话模型的进步正改变我们与技术的互动方式。Intel近期推出的Neural-Chat-7B模型,不仅标志着对话AI的一大步前进,更预示着未来人机交流的新方向。本文将深入探索这一模型的核心特性、训练过程及其在实际应用中的潜力…

【内存泄漏】Malloc Debug 和 libmenunreacbale 原理介绍

内存泄漏检测原理介绍 malloc debug 原理介绍 分为初始化和内存泄漏检测两个阶段介绍。 初始化阶段 整体流程如下图 libc 初始化时通过 __libc_init_malloc 函数调用 MallocInitImpl 来初始化 memory allocation framework。 // malloc_common_dynamic.cpp static const…

2024应届大学生,为云计算高薪岗位做好准备了吗?

云计算正处于快速发展阶段,对于企业和个人来说,云计算提供了方便、灵活和智能的解决方案,对各行各业都有着重要的影响和推动作用。 随着云计算新市场、新业务、新应用的不断出现,人力需求迅猛。国家相继出台一系列政策大力扶持云…

结构型模式 | 适配器模式

一、适配器模式 1、原理 适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式主要分为三类:类适配器模式、对象适配器模式、接口…

什么是Web 3.0以及为什么它很重要【译文】

作者:马克斯-默施和理查德-穆尔黑德 什么技术使30多亿人每天80%的清醒时间受益?就是Web 2.0。 Web 2.0是OReilly等人在1999年至2004年间提出的,它将世界从为信息消费而设计、由昂贵的服务器提供的静态桌面网页转向互动体验和用户生成的内容&a…

革命性突破:Great River推出XL高速ARINC 818传感器测试卡

Great River Technology荣幸地宣布,与RVS(远程视觉系统)2.0平台合作推出的XL高速ARINC 818传感器测试卡正式亮相。这款开创性的测试卡在柯林斯航空电子公司(RTX业务部)和波音公司开发和测试RVS 2.0系统中发挥了重要作用…

【Spring Security】认证密码加密Token令牌CSRF的使用详解

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Spring Security》。🎯🎯 …

P3375 【模板】KMP

【模板】KMP 题目描述 给出两个字符串 s 1 s_1 s1​ 和 s 2 s_2 s2​,若 s 1 s_1 s1​ 的区间 [ l , r ] [l, r] [l,r] 子串与 s 2 s_2 s2​ 完全相同,则称 s 2 s_2 s2​ 在 s 1 s_1 s1​ 中出现了,其出现位置为 l l l。 现在请你求…

关于使用libnet时性能下降的问题分析

Libnet是一个用于构建和注入网络数据包的便携式框架。它提供了在IP层和链路层创建数据包的功能,以及一系列辅助和补充功能。Libnet非常适合编写网络工具和网络测试代码。一些使用libnet的项目包括arping、ettercap、ipguard、isic、nemesis、packit、tcptraceroute和…

Ubuntu 常用命令之 scp 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 SCP(Secure Copy)是一种基于SSH(Secure Shell)的文件传输协议,它可以在本地和远程主机之间安全地复制文件。在Ubuntu系统下,我们可以使用scp命令来实现这个功…

异步消息原理

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 在日常开发中&#xff…

什么是递归

概述 递归是一种解决问题的方法,它通过将一个问题分解为同样类型的子问题来解决问题。在递归中,函数会调用自身,并向下逐步解决问题,直到到达问题的基本情况。 递归的示例可以是计算一个数的阶乘。阶乘的定义是对于正整数n&…

React学习计划-React16--React基础(五)脚手架创建项目、todoList案例、配置代理、消息订阅与发布

一、使用脚手架create-react-app创建项目 react脚手架 xxx脚手架:用来帮助程序员快速创建一个基于xxx库的模板项目 包含了所有需要的配置(语法检查、jsx编译、devServe…)下载好了所有相关的依赖可以直接运行一个简单的效果 react提供了一个…