有一个关于useState的问题,在设置初始useState值时使用多个条件是一个好主意吗?
刚拿到一个项目,我看到了很多这样的事情,对我来说,它似乎会导致性能问题/不必要的渲染?
例子:
function MyComponent({ isInitialized, isValueTrue }) {
const isMammal = useMammal();
const [showBanner, setBanner] = useState(!isMammal && isInitialized && isValueTrue);
useEffect(() => {
// dome something
}, [showBanner]);
}
1条答案
按热度按时间68bkxrlz1#
给定代码:
问题1
在设置初始useState值时使用多个条件是一个好主意吗?
如果这是你所关心的,这不是一个坏主意。传递给
useState
挂钩的初始值仅在组件安装时计算一次。参见懒惰初始状态
initialState
参数是初始渲染期间使用的状态。在后续渲染中,它将被忽略。如果初始状态是昂贵计算的结果,则可以改为提供一个函数,该函数将仅在初始渲染时执行:问题2
刚拿到一个项目,我看到了很多这样的事情,对我来说,它似乎会导致性能问题/不必要的渲染?
不,这段代码似乎不可能实现。由于以下三个原因中的一个原因导致组件重新提交:
1.组件将状态更新排队并触发重新提交。
1.传递的道具值更改值。
1.父组件或祖先组件重新呈现,并随后重新呈现其整个子ReactTree。
我建议这里不要使用state。实际上,将派生状态存储在状态中被认为是React反模式。在这种情况下,
showBanner
值很容易从useMammal
钩子的返回值和传递的props中导出。您只需在组件中本地计算showBanner
值。例子:
如果出于某种原因,根据上面列出的原因之一,重新计算太频繁,并且/或者表达式是“heavy”,那么您可以/应该通过
useMemo
钩子对其进行记忆。例子: