Day6:浅谈useState

news2024/11/27 8:24:47

「目标」: 持续输出!每日分享关于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 多平台发布

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

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

相关文章

Hugging News #0904: 登陆 AWS Marketplace

每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「Hugging News」。本期 Hugging News 有哪些有趣的消息&#xff0…

VMware虚拟机安装CentOS7设置静态ip

vim /etc/sysconfig/network-scripts/ifcfg-ens33修改BOOTPROTO的值为static 增加最后那四项,参数在编辑,虚拟网络编辑器里面看

合宙Air724UG LuatOS-Air LVGL API控件-滑动条 (Slider)

滑动条 (Slider) 滑动条看起来和进度条是有些是有些像,但不同的是滑动条可以进行数值选择。 示例代码 -- 回调函数 slider_event_cb function(obj, event)if event lvgl.EVENT_VALUE_CHANGED then local val (lvgl.slider_get_value(obj) or "0")..&…

手写bind方法

<script>/** 手写bind方法* */Function.prototype.myBind function (thisArg, ...args) {return (...newArgs) > {return this.call(thisArg, ...args, ...newArgs)}}const obj {name: zs,age: 18,}function fn (a, b, c) {console.log(this)console.log(a b c)re…

《数据出境安全评估办法》解读

一、数据出境的统一评估体系正式确立 自我国《网络安全法》规定了关键信息基础设施运营者的重要数据与个人信息出境评估制度后&#xff0c;至今历时五年&#xff0c;关于数据出境及个人信息出境安全评估的立法体例、评估机制一直在探索过程中。 其后&#xff0c;国家互联网信…

PYTHON知识点学习-字典

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由 Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

java IO流(三) 转换流 打印流

转换流 前面我们学习过FileReader读取文件中的字符&#xff0c;但是FileReader默认只能读取UTF-8编码格式的文件。如果使用FileReader读取GBK格式的文件&#xff0c;可能存在乱码&#xff0c;因为FileReader遇到汉字默认是按照3个字节来读取的&#xff0c;而GBK格式的文件一个…

如何写一个sh脚本将一个本地文件通过 scp命令上传到远程的 centos服务器?

如何写一个sh脚本将一个本地文件通过 scp命令上传到远程的 centos服务器&#xff1f; 1.1 背景需求1.2 解决方案1.3 附录1.3.1 scp命令用法与示例1.3.1.1 scp命令用法与解释1.3.1.2 scp 命令用法示例1.3.1.2.1 示例一&#xff1a;从本地复制文件到远程计算机1.3.1.2.2 示例二&a…

Sqlserver 在 SELECT 语句中显示来自 GROUP BY 子句中未涉及的列

在SQL Server中&#xff0c;如果您在GROUP BY子句中对某些列进行了分组&#xff0c;但想在SELECT语句中同时显示未涉及到的其他列&#xff0c;您可以使用聚合函数和子查询的方法来实现。这可以通过在GROUP BY子查询中获取需要的聚合值&#xff0c;并在外部查询中选择其他列来完…

Java复习-20-接口(3)- 代理设计模式

代理设计模式(Proxy) 功能&#xff1a;可以帮助用户将所有的开发注意力只集中在核心业务功能的处理上。 代理模式(Proxy Pattern)是一种结构性模式。代理模式为一个对象提供了一个替身&#xff0c;以控制对这个对象的访问。即通过代理对象访问目标目标对象&#xff0c;可以在目…

复旦-华盛顿EMBA:走近亿咖通科技,探寻汽车智能化的科创“密码”

6月20日&#xff0c;应复旦大学-华盛顿大学EMBA项目18班校友周靖的邀请&#xff0c;项目校友参访了科创企业ECARX亿咖通科技。作为该公司资深副总裁、中国首席财务官&#xff0c;周靖带领大家通过产品演示、实车驾驶和交流对话探寻汽车智能化的科创“密码”&#xff0c;近距离感…

1.初识爬虫

爬虫是批量模拟网络请求的程序&#xff0c;想百度谷歌这种搜索类网站本质上就是爬虫 使用爬虫的时候不应该对别人的网站有严重的影响&#xff0c;比如你爬的频率太高了&#xff0c;让人家的网站崩溃了。不应该爬取网页上显示不到的内容&#xff0c;比如有一个直播的网站&#…

【SLAM】G2O优化库超详细解析

G2O&#xff0c;与ceres并列为目前视觉SLAM中应用最广泛的优化算法库。它最大的特点就是基于图优化设计&#xff0c;这对于视觉SLAM来说是异常适配的。在很多的SLAM库的中都使用到它来进行优化操作&#xff0c;比如ORB-SLAM。 代码仓库&#xff1a;https://github.com/RainerK…

渗透测试漏洞原理之---【不安全的反序列化】

文章目录 1、序列化与反序列化1.1、引入1.2、序列化实例1.2.1、定义一个类1.2.2、创建 对象1.2.3、反序列化1.2.4、对象注入 2、漏洞何在2.1、漏洞触发2.1.2、定义一个类2.1.3、定义一个对象2.1.3、反序列化执行代码 2.2 为什么会这样 3、反序列化漏洞攻防3.1、PHP反序列化实例…

[杂谈]-快速了解LoRaWAN网络以及工作原理

快速了解LoRaWAN网络以及工作原理 文章目录 快速了解LoRaWAN网络以及工作原理1、LoRaWAN网络元素1.1 终端设备&#xff08;End Devices&#xff09;1.2 网关&#xff08;Gateways&#xff09;1.3 网络服务器&#xff08;Net Server&#xff09;1.4 应用服务器&#xff08;Appli…

计算机网络的故事——确认访问用户身份的认证

确认访问用户身份的认证 HTTP使用的认证方式&#xff1a;BASIC认证&#xff08;基本认证&#xff09;、DIGEST&#xff08;摘要认证&#xff09;、SSL客户端认证、FormBase认证&#xff08;基于表单认证&#xff09;。 基于表单的认证&#xff1a;涉及到session管理以及cookie…

Mock 基本使用

mock解决的问题 开发时&#xff0c;后端还没完成数据输出&#xff0c;前端只好写静态模拟数据。数据太长了&#xff0c;将数据写在js文件里&#xff0c;完成后挨个改url。某些逻辑复杂的代码&#xff0c;加入或去除模拟数据时得小心翼翼。想要尽可能还原真实的数据&#xff0c…

【Springcloud】Sentinel熔断和降级

【Springcloud】Sentinel熔断和降级 【一】基本介绍【1】什么是熔断和降级【2】为什么使用熔断和降级【3】Sentinel熔断和降级【4】核心概念 【二】下载方式【1】Windows平台安装包下载【2】打开控制台 【三】使用案例【1】添加依赖【2】添加Sentinel配置【3】添加TestUserCont…

网络类型+二层封装技术

一、网络类型分类 1、点到点网络 在一个网段中&#xff0c;只能部署两个节点&#xff08;两个IP&#xff09;&#xff0c;如GRE环境就属于虚拟的点到点网络类型&#xff0c;通常是串线连接。 如下图当前只存在两个节点&#xff0c;但并不是点到点&#xff0c;因为它中间网段…

简易版人脸识别qt opencv

1、配置文件.pro #------------------------------------------------- # # Project created by QtCreator 2023-09-05T19:00:36 # #-------------------------------------------------QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsTARGET 01_face TEMP…