Day6:浅谈useState

2023-11-17

「目标」: 持续输出!每日分享关于web前端常见知识、面试题、性能优化、新技术等方面的内容。

Day6-今日话题

谈谈react hooks中的useState ,将从以下七个角度介绍:

  1. 用法
  2. 参数
  3. 返回值
  4. 作用
  5. 工作原理
  6. 优缺点
  7. 注意点

用法

useState 是一个函数,它接受一个初始状态值作为参数,并返回一个包含当前状态值和状态更新函数的数组。通常,你可以使用数组解构赋值来获取这两个值。

const [state, setState] = useState(initialState);

参数

initialState(初始状态):这是状态的初始值。它可以是任何 JavaScript 数据类型,包括基本数据类型(如字符串、数字、布尔值)或复杂数据类型(如对象、数组)。

返回值

useState 返回一个包含「两个元素」的数组:

  • state:这是当前的状态值。它在组件渲染时保持不变,直到你调用状态更新函数来修改它。

  • setState:这是一个函数,用于更新状态。当你调用 setState 函数时,React 会重新渲染组件,并且将新的状态值传递给组件。setState 函数「可以接受新的状态值作为参数,也可以接受一个函数」,该函数接收当前状态值作为参数并返回新的状态值。这允许你基于先前的状态进行更新,而不会丢失任何先前的状态。

作用

主要作用就是在函数式组件中管理组件的状态。通过使用useState,可以在函数式组件中创建、读取和更新状态。

工作原理

  1. 「初始化状态:」 当你在函数式组件中使用 useState 时,它会返回一个包含当前状态值和状态更新函数的数组,通常使用数组解构赋值来获取这两个值。

  2. 「状态更新:」 当你调用 setState 函数时,可以传递一个新的状态值作为参数,或者传递一个接受先前状态的函数。例如:

  • 使用新状态值:
setState(newValue);
  • 使用函数更新状态:
setState(prevState => {
  // 基于 prevState 计算新的状态值
  return newState;
});

无论是哪种方式,React 都会将新的状态值存储在内部,但不会立即应用于组件。

  1. 「批处理和合并更新:」 React 会对多个 setState 调用进行批处理,将它们合并成一个单一的更新操作。这是为了提高性能并减少不必要的重新渲染。如果多个 setState 调用试图更新相同的状态属性,React 会确保它们被合并成一个更新,以确保最终状态是一致的。

  2. 「触发重新渲染:」 在下一个渲染周期(通常是浏览器的下一帧)之前,React 会安排一个重新渲染操作,将新的状态应用到组件中。这个重新渲染操作会引发组件的 render 函数重新执行,以便更新组件的视图。

  3. 「生命周期和副作用:」 在组件的生命周期方法(如 renderuseEffect)或副作用钩子中,你可以访问最新的状态值。这些方法会在状态更新后被调用,允许你执行与状态变化相关的操作。

优缺点

优点:

「简单易用」: useState 是一种非常简单的状态管理工具,易于学习和使用,尤其适用于函数式组件。不需要理解类组件中的 this.setState 和生命周期方法。

「无副作用」: useState 是纯粹的函数,不引入任何副作用。它仅仅是一个函数,接受一个初始状态值作为参数,返回一个包含当前状态和状态更新函数的数组。

「函数式编程」: useState 鼓励使用函数式编程的方式来管理状态。你可以使用函数作为参数,以基于先前的状态值计算新状态值,有助于避免一些常见的状态更新问题。

「多状态管理」: 你可以在同一个函数式组件中多次使用 useState,创建多个独立的状态变量,而不需要使用类组件中的 this.state。

「性能优化」: React 使用一些内部机制来优化 useState 的性能,包括状态的批处理和异步更新。这有助于提高组件的性能。

「适应性强」: useState 适用于各种情况,从简单的状态管理到复杂的状态逻辑。它可以与其他 React Hook 和生命周期钩子一起使用,以满足不同的需求。

「可读性」: 在函数式组件中使用 useState 可以提高代码的可读性和可维护性,因为它让状态管理更加直观和简单。

「未来发展」: 随着 React 不断演进,函数式组件和 Hook 的使用将更加广泛,而 useState 是其中的核心之一,因此它将继续得到支持和改进。

