You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React组件中能否使用普通let/const变量替代useState或useRef?

第一个问题:是否存在可以直接声明普通变量的场景?

存在,并不是所有组件内的变量都需要用useState或useRef包裹,符合以下两种情况的变量直接用普通let/const声明是完全正确的写法:

  • 变量是不会变化的静态常量:比如组件内固定的枚举值、分页大小、静态配置参数等,例如const MAX_UPLOAD_SIZE = 10 * 1024 * 1024,这类值从始至终不会变,完全不需要用到Hook。
  • 变量仅在单次执行逻辑中使用,不需要跨渲染保留值,也不需要触发视图更新:比如事件处理函数内的临时计算变量、渲染过程中的临时中间值,例如在提交表单的函数里声明let formData = new FormData(),这个变量只在本次提交逻辑里生效,不需要留存到下一次渲染,直接写普通声明即可。

只有满足以下两个需求之一的变量,才需要用到Hook:

  1. 变量变化后需要触发组件重新渲染、更新视图 → 用useState
  2. 变量值需要跨多次渲染留存,不会在组件重渲染时被重置,但不需要触发重渲染 → 用useRef

第二个问题:能否把let a = useRef(null)直接替换为let a = null?

绝对不能,二者的核心作用完全不同:

  • useRef返回的是一个引用对象,这个对象在组件的整个生命周期内都是同一个实例,你修改a.current的值后,无论组件重渲染多少次,后续读取到的a.current都是最新修改后的值。
  • 如果直接写成let a = null,组件每次重渲染都会重新执行一遍组件函数的代码,变量a会被重新初始化赋值为null,你之前对a的所有修改都会直接丢失。

举个实际场景的例子:如果你要存定时器的ID用于后续清除,用普通变量的话,只要组件因为其他状态变化触发重渲染,存的定时器ID就会被重置为null,后续无法正常清除定时器,会导致内存泄漏,这种场景必须用useRef来存值。

内容的提问来源于stack exchange,提问作者Gregory Kafanov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:48:03