React@16.x(22)HOOK,useState 的原理

目录

  • 1,介绍
  • 2,useState
    • 2.1,使用
    • 2.2,原理
    • 2.3,注意点

1,介绍

1,出现时间点:在 React@16.8.0 出现。

2,目的:为了增强函数组件的功能,用于替代类组件(类组件中不能使用 HOOK)。

3,原因:类组件中有一些比较麻烦的问题:this 指向、繁琐的生命周期等问题。

4,特点:本质上就是一个函数,该函数可以挂载(hook)一些功能。

最常用的2个HOOK:

  • useState,作为状态使用。
  • useEffect,作为生命周期使用。

2,useState

一个函数组件中可以有多个状态,这种做法非常有利于横向切分关注点。

2.1,使用

简单举例:

import React, { useState } from "react";export default function App() {const [n, setN] = useState(0); //使用一个状态,该状态的默认值是0return (<div><buttononClick={() => {setN(n - 1);}}>-</button><span>{n}</span><buttononClick={() => {setN(n + 1);}}>+</button></div>);
}

2.2,原理

正常情况下,函数组件重新渲染(重新运行),函数体中的内容不会保留,并且会返回新的内容。那状态是如何保持的

在之前的渲染流程中提到:React 元素会创建React 节点,ReactDOM 会通过节点来进行渲染

这里做一些补充:

在创建节点的过程中,也会创建并维护一个状态数组,它附着在节点上

第N次调用 useState 时,会检查节点对应的状态数组是否存在下标N

  • 不存在(初次渲染),则使用默认值创建一个状态,并将该状态加入到下标N的位置。
  • 存在(再次渲染),忽略掉默认值,直接取对应下标的状态值。

另外,正因为 React节点是通过 React 元素创建的,所以React 元素之间相互独立导致每个状态数组 也是独立的,互不影响。

2.3,注意点

1,所有的 useState 最好写到函数起始位置,便于阅读。

至少要写到第一次使用该状态之前。

2,useState严禁出现在代码块中(判断,循环)。

3,useState 返回的函数(数组第2项),引用不变。

函数组件多次渲染时,该状态函数是同一个,为了节省内存。

4,使用状态函数修改状态时,若传递的状态值未做修改(使用Object.is() 比较),不会导致重新渲染。这是为了优化效率。

5,强制刷新。如果状态值是一个对象,则可通过传入一个空对象来实现强制渲染。(2个对象引用不同)

export default function App() {console.log("App Render");const [, forceUpdate] = useState({});return (<div><buttononClick={() => {forceUpdate({});}}>强制刷新</button></div>);
}

6,使用状态函数修改状态时,新传入的值会直接替换旧值,而不是合并。

// 使用解构,保留之前的状态
export default function App() {const [data, setData] = useState({ x: 1, y: 2 });return (<div><span>{data.x}</span><span>{data.y}</span><buttononClick={() => {setData({...data,x: data.x + 1,});}}>x+1</button></div>);
}

7,如果状态之间没有必然联系,应该分开处理,而不是合并为一个对象。

8,和类组件的状态相似,函数组件中改变状态也可能是异步的(比如DOM事件),多个状态的修改会合并,以提高效率。

所以,不能信任之前的状态。如果需要用到之前的状态,可以使用函数参数。

和类组件的 setState 一样,如果参数是函数的话,会将每个状态函数的函数参数放到一个队列中,按顺序执行。队列执行完毕后,再更新真正的 state,再执行 render(只执行了1次)。

举例:每次点击按钮,n+2,同时只打印一次 App render