缺点

「仅适用于函数式组件」: useState 只能在函数式组件中使用,无法用于类组件。如果你的应用程序中存在大量的类组件,你可能需要同时学习和使用两种不同的状态管理方式。

「局部状态」: useState 创建的状态是局部的,只能在组件内部使用。如果你需要将状态共享给多个组件,可能需要将状态提升到更高层次的组件或使用全局状态管理工具(如 Redux)。

「复杂状态逻辑」: 对于复杂的状态逻辑,useState 可能会导致组件内部状态的复杂化,使组件变得难以维护。在这种情况下,useReducer 或其他状态管理工具可能更适合。

「限制性能优化」: useState 的异步更新机制可以帮助提高性能,但有时候也可能导致不必要的重新渲染。对于一些特定情况,你可能需要手动优化以避免性能问题。

「无法处理复杂的全局状态」: 对于大型应用程序中的复杂全局状态管理,useState 可能不足以胜任,你可能需要引入更强大的全局状态管理库,如 Redux 或 Mobx。

「学习曲线」: 尽管 useState 相对简单,但对于初学者来说,理解 React Hook 的概念和用法可能会带来一些学习曲线。

「迁移成本」: 如果你的应用程序之前使用类组件进行状态管理,迁移到函数式组件和 useState 可能需要一定的迁移成本。

注意点

在使用 useState 进行状态管理时,有一些注意点和最佳实践,以确保代码的可读性、性能和可维护性。以下是一些使用 useState 的注意点:

  1. 「初始状态值:」 在使用 useState 时,务必提供一个合适的初始状态值作为参数。这个初始值应该与你的组件的初始状态相关。如果你的初始状态依赖于外部数据(例如 props),可以使用 props 作为初始值。示例:
const [count, setCount] = useState(props.initialCount);
  1. 「多个状态变量:」 如果你的组件有多个状态变量,应该为每个状态变量使用单独的 useState。这有助于保持代码的清晰性和可维护性。不要尝试将多个状态变量合并到一个对象中,除非确实需要管理它们的联合状态。
const [count, setCount] = useState(0);
const [name, setName] = useState('');
  1. 「状态更新函数:」 使用 useState 返回的状态更新函数来更新状态,而不要直接修改状态变量。React 依赖于这些函数来进行批处理和合并状态更新,直接修改状态变量可能导致不一致的行为。
// 正确方式
setCount(count + 1);

// 错误方式
// count = count + 1;
  1. 「函数方式更新状态:」 如果新状态值依赖于先前的状态,可以使用函数方式来更新状态。这可以确保状态更新是基于最新的状态值计算的。
setCount(prevCount => prevCount + 1);
  1. 「性能优化:」 在需要频繁更新状态的情况下,考虑使用 useMemouseCallback 进行性能优化,以避免不必要的重新渲染。这可以帮助提高应用程序的性能。

  2. 「副作用处理:」 如果在状态更新后需要执行副作用操作,可以使用 useEffect 钩子。确保在 useEffect 中正确地处理副作用,并根据需要清理副作用。

  3. 「可维护性:」 如果状态管理变得复杂,考虑使用状态容器库(如 Redux 或 Mobx)来更好地组织和管理状态。不要让组件的状态过于分散和复杂。

  4. 「命名约定:」 使用有意义的变量名来命名状态和状态更新函数,以增加代码的可读性。

const [isLoading, setIsLoading] = useState(false);
  1. 「组件拆分:」 如果一个组件的状态变得过于复杂,可以考虑将其拆分成多个小组件,每个组件管理自己的状态。这有助于提高组件的可维护性和复用性。

  2. 「遵循 React 的规则:」 遵循 React 的规则和最佳实践,例如避免在 render 方法中触发副作用,以及理解 React 的生命周期和渲染过程。


欢迎点赞、关注、转发~ alt

本文由 mdnice 多平台发布

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

