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 的相关文章

随机推荐

  • 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