- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 React hook 定义计算(初始化)常量可以通过两种功能相同的方式执行。我不想讨论这个用例,但足以说明,在某些情况下,可以从初始 props 或状态中派生出一个常量值,而这些值预计不会改变(想想路由数据、绑定(bind)调度等) )。
首先,useState
const [calculatedConstant] = useState(calculateConstantFactory);
第二,useMemo
const calculatedConstant = useMemo(calculateConstantFactory, []);
这两者在功能上看起来是等效的,但是在不阅读源代码的情况下,我不确定在性能或其他考虑方面哪个更好。
有人做过这方面的工作吗?您会使用哪一个?为什么?
此外,我知道有些人会对状态可以“被认为是恒定的”这一假设感到反感。我不知道该告诉你什么。但即使没有状态,我也可能想在根本没有状态的组件中定义一个常量,例如,创建一个不改变的 JSX block 。
我可以在组件外部定义它,但是它会消耗内存,即使相关组件没有在应用程序中的任何地方实例化。为了解决这个问题,我必须创建一个内存函数,然后手动释放内部内存状态。对于 hooks 免费提供给我们的东西来说,这是一个非常大的麻烦。
编辑:添加了本次讨论中讨论的方法的示例。 https://codesandbox.io/s/cranky-platform-2b15l
最佳答案
You may rely on useMemo as a performance optimization, not as a semantic guarantee
意思是,从语义上来说,useMemo
不是正确的方法;您使用它的原因是错误的。因此,即使它现在按预期工作,但您使用它不正确,并且可能会导致将来出现不可预测的行为。
useState
仅当您不希望在计算值时阻塞渲染时才是正确的选择。
如果在组件的第一次渲染中不需要该值,您可以同时使用 useRef
和 useEffect
:
const calculatedConstant = useRef(null);
useEffect(() => {
calculatedConstant.current = calculateConstantFactory()
}, [])
// use the value in calcaulatedConstant.current
这与在 componentDidMount
中初始化实例字段相同。当工厂函数运行时,它不会阻止您的布局/绘制。就性能而言,我怀疑任何基准测试都会显示出显着差异。
问题是,初始化引用后,组件不会更新以反射(reflect)该值(这是引用的全部目的)。
如果您绝对需要在组件的第一次渲染上使用该值,您可以这样做:
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
基本上,如果您需要组件重新渲染自身:使用状态。如果没有必要,请使用引用。
关于reactjs - React hooks 常量的 useMemo 与 useState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57664450/
createHiveBackground 函数返回我要分配给状态的对象数组。稍后在我的应用程序中,我将使用 setHive 来更改数组的一些值。这些有什么区别? const [hive, setHiv
我很好奇为什么这么多程序员单独导入useState。 import React, { useState } from 'react'; const [foo, setFoo] = useState('
我已经设置了最基本的示例,即TODO列表当我第一次单击Done按钮时,它按预期工作:TODO项被标记为Done:True,并且“Fire”和“Setting”只触发一次。从那时起,我单击的任何按钮都会
我已经设置了最基本的示例,即TODO列表当我第一次单击Done按钮时,它按预期工作:TODO项被标记为Done:True,并且“Fire”和“Setting”只触发一次。从那时起,我单击的任何按钮都会
我正在尝试构建一个可以或不能接收查询字符串的代码。如果它收到所有查询字符串,我想执行一个函数: // state for query const [query, setQuery] = use
下面的代码有什么问题吗?使用 useState 时,我收到 typescript 警告 import * as React, { useState } from 'react' const useFo
我对此的反应是新的。我用每个开关元素创建了一个项目数组,问题是:当我单击一个项目时,所有项目都会同时激活!。我尝试了许多通过搜索找到的解决方案,但都不起作用。
我对此的反应是新的。我用每个开关元素创建了一个项目数组,问题是:当我单击一个项目时,所有项目都会同时激活!。我尝试了许多通过搜索找到的解决方案,但都不起作用。
我希望我没有重复一个问题。我看过这个:TypeError dispatcher.useState is not a function when using React Hooks ,但是我的应用程序运
当对状态、效果、上下文等使用钩子(Hook)时,我这样做: import React, { useState, useEffect, useContext } from 'react'; 但是,我注意
所以我试图在我的 nextjs 应用程序中使用 useState,但是一旦我添加了代码行来初始化 useState,它就会抛出一个带有错误消息的弹出错误:TypeError: Cannot read
我在单击表单提交按钮时使用 React useState 钩子(Hook)更新状态,直到第二次单击时状态才会更新。相信我需要使用 useEffect 但不确定如何使用 onClick 来实现。 con
是否可以从子组件内部更改 useState 的值? 家长: const [state, setState] = useState(false); return setState(true)}/> c
useState 不会立即更新状态。 我正在使用 react-select并且我需要根据请求的结果使用选择的 (multi) 选项加载组件。 出于这个原因,我创建了状态 defaultOptions
这个问题在这里已经有了答案: The useState set method is not reflecting a change immediately (15 个回答) 2年前关闭。 这是所有新
我想在触发正常函数 (handleConsultantChange) 后使用 useState 函数 (setFilterConsultantId) 更改状态 (filterConsultantId)
这是组件的完整代码,我累得想不出怎么解决这个问题 import React, { useEffect, useState } from 'react'; import { Link } from 'r
我正在尝试初始化一个常量变量,它可以用作字符串或字符串数组,具体取决于我的组件正在接收的 Prop 。 我正在尝试将其初始化为 const [selectedOptions, setSelecte
我有两个组件,一个放在另一个里面。子组件打印父组件传递的状态,并使用 useEffect 更新一次状态。在父组件中,我使用 setState(具有 bool 值的对象)并将状态传递给所有子组件。 父组
我们知道useState是FC中的一个hook,返回一个由两个元素组成的数组。第一个是状态变量,第二个是更新状态变量的函数。 const initialStateVariableValue = 0;
我是一名优秀的程序员,十分优秀!