Day6:浅谈useState 的相关文章

  • Spring Boot入门&整合常用框架整理丨深度好文

    一 SpringBoot简介 1 1 原有Spring优缺点分析 1 1 1 Spring的优点分析 Spring是Java企业版 Java Enterprise Edition JEE 也称J2EE 的轻量级代替品 无需开发重量级的Ent
  • 腾讯、阿里多位大佬共同推荐!封神级Python学习路线+核心知识点笔

    人工智能时代下 Python毫无疑问是最热的编程语言 有人夸它功能强大还上手轻松 有人说它学习曲线不那么陡峭 但是更多的人 在推开Python的大门后却发现 Python入门容易但精通却不易 你是否也曾傻傻分不清 列表 元组 字典 集合 等
  • Unicode编码小结

    Unicode编码 一 ASCLL码 ASCII American Standard Code for Information Interchange 美国信息交换标准代码 是基于拉丁字母的一套电脑编码系统 主要用于显示现代英语和其他西欧语
  • 工作与身体健康之间的平衡

    大厂裁员 称35岁以后体能下滑 无法继续高效率地完成工作 体重上涨 因为35岁以后新陈代谢开始变慢 甚至坐久了会腰疼 睡眠困扰开始加重 在众多的归因中 仿佛35岁的到来 会为一切的焦虑埋下伏笔 实际上 生理年龄不代表全部 体能素质的下降更与
  • Unittest单元测试之unittest用例执行顺序

    用例执行顺序 当在一个测试类或多个测试模块下 用例数量较多时 unittest在执行用例 test xxx 时 并不是按从上到下的顺序执行 有特定的顺序 unittest框架默认根据ACSII码的顺序加载测试用例 数字与字母的顺序为 0 9
  • Unittest单元测试框架之unittest构建测试套件

    构建测试套件 在实际项目中 随着项目进度的开展 测试类会越来越多 可是直到现在我 们还只会一个一个的单独运行测试类 这在实际项目实践中肯定是不可行的 在 中可以通过测试套件来解决该问题 测试套件 Test Suite 是由多个测试用例 Te
  • 最新最全的Jmeter接口测试必会技能:jmeter对图片验证码的处理

    jmeter 对图片验证码的处理 在web端的登录接口经常会有 图片验证码 的输入 而且每次登录时图片验证码都是随机的 当通过jmeter做接口登录的时候要对图片验证码进行识别出图片中的字段 然后再登录接口中使用 通过jmeter对图片验证
  • redis性能测试

    redis性能测试 redis提供了一个性能测试工具redis benchmark 可以使用redis benchmark命令来了解redis的性能 redis benchmark q c 50 q 表示简化输出结果 c 50 表示有五十个
  • 现在的00后,实在是太卷了......

    现在的小年轻真的卷得过分了 前段时间我们公司来了个00年的 工作没两年 跳槽到我们公司起薪18K 都快接近我了 后来才知道人家是个卷王 从早干到晚就差搬张床到工位睡觉了 最近和他聊了一次天 原来这位小老弟家里条件不太好 一大家子指望他一个人
  • 分享十几个适合新手练习的软件测试项目

    说实话 在找项目的过程中 我下载过 甚至付费下载过 N多个项目 联系过很多项目的作者 但是绝大部分项目 在我看来 并不适合你拿来练习 它们或多或少都存在着 问题 比如 大部分项目是web项目 很难找到app项目 特别是有app安装包的项目
  • GoLong的学习之路,进阶,Viper(yaml等配置文件的管理)

    本来有今天是继续接着上一章写微服务的 但是这几天有朋友说 再写Web框架的时候 遇到一个问题 就是很多的中间件 redis 微信 mysql mq 的配置信息写的太杂了 很不好管理 希望我能写一篇有管理配置文件的 所以这篇就放到今天写吧 微
  • 2023年总结,讲讲我的故事吧,十年

    文章目录 2023 前十年 后十年 周末 本该是提升自己的最好时机 也该是出去玩的大好时光 但是毫无意外的 在家躺了一天 单纯的有点累 2023年 发生了好多事情 又好像没发生几件事 可能毕业季的我 走过了太多复杂的心路历程吧 身边的人 是
  • 外包干了5个月,技术退步太明显了。。。。。

    先说一下自己的情况 本科生生 18年通过校招进入武汉某软件公司 干了差不多4年的功能测试 今年国庆 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了5个月的功能测试 已经让我变得不思进取 谈了2年的
  • MySQL安装

    MySQL安装 MySQL在MAC下安装 下载 brew install mysql mysql server 在support files下 启动服务 mysql server start windows启动命令 net start my
  • 石头纪 Stone Story RPG免安装中文版

    石头纪 Stone Story RPG 从众多优秀的游戏作品中汲取灵感 并且利用独特的ASCII艺术动画 结合放置挂机玩法 RPG 机制 可编程要素等诸多内容 打造出完全独特的游戏体验 在 石头纪 中 玩家无法直接操控游戏角色本身 AI会自
  • 独立搭建UI自动化测试框架分享

    今天给大家分享一个selenium testng maven ant的UI自动化 可以用于功能测试 也可按复杂的业务流程编写测试用例 今天此篇文章不过多讲解如何实现CI CD 只讲解自己能独立搭建UI框架 如果有其他好的框架也可以联系我 分
  • 软件测试|Pydantic详细介绍与基础入门

    简介 Pydantic 是一个强大的 Python 库 用于数据验证和解析 特别是用于处理 JSON 数据 它的主要目标是使数据验证和解析变得简单 直观和可维护 本文将介绍 Pydantic 的基础知识 包括如何定义模型 验证数据以及处理错
  • 深入了解 Python MongoDB 查询:find 和 find_one 方法完全解析

    在 MongoDB 中 我们使用 find 和 find one 方法来在集合中查找数据 就像在MySQL数据库中使用 SELECT 语句来在表中查找数据一样 查找单个文档 要从MongoDB的集合中选择数据 我们可以使用 find one
  • 如何打赢稳定性之战?

    文章目录 前言 为什么总会出现问题呢 如何证明你的稳定性做的有效果 既是持久战 也是防御战 1 提前建筑好防御工事 2 以攻为守 3 找外部支援和配合 前言 随着23年年末期间 各大厂争先恐后的出现的各种线上
  • C# Break 和 Continue 语句以及数组详解

    C Break 它被用于 跳出 switch 语句 break 语句也可用于跳出循环 以下示例在 i 等于 4 时跳出循环 示例 for int i 0 i lt 10 i if i 4 break Console WriteLine i

