React hooks 常量的 useMemo 与 useState

2024-01-01

使用 React hooks 定义计算(初始化)常量可以通过两种功能相同的方式执行。我不想讨论这个用例,但足以说明,在某些情况下,可以从初始 props 或状态中派生出一个常量值,而这些值预计不会改变(想想路由数据、绑定调度等) )。

First, useState

const [calculatedConstant] = useState(calculateConstantFactory);

Second, useMemo

const calculatedConstant = useMemo(calculateConstantFactory, []);

这两者在功能上看起来是等效的,但是在不阅读源代码的情况下,我不确定在性能或其他考虑方面哪个更好。

有人做过这方面的工作吗?您会使用哪一个?为什么?

另外,我知道有些人会对状态可以“被认为是恒定的”这一假设感到反感。我不知道该告诉你什么。但即使没有状态,我也可能想在根本没有状态的组件中定义一个常量,例如,创建一个不改变的 JSX 块。

我可以在组件外部定义它,但它会消耗内存,即使相关组件没有在应用程序中的任何地方实例化。为了解决这个问题,我必须创建一个记忆函数,然后手动释放内部记忆状态。对于 hooks 免费提供给我们的东西来说,这是一个非常大的麻烦。

编辑:添加了本次讨论中讨论的方法的示例。https://codesandbox.io/s/cranky-platform-2b15l https://codesandbox.io/s/cranky-platform-2b15l


您可以依赖 useMemo 作为性能优化,而不是作为语义保证 https://reactjs.org/docs/hooks-reference.html#usememo

意义、语义上useMemo不是正确的方法;您使用它的原因是错误的。因此,即使它现在按预期工作,但您使用它不正确,并且可能会导致将来出现不可预测的行为。

useState仅当您不希望在计算值时阻塞渲染时,才是正确的选择。

如果在组件的第一次渲染中不需要该值,您可以使用useRef and useEffect一起:

const calculatedConstant = useRef(null);

useEffect(() => {
  calculatedConstant.current = calculateConstantFactory()
}, [])

// use the value in calcaulatedConstant.current

这与初始化实例字段相同componentDidMount。当工厂函数运行时,它不会阻止您的布局/绘制。就性能而言,我怀疑任何基准测试都会显示出显着差异。

问题是,初始化 ref 后,组件不会更新以反映该值(这是 ref 的全部目的)。

如果您绝对需要在组件的第一次渲染上使用该值,您可以这样做:

const calculatedConstant = useRef(null);

if (!calculatedConstant.current) {
  calculatedConstant.current = calculateConstantFactory();
}
// use the value in calculatedConstant.current;

这会在设置值之前阻止您的组件呈现。

如果你不想渲染被阻塞,你需要useState和...一起useEffect:

const [calculated, setCalculated] = useState();

useEffect(() => {
  setCalculated(calculateConstantFactory())
}, [])

// use the value in calculated

基本上,如果您需要组件重新渲染自身:使用 state。如果没有必要,请使用参考。

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

React hooks 常量的 useMemo 与 useState 的相关文章

