当前位置: 首页 > news >正文

React惰性初始化函数(Lazy Initializer)(首次渲染时执行一次,只执行一次,应对昂贵初始化逻辑)(传入一个函数、传入函数)

文章目录

  • 🚀 React 惰性初始化函数(Lazy Initializer)详解
    • 一、`useState` 的两种初始化方式
    • 二、为什么会这样?
      • 🧩 1. 直接传入初始值
      • ⚙️ 2. 传入一个函数(惰性初始化)
    • 三、为什么要使用惰性初始化?
    • 四、一个真实例子
    • 五、常见误区 ⚠️
    • 六、总结
    • 🧠 小结

🚀 React 惰性初始化函数(Lazy Initializer)详解

在使用 useState 时,你是否注意到有两种初始化写法?
一种是直接传入初始值,另一种是传入一个函数。
它们的区别是什么?为什么有时候我们需要传一个函数?
这就是本文要讲的主角 —— 惰性初始化函数(lazy initializer)


一、useState 的两种初始化方式

我们先从最常见的写法开始:

// 写法 1:直接传入初始值(注意:此种方法也等价于传入立即执行函数)
const [value, setValue] = useState(heavyCompute());
// 写法 2:传入一个函数
const [value, setValue] = useState(() => heavyCompute());

这两种写法的区别在于:

第一种每次渲染都会执行 heavyCompute()
第二种只会在首次渲染时执行一次


二、为什么会这样?

要理解这一点,我们得看看 React 是怎么处理这两种情况的。

🧩 1. 直接传入初始值

当你写成:

useState(heavyCompute());

React 在调用你的组件函数时,会立即执行 heavyCompute()
因为这就是一个普通的函数调用。然后把返回值传给 useState 作为初始值。

也就是说,即使 React 只是为了重新渲染(而不是重新挂载),
heavyCompute() 仍然会在组件函数执行阶段被调用。

结果就是:
每次组件渲染都会重新计算初始值 —— 即使 React 根本不会再用它。


⚙️ 2. 传入一个函数(惰性初始化)

而当你写成:

useState(() => heavyCompute());

React 会识别到你传入的是一个函数
这时它不会立刻执行,而是把这个函数存起来。

在组件第一次渲染时,React 内部才会调用这个函数来获得初始值。
之后,无论组件重新渲染多少次,这个函数都不会再被执行。

因此,它被称为 惰性初始化函数(Lazy Initializer)


三、为什么要使用惰性初始化?

主要原因是 —— 性能优化

如果你的初始 state 计算逻辑非常复杂,比如:

  • 要从 localStorage 或数据库中读取;
  • 要进行大量数据计算;
  • 或者要从一个大对象中筛选出初始状态;

那这些操作每次渲染时执行一次都会造成性能浪费。

使用惰性初始化函数后,计算只会在首次渲染时执行一次,大幅减少不必要的计算成本。


四、一个真实例子

假设我们要从本地存储中加载用户设置:

function App() {const [settings, setSettings] = useState(() => {console.log('只执行一次');const stored = localStorage.getItem('settings');return stored ? JSON.parse(stored) : getDefaultSettings();});return <SettingsPanel settings={settings} />;
}

✅ 优点:

  • 组件每次更新时,不会重复执行 localStorage.getItem()
  • 初始化逻辑清晰且性能友好;
  • React 官方推荐这种写法处理“昂贵初始化逻辑”。

五、常见误区 ⚠️

写法是否惰性执行执行次数说明
useState(heavyCompute())❌ 否每次渲染都会执行函数被立即调用
useState(() => heavyCompute())✅ 是只在首次渲染执行惰性初始化函数
useState((() => heavyCompute())())❌ 否每次渲染都会执行立即执行函数,与第一种等价

六、总结

特性惰性初始化函数
写法useState(() => initValue)
执行时机仅在首次渲染时执行
适用场景初始化逻辑复杂或性能开销大的场景
好处避免重复计算、提升性能
常见错误误用 useState(fn()) 导致重复执行

🧠 小结

当你的初始值计算过程昂贵或依赖外部资源时,
请使用 React 的 惰性初始化函数

const [value, setValue] = useState(() => heavyCompute());

这样 React 只会在首次渲染时调用它一次,让组件更高效、更优雅。


http://www.dtcms.com/a/482225.html

相关文章:

  • C++中的类
  • 网站上线 流程wordpress禁止加载谷歌字体
  • 阿里云是做网站的吗榆林公司做网站
  • 2018年10月江苏省自考《信息组织》试题
  • 跨域处理的核心是解决浏览器的“同源策略”限制,主流方案
  • Web 开发 30
  • 小迪web自用笔记62
  • Nginx 代理 WebSocket 失败排查全过程:从 426 到连接成功的完整复盘
  • multi-head attention 多头注意力实现细节
  • 第七章 完整的模型训练
  • 08-Vue3组合式API最佳实践指南
  • 山东网站建设网站做全世界的生意的网站
  • 【文献分享】通过基于大型语言模型嵌入的蛋白质的 k 均值聚类来探索同源性检测
  • Redis 黑马点评-优惠券秒杀
  • 网站页面示意图怎么做宁波北仑做网站
  • ffmpeg转化mp3至wav格式
  • 不同类型的 3D 文件格式
  • ElasticSearch 实战:全文检索与数据聚合分析的完整指南​
  • Day62 设备驱动程序开发基础与LED控制
  • 支持Word (doc/docx) 和 PDF 转成一张垂直拼接的长PNG图片工具类
  • JAVA同城预约服务家政服务美容美发洗车保洁搬家维修家装系统源码小程序+公众号+h5
  • 正规拼多多代运营公司如何优化网站结构
  • 三层前馈神经网络实战:MNIST手写数字识别
  • 深度学习(四)
  • 学习HAL库STM32F103C8T6(MQTT报文)
  • 【C++】C++11特性学习(1)——列表初始化 | 右值引用与移动语义
  • 网站布局 种类手机商城页面设计
  • 如何建设手机端网站电力公司建设安全文化
  • 红色 VR 大空间:技术赋能红色文化传承的运营价值与实践路径
  • 网络协议工程 - eNSP及相关软件安装 - [eNSP, VirtualBox, WinPcap, Wireshark, Win7]