随机推荐

  • uniapp-计算属性、watch 侦听器、props验证

    一 计算属性 计算属性本质上就是一个 function 函数 它可以实时监听 data 中数据的变化 并 return 一个计算后的新值 1 声明与使用计算属性 计算属性需要以 function 函数的形式声明到组件的 computed 选
  • win11不兼容很多游戏?win11不兼容哪些游戏

    很多用户升级win11系统之后 最担心的就是win11兼容性不强 很多游戏都玩不了 那到底win11不兼容哪些游戏 下面小编就来给大家讲讲 win11很多游戏不兼容 1 其实win11系统并没有那么多无法兼容的游戏 基本上win10可以兼容
  • java插入gif_Java swing(纯代码和含部分个人解析)插入png或gif图片的方法,切换界面功能的实现...

    package swing public class mains public static void main String args new swing package swing import java awt Color impor
  • 听说,你想做大模型时代的应用层创业!

    亲爱的科技探险家们和代码魔法师们 未来的钟声已经敲响 预示着一场极度炫酷的虚拟现实游戏即将展开 从初期简单的智能识别 到设计师级别的图纸设计 生成式AI技术 Generative AI 以其独特理念和创新模式重塑了传统内容生产效率和交互模式
  • Unity手机端3档震动

    using System Collections using System Collections Generic using UnityEngine public class VibrateHelper MonoBehaviour sta
  • elementui dialog组件固定高度

    弹窗高度过大 想设置个自适应的高度 固定头尾 deep el dialog margin 5vh auto important deep el dialog body height 70vh overflow auto margin hei
  • ChatGPT救命!4岁男孩3年求医17位专家无果,大模型精准揪出病因

    克雷西 萧箫 发自 凹非寺量子位 公众号 QbitAI 怪病 缠身3年求医无果 最终竟然被ChatGPT成功诊断 这是发生在一名4岁男孩身上的真实经历 某次运动后 他身体开始剧痛 母亲前后带她看了17名医生 从儿科 骨科到各种专家 先后进行
  • DeferredResult的使用场景及用法

    场景 假设我们现在要实现这样一个功能 浏览器要实时展示服务端计算出来的数据 一种可能的实现是 浏览器频繁 例如定时1秒 向服务端发起请求以获得服务端数据 但定时请求并不能 实时 反应服务端的数据变化情况 若定时周期为S 则数据延迟周期最大即
  • 小程序支付完整过程。足够详细!

    1 注册小程序 拿到App id 和 AppSecret 小程序密钥 取得商户的微信支付商户号 MCHID 和 微信支付密钥 APIKEY 2 流程 微信用户在微信端选商品下单 后台响应下单生成单号 产生第一次签名数据 提交微信统一支付接口
  • IDA工具介绍

    往期推荐 IDA工具安装 分享 ARM处理器寻址方式 ARM指令集 ARM汇编语言程序结构 昨天给大家概括性的了解了IDA工具 今天分享IDA工具的实际应用 一 IDA打开so文件 1 首先打开IDA工具 进入选项界面 直接选中Go选项 如
  • 初识 libcurl multi:实现一个 http 请求处理客户端,一个线程玩命发一个线程吐血收

    一 引言 最近在工作中 遇到了这么一个需求 我们希望拥有一个高性能的 http 请求处理客户端程序 这个客户端要求有这样的架构 它拥有两个线程 一个线程接收业务程序通过消息队列发来的批量的 http 请求信息 进行批量的 http 请求 另
  • 深入了解scratch中的“移动10步”和(你真的了解scratch吗?scratch初学者值得一看)

    scratch中的 移动10步 是scratch运动类积木中的第一个积木 也是大多数初学者使用scratch的时候用到的第一个积木命令 当我们运行 移动10步 积木时 小猫会向右移动10步 目测其实也就一点点距离 那么 移动10步 究竟在s
  • 正交多项式-勒让德多项式,两类切比雪夫多项式及零点,拉盖尔多项式,埃尔米特多项式

    1 正交多项式 设 n x 是 a
  • Linux 云服务器运维(操作及命令)

    1 什么是linux服务器load average Load是用来度量服务器工作量的大小 即计算机cpu任务执行队列的长度 值越大 表明包括正在运行和待运行的进程数越多 2 如何查看linux服务器负载 可以通过w top uptime p
  • Tomcat多实例部署

    文章目录 一 Tomcat多实例的操作步骤 1 关闭防火墙 将安装 Tomcat 所需软件包传到 opt目录下 2 安装JDK 3 安装 tomcat 4 配置 tomcat 环境变量 5 修改 tomcat2 中的 server xml
  • Qt设计模式与运行界面有偏差 Qt自适应高清屏

    原因Qt对高分辨率屏幕支持的问题 设置下属性 注意在应用程序实例之前设置 int main int argc char argv if QT VERSION gt QT VERSION CHECK 5 9 0 QApplication se
  • 安装NVIDIA CUDA失败最简单详细解决方法

    针对于这样的情况直接下载显卡驱动卸载工具 进入网站 点击下载 网页下拉 会出现如下图所示的内容 点击官方下载 下载软件 运行程序 下载完之后是一个压缩包的形式 解压缩 之后点击运行 如果不是最新版本会跳出如下弹出框 程序是否为最新版本没有影
  • 服务器怎么修改mac,服务器如何修改MAC地址

    服务器如何修改MAC地址 内容精选 换一换 如果要自定义裸金属服务器的DNS服务器信息 需要将裸金属服务器网络设置为静态IP 若将动态DHCP改为静态IP设置 IP和网关等网络信息必须和裸金属服务器下发时保持一致 否则可能会引起网络不通 以
  • Flask框架学习整理——从零开始入门Flask

    文章目录 Flask框架 一 简介 二 概要 三 知识点 附代码 1 Flask基础入门 1 路由route的创建 2 endpoint的作用 3 request对象的使用 4 请求钩子before after request 5 redi
  • Day6:浅谈useState

    目标 持续输出 每日分享关于web前端常见知识 面试题 性能优化 新技术等方面的内容 Day6 今日话题 谈谈react hooks中的useState 将从以下七个角度介绍 用法 参数 返回值 作用 工作原理 优缺点 注意点 用法 use