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

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.mzph.cn/news/240005.shtml

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

相关文章

亚马逊测评的重要性和技术选择

亚马逊测评是指卖家通过各种途径,如测评平台、社区、红人等,联系到亚马逊的买家,让其对卖家的产品进行评价和留下真实的综合评价,这对于跨境电商卖家来说非常重要,因为亚马逊的排名和转化率很大程度上取决于产品的评价…

Python代码示例 | 时间序列数据的组成

时间序列数据是以固定的时间间隔记录或收集的数据点序列。它是一种跟踪变量随时间演变的数据,如销售,股票价格,温度等。定期的时间间隔可以是每天,每周,每月,每季度或每年,数据通常表示为线图或…

ArchLinux搭建riscv测试环境(失败)

参考 Boot an Arch Linux RISC-V using qemu-system - JieJiSS Blog 安装ArchLinux安装所需包 sudo pacman -S arch-install-scripts git qemu-img qemu-system-riscv sudo pacman -S riscv64-linux-gnu-gcc 安装yay git clone https://aur.archlinux.org/yay-bin cd yay-b…

Java小案例-Bean是如何注入到Spring中的,有几种注入方式

前言 关于Bean注入Spring容器的方式网上也有很多相关文章,但是很多文章可能会存在以下常见的问题 注入方式总结的不全 没有分析可以使用这些注入方式背后的原因 没有这些注入方式在源码中的应用示例 ... 所以本文就带着解决上述的问题的目的来重新梳理一下Bea…

关于增强监控以检测针对Outlook Online APT活动的动态情报

一、基本内容 2023年6月,联邦民事行政部门(FCEB)在其Microsoft 365(M365)云环境中发现了可疑活动。该机构迅速向Microsoft和网络安全和基础设施安全局(CISA)报告了此情况。经过深入调查&#x…

C 语言中布尔值的用法和案例解析

C语言中的布尔值 在编程中,您经常需要一种只能有两个值的数据类型,例如: 是/否开/关真/假 为此,C语言有一个 bool 数据类型,称为布尔值。 布尔变量 在C语言中,bool 类型不是内置数据类型,例…

docker安装的php 在cli中使用

1: 修改 ~/.bashrc 中新增 php7 () {ttytty -s && tty--ttydocker run \$tty \--interactive \--rm \--volume /website:/website:rw \--workdir /website/project \--networkdnmp_dnmp \dnmp_php php "$" }–networkdnmp_dnmp 重要, 不然连不上数据库, 可通…

【数字通信原理】复习笔记

哈喽ノhi~ 小伙伴们许久没有更新啦~ 花花经历了漫长的考试周~ 要被累成花干啦。今天来更新《数字通信原理》手写笔记给需要的小伙伴~ (注:这是两套笔记,是需要结合来看的哦~) 第一套的笔记请结合bilibili:张锦皓的复习课程来哦。 第…

图神经网络并在 TensorFlow 中实现

asokraju.medium.com 一、说明 本文将引导您了解图神经网络 (GNN) 并使用 TensorFlow 实现该网络。在后续的 文章中,我们讨论 GNN 的不同变体及其实现。这是一个分步计划: 图神经网络 (GNN) 的使用:我们首先讨论 GNN 是什么、它们如何工作以及…

项目管理常用的ChatGPT通用提示词模板

项目目标设定:如何设定明确、可衡量的项目目标? 项目计划制定:如何制定详细的项目计划,包括时间表、任务分配、资源需求等? 风险管理:如何识别和评估项目风险,并制定相应的应对措施&#xff1…

Leetcode—415.字符串相加【简单】

2023每日刷题(六十八) Leetcode—415.字符串相加 实现代码 class Solution { public:string addStrings(string num1, string num2) {string ans;int len1 num1.size();int len2 num2.size();int i len1 - 1, j len2 - 1;int sum 0, c 0;while(i…

Leetcode-230.二叉搜索树中第k小的元素(Python)

题目链接 此题看题解,其实这道题蛮简单的,需要注意二叉搜索树左小右大,为什么还需要看题解,需要反思! # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNon…

Unity Destroy和DestroyImmediate方法

Destroy和DestroyImmediate都是Unity用于销毁游戏对象的方法。 它们的语法是: Destroy(gameObject); DestroyImmediate(gameObject); 都接受一个参数,即销毁的对象。 但是它们是有一定区别的。 1、Destroy方法它会延迟销毁,当我们调用它…

MFC 自定义压缩,解压缩工具

界面效果如下: 对外提供的接口如下: public: void setCallback(zp::Callback callback, void* param); bool open(const zp::String& path, bool readonly false); bool create(const zp::String& path, const zp::String& inputPath)…

【JavaWeb】Listener Filter

Listener监听器 一、Listener概述 1、监听器概念 web的三大组件之一。 2、事件监听机制 事件:一件事情事件源:事件发生的地方监听器:一个对象注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后&#xf…

P5410 【模板】扩展 KMP/exKMP(Z 函数)

【模板】扩展 KMP/exKMP(Z 函数) 题目描述 给定两个字符串 a , b a,b a,b,你要求出两个数组: b b b 的 z z z 函数数组 z z z,即 b b b 与 b b b 的每一个后缀的 LCP 长度。 b b b 与 a a a 的每一个后缀的 LC…

关于“Python”的核心知识点整理大全37

目录 13.6.2 响应外星人和飞船碰撞 game_stats.py settings.py alien_invasion.py game_functions.py ship.py 注意 13.6.3 有外星人到达屏幕底端 game_functions.py 13.6.4 游戏结束 game_stats.py game_functions.py 13.7 确定应运行游戏的哪些部分 alien_inva…

C#学习笔记 - C#基础知识 - C#从入门到放弃 - C# 结构、类与属性

C# 入门基础知识 - C# 结构、类与属性 第9节 结构、类与属性9.1 结构的使用9.2 枚举9.3 面向对象概述9.4 类与对象的关系9.5 类的声明9.6 属性的使用9.6.1 属性9.6.2 属性使用 9.7 构造函数和析构函数9.7.1 构造函数9.7.2 析构函数 9.8 类的继承9.9 类的封装9.10 类的多态 更多…

非阻塞 IO(NIO)

文章目录 非阻塞 IO(NIO)模型驱动程序应用程序模块使用 非阻塞 IO(NIO) 上一节中 https://blog.csdn.net/tyustli/article/details/135140523,使用等待队列头实现了阻塞 IO 程序使用时,阻塞 IO 和非阻塞 IO 的区别在于文件打开的时候是否使用了 O_NONB…

Zookeeper的学习笔记

Zookeeper概念 Zookeeper是一个树形目录服务,简称zk。 Zookeeper是一个分布式的、开源的分布式应用程序的协调服务 Zookeeper提供主要的功能包括:配置管理,分布式锁,集群管理 Zookeeper命令操作 zk数据模型 zk中的每一个节点…