import React, { useState } from "react";export default function App() {console.log("App render");const [n, setN] = useState(0);return (<div><span>{n}</span><buttononClick={() => {// setN(n + 1)// setN(n + 1) // 此时,n的值仍然是0setN((prevN) => prevN + 1);setN((prevN) => prevN + 1);}}>+</button></div>);
}

以上。

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

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

相关文章

数据挖掘实战-基于Catboost算法的艾滋病数据可视化与建模分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

C++中的sizeof和strlen详解

在C中&#xff0c;sizeof和strlen都是用于获取长度或大小的运算符/函数&#xff0c;但它们的用途和工作方式有所不同。以下是对它们的详细解释&#xff1a; sizeof 运算符 sizeof 是一个编译时运算符&#xff0c;用于计算数据类型或对象的大小&#xff08;以字节为单位&#…

FANUC机器人SRVO-348 DCS MCC关闭报警处理方法总结

FANUC机器人SRVO-348 DCS MCC关闭报警处理方法总结 如下图所示,由于操作人员在操机时误打开了安全门,导致机器人紧急制动停止,示教器上显示: SRV0-348 DCS MCC关闭报警0,1, 如下图所示,查看手册中关于SRVO-348报警的具体内容: 原因分析:给机器人主电源上电的接触器在紧…

PLS_INTEGER:Oracle PL/SQL中的整数类型深度解析

PLS_INTEGER&#xff1a;Oracle PL/SQL中的整数类型深度解析 一、概述二、PLS_INTEGER简介三、PLS_INTEGER的优点四、PLS_INTEGER的简单示例示例1&#xff1a;声明并使用PLS_INTEGER变量示例2&#xff1a;在存储过程中使用PLS_INTEGER 五、资深应用的代码示例示例3&#xff1a;…

《机器学习特征提取》

书籍&#xff1a;Building Feature Extraction with Machine Learning: Geospatial Applications 作者&#xff1a;Bharath.H. Aithal&#xff0c;Prakash P.S. 出版&#xff1a;CRC Press 书籍下载-《机器学习特征提取》这是一本面向专业人士和研究生的实用指南&#xff0c…

SSM框架整合,内嵌Tomcat。基于注解的方式集成

介绍&#xff1a; SSM相信大家都不陌生&#xff0c;在spring boot出现之前&#xff0c;SSM一直是Java在web开发中的老大哥。现在虽说有了spring boot能自动整合第三方框架了&#xff0c;但是现在市面上任然有很多老项目是基于SSM技术的。因此&#xff0c;能熟练掌握SSM进行开发…

DALL-E2详解

标题&#xff1a; DALL-E2详解 摘要&#xff1a; 本文将详细介绍DALL-E2&#xff0c;OpenAI最新推出的人工智能图像生成模型。DALL-E2在图像生成领域取得了显著进展&#xff0c;它不仅能够生成逼真的图像&#xff0c;还能根据文本描述创造出新颖且具有创意的视觉内容。本文将探…

队列的讲解与实现

这里写目录标题 一、队列的概念及结构二、队列的实现(使用VS2022的C语言)1.初始化、销毁2.入队、出队3.返回队头元素、返回队尾元素、判空、返回有效元素个数 三、完整 Queue.c 源代码 一、队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端…

【Linux】进程(8):Linux真正是如何调度的

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解Linux进程&#xff08;8&#xff09;&#xff1a;Linux真正是如何调度的&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 之前我们讲过&#xff0c;在大…

conda虚拟环境如何卸载pip

要在conda虚拟环境中卸载pip&#xff0c;你可以使用conda命令来移除它。以下是具体步骤&#xff1a; 激活你想要移除pip的conda虚拟环境。 使用conda命令移除pip。 下面是具体的命令&#xff1a; bash conda activate your_env_name # 替换your_env_name为你的环境名称 cond…

代码随想录算法训练营第四十九天 | 139.单词拆分、多重背包、背包问题总结

139.单词拆分 视频讲解&#xff1a; 动态规划之完全背包&#xff0c;你的背包如何装满&#xff1f;| LeetCode&#xff1a;139.单词拆分_哔哩哔哩_bilibili 代码随想录 解题思路 1.dp[i] 字符串的长度为i&#xff0c;dp[i]是否可以被组成 2.递推公式 if( [j,i] && d…

硬件IIC和软件IIC的比较

&#xff08;一&#xff09;硬件IIC 硬件IIC是由STM32内部的硬件模块实现的&#xff0c;使用CPU的时钟信号来控制数据传输和时序&#xff0c;通信速度较快&#xff0c;可以达到几十MHz的速度。硬件IIC的实现相对简单&#xff0c;无需编写复杂的代码&#xff0c;因此在实现IIC通…

如何理解与学习数学分析——第二部分——数学分析中的基本概念——第5章——序列

第2 部分&#xff1a;数学分析中的基本概念 (Concepts in Analysis) 5. 序列(Sequences) 本章介绍了序列属性&#xff0c;例如单调性、有界性和收敛性&#xff0c;使用图表和示例来解释这些属性&#xff0c;并演示如何在各种证明中使用它们的定义。讨论了趋于无穷大的序列出…

API key学习笔记

API Key 基本上可以认为是一个长字符串&#xff0c;允许 API 消费者&#xff08;即使用 API 的人&#xff09;访问受限的功能和数据。它作为一种安全措施&#xff0c;确保了 API 服务能够控制谁有权限访问什么数据&#xff0c;同时也帮助跟踪API的使用情况。生成API key来调用A…

centos官方yum源不可用 解决方案(随手记)

昨天用yum安装软件的时候&#xff0c;就报错了 [rootop01 ~]# yum install -y net-tools CentOS Stream 8 - AppStream 73 B/s | 38 B 00:00 Error: Failed to download metadata for repo appstream: Cannot prepare internal mirrorlis…

创新指南 | 5个行之有效的初创企业增长策略

本文探讨了五种初创企业实现快速增长的有效策略&#xff1a;利用网络效应通过激励和资本化用户增长&#xff1b;通过持续提供高质量内容建立信任和权威的内容营销&#xff1b;利用简单有效的推荐计划扩展用户群&#xff1b;采用敏捷开发方法快速适应市场变化和客户反馈&#xf…

Codeforces Round 950 (Div. 3) A B C D E

A. Problem Generator time limit per test: 1 second memory limit per test: 256 megabytes input: standard input output: standard output Vlad is planning to hold m m m rounds next month. Each round should contain one problem of difficulty levels ‘A’, ‘B’…

Java:JDK8 GC中ParNew和CMS的问题说明

JDK8中常用如下的垃圾收集器&#xff0c;它们分别运用在年轻代和老年代&#xff1a; ParNew : 年轻代垃圾收集器&#xff0c;多线程&#xff0c;采用标记—复制算法。 CMS&#xff1a;老年代的收集器&#xff0c;全称&#xff08;Concurrent Mark and Sweep&#xff09;&#…

[消息队列 Kafka] Kafka 架构组件及其特性(二)Producer原理

这边整理下Kafka三大主要组件Producer原理。 目录 一、Producer发送消息源码流程 二、ACK应答机制和ISR机制 1&#xff09;ACK应答机制 2&#xff09;ISR机制 三、消息的幂等性 四、Kafka生产者事务 一、Producer发送消息源码流程 Producer发送消息流程如上图。主要是用…

国自然基金的检索

&#xff08;1&#xff09;网址 跳转国自然基金网址&#xff1a;https://www.nsfc.gov.cn/ &#xff08;2&#xff09;查询入口 &#xff08;3&#xff09;进行查询