如何使用钩子设置常量 'state' 变量?
How to set a constant 'state' variable using hooks?
假设我有一些状态变量 width
,我知道它永远不会改变,但我需要 运行 根据收到的道具对其进行一些计算。我不想在函数体中执行此操作,因为它会在每次重新渲染时 运行。所以:
const SOME_CONSTANT_NUMBER = 50;
const someFunc = ({multiplier: number}) => {
const [width, setWidth] = useState(SOME_CONSTANT_NUMBER * multiplier);
return (
<div>
{width}
</div>
);
}
现在我还实例化了一个我永远不会使用的函数 setWidth
。
我只能在挂载时使用挂钩 运行,但那是更多的代码,不是必需的。
const SOME_CONSTANT_NUMBER = 50;
const someFunc = ({multiplier: number}) => {
const [width, setWidth] = useState(0);
useHook(() => {
const updatedWidth = SOME_CONSTANT_NUMBER * multiplier;
setWidth(updatedWidth);
}, []);
return (
<div>
{width}
</div>
);
}
我认为最糟糕的方法如下,因为它会在每次重新渲染时计算它:
const SOME_CONSTANT_NUMBER = 50;
const someFunc = ({multiplier: number}) => {
const width = SOME_CONSTANT_NUMBER * multiplier;
return (
<div>
{width}
</div>
);
}
*注意这个例子很简单,但假设有更多的道具,并且这个 width
的计算量很大。
正是那个用例 useMemo
。
const width = useMemo(() => SOME_CONSTANT_NUMBER * multiplier, [multiplier]);
请注意,useMemo
本身会产生成本(这是另一个函数),因此只有在您知道计算该值 非常昂贵 时才应使用它,这意味着:导致滞后(如果不是,你应该真正检查性能,useMemo
是否会增加它)。
你真的不需要在状态上对其进行序列化,但让我们按照你的方法去做:
const MY_RATIO = 3
const SomeComponent = ({value}) =>{
const [state, setter] = useState(value * MY_RATIO)
useEffect(() =>{
setter(value * MY_RATIO)
}, [value, MY_RATIO])
}
现在你只在你的 prop value
改变时更新状态。但更好的方法是使用 useMemo
const memoizedValue = useMemo(() => MY_RATIO * value, [MY_RATIO, value])
看来你应该使用 useMemo 挂钩 https://reactjs.org/docs/hooks-reference.html#usememo
const width = useMemo(() => SOME_CONSTANT_NUMBER * multiplier , [multiplier])
假设我有一些状态变量 width
,我知道它永远不会改变,但我需要 运行 根据收到的道具对其进行一些计算。我不想在函数体中执行此操作,因为它会在每次重新渲染时 运行。所以:
const SOME_CONSTANT_NUMBER = 50;
const someFunc = ({multiplier: number}) => {
const [width, setWidth] = useState(SOME_CONSTANT_NUMBER * multiplier);
return (
<div>
{width}
</div>
);
}
现在我还实例化了一个我永远不会使用的函数 setWidth
。
我只能在挂载时使用挂钩 运行,但那是更多的代码,不是必需的。
const SOME_CONSTANT_NUMBER = 50;
const someFunc = ({multiplier: number}) => {
const [width, setWidth] = useState(0);
useHook(() => {
const updatedWidth = SOME_CONSTANT_NUMBER * multiplier;
setWidth(updatedWidth);
}, []);
return (
<div>
{width}
</div>
);
}
我认为最糟糕的方法如下,因为它会在每次重新渲染时计算它:
const SOME_CONSTANT_NUMBER = 50;
const someFunc = ({multiplier: number}) => {
const width = SOME_CONSTANT_NUMBER * multiplier;
return (
<div>
{width}
</div>
);
}
*注意这个例子很简单,但假设有更多的道具,并且这个 width
的计算量很大。
正是那个用例 useMemo
。
const width = useMemo(() => SOME_CONSTANT_NUMBER * multiplier, [multiplier]);
请注意,useMemo
本身会产生成本(这是另一个函数),因此只有在您知道计算该值 非常昂贵 时才应使用它,这意味着:导致滞后(如果不是,你应该真正检查性能,useMemo
是否会增加它)。
你真的不需要在状态上对其进行序列化,但让我们按照你的方法去做:
const MY_RATIO = 3
const SomeComponent = ({value}) =>{
const [state, setter] = useState(value * MY_RATIO)
useEffect(() =>{
setter(value * MY_RATIO)
}, [value, MY_RATIO])
}
现在你只在你的 prop value
改变时更新状态。但更好的方法是使用 useMemo
const memoizedValue = useMemo(() => MY_RATIO * value, [MY_RATIO, value])
看来你应该使用 useMemo 挂钩 https://reactjs.org/docs/hooks-reference.html#usememo
const width = useMemo(() => SOME_CONSTANT_NUMBER * multiplier , [multiplier])