随机推荐

  • 如何访问 Pandas 系列中的最后一个元素

    让我们考虑以下数据框 import pandas as pd d col1 1 2 3 col2 3 4 5 df pd DataFrame data d 如果我想访问 pandas 系列中的第一个元素df col1 我可以简单地去df c
  • LinkedBlockingQueue 具有快速 contains(Object o) 方法?

    简而言之 我正在编写一个需要BlockingQueue实现既提供 FIFO 添加 删除 又提供快速contains方法 我将其称为 TON LinkedBlockingQueue让我大部分时间都到了那里 但看起来它contains方法以线性
  • 如何更改/覆盖 Vuetify js 中禁用字段的默认颜色?

    默认情况下 vuetify 对禁用的文本字段 项目应用浅灰色阴影 我如何将这种颜色覆盖为我想要的颜色 目前我正在使用禁用选择器 disabled color 000000 important 这仅有助于更改文本字段文本颜色的颜色 我的表单中
  • C 的 strtok() 和只读字符串文字

    char strtok c har s1 const char s2 重复调用此函数将字符串 s1 分解为 标记 即 字符串被分成子字符串 每个都以 0 结尾 其中 0 替换任何字符 包含在字符串 s2 中 第一次通话 使用要标记为 s1
  • Android - 如何以编程方式将证书存储在密钥库中?

    我正在制作一个金融交易 Android 应用程序 它需要 SSL 身份验证 我成功地完成了它 Android 和 Tomcat 之间的握手 我使用 keytool 和 openSSL 生成服务器和客户端证书 Tomcat 证书格式为 JKS
  • HTTP_HOST 服务器变量是否始终已定义?

    是服务器变量HTTP HOST总是为所有服务器定义 或者例如在 IIS 中使用其他名称定义 甚至根本没有定义 另外 该值总是被定义的 或者某些主机没有定义该值 还有其他方法可以检索该值吗 引用手册 HTTP HOST 是 Contents
  • 在多面 ggplot 中自动勾选最大值和最小值

    我试图在多面 ggplot 中标记每个 x 轴的最大值和最小值 我有几个具有不同 x 尺度和相同 y 尺度的面 并且 x 轴刻度标签相互重叠 我正在寻找一种方法来标记每个方面的最小值和最大值 而不是手动确定每个方面 x 轴的限制和中断 使用
  • 如何在 java 正则表达式中转义美元和大括号(即 ${title})?

    即你如何做到这一点 String string Sample string with title to be inserted string replaceAll title title 以下所有情况都会导致错误 string replac
  • 用最少的代码字符创建、排序和打印 100 个随机整数的列表

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 您可以编写最少的代码来创建 排序 升序 和打印 100 个随机正整数的列表 我所说的最少代码量
  • 如何减少 TensorFlow 循环中的内存消耗?

    我在 TensorFlow 中有一个循环 如下所示 with tf device gpu 1 losses for target output in zip targets lstm outputs logits tf matmul W o
  • 输入触发按键事件两次

    这个问题之前已经被问过 回答过 大部分 但是我尝试了三件事来阻止事件冒泡 但没有任何效果 return false e stopPropagation e preventDefault 返回 false 应该照顾其他两个 对吗 这是 HTM
  • SWXMLHash 解析数据对象

    我尝试与SWXMLHash为了模拟从网站下载的数据进行解析 我在 Playground 中创建了一个包含数据的文件 我收到的回复是URLSessionManager数据看起来类似于 3c3f786d 6c207665 7273696f 6e
  • Gmail API 返回 403 错误代码和“<用户电子邮件> 的委派被拒绝”

    检索邮件时 一个域的 Gmail API 失败并出现以下错误 com google api client googleapis json GoogleJsonResponseException 403 OK code 403 errors
  • 使用 Objective c 上传视频

    我现在要构建一个非常复杂 至少对我来说 的应用程序 基本应用程序如下 一个带有两个选项卡的选项卡栏应用程序 一个用于本地视频 另一个用于流媒体视频 在这个阶段很简单 但现在我必须将视频 从 iPhone 图库中获取或由用户拍摄 上传到服务器
  • 使用node或express返回json格式的正确方法

    我的问题实际上是复制自使用 Node 或 Express 返回 JSON 的正确方法 https stackoverflow com questions 19696240 proper way to return json using no
  • 如何更改 ImageView 的图像? [复制]

    这个问题在这里已经有答案了 我刚刚开始学习android 我不知道如何改变一个人的形象ImageView 即它有一些在布局中设置的图像 但我想通过编码更改该图像我应该怎么做 这是 xml 文件
  • 带偏移量的 Linux 头/尾

    Linux 中有没有一种方法可以询问 Head 或 Tail 但需要忽略额外的记录偏移量 例如 如果文件example lst包含以下内容 row01 row02 row03 row04 row05 我用head n3 example ls
  • 在页面加载时使 div 晃动?

    有没有办法让 div 框在页面加载时抖动 就像也许只有一次或两次 Update 在这个 URL 上 我的页面加载仍然无法正常工作 我做错了什么 http tinyurl com 79azbav http tinyurl com 79azba
  • React 渲染组件数组

    快问 有人知道如何渲染组件数组吗 试图让开发人员更容易地更改特定组件 它就像一个仪表板 组件列表文件 import React from react export default
  • React hooks 常量的 useMemo 与 useState

    使用 React hooks 定义计算 初始化 常量可以通过两种功能相同的方式执行 我不想讨论这个用例 但足以说明 在某些情况下 可以从初始 props 或状态中派生出一个常量值 而这些值预计不会改变 想想路由数据 绑定调度等 First