React useState,多个初始条件

mzmfm0qo  于 2022-10-22  发布在  React
关注(0)|答案(1)|浏览(148)

有一个关于useState的问题,在设置初始useState值时使用多个条件是一个好主意吗?
刚拿到一个项目,我看到了很多这样的事情,对我来说,它似乎会导致性能问题/不必要的渲染?
例子:

function MyComponent({ isInitialized, isValueTrue }) {
    const isMammal = useMammal();

    const [showBanner, setBanner] = useState(!isMammal && isInitialized && isValueTrue);

    useEffect(() => {
        // dome something
    }, [showBanner]);
}
68bkxrlz

68bkxrlz1#

给定代码:

function MyComponent({ isInitialized, isValueTrue }) {
  const isMammal = useMammal();

  const [showBanner, setBanner] = useState(
    !isMammal && isInitialized && isValueTrue
  );

  useEffect(() => {
    // dome something
  }, [showBanner]);

  ...
}

问题1

在设置初始useState值时使用多个条件是一个好主意吗?
如果这是你所关心的,这不是一个坏主意。传递给useState挂钩的初始值仅在组件安装时计算一次。
参见懒惰初始状态
initialState参数是初始渲染期间使用的状态。在后续渲染中,它将被忽略。如果初始状态是昂贵计算的结果,则可以改为提供一个函数,该函数将仅在初始渲染时执行:

const [state, setState] = useState(() => {
  const initialState = someExpensiveComputation(props);
  return initialState;
});

问题2

刚拿到一个项目,我看到了很多这样的事情,对我来说,它似乎会导致性能问题/不必要的渲染?
不,这段代码似乎不可能实现。由于以下三个原因中的一个原因导致组件重新提交:
1.组件将状态更新排队并触发重新提交。
1.传递的道具值更改值。
1.父组件或祖先组件重新呈现,并随后重新呈现其整个子ReactTree。
我建议这里不要使用state。实际上,将派生状态存储在状态中被认为是React反模式。在这种情况下,showBanner值很容易从useMammal钩子的返回值和传递的props中导出。您只需在组件中本地计算showBanner值。
例子:

function MyComponent({ isInitialized, isValueTrue }) {
  const isMammal = useMammal();

  const showBanner = !isMammal && isInitialized && isValueTrue;

  useEffect(() => {
    // do something
  }, [showBanner]);

  ...
}

如果出于某种原因,根据上面列出的原因之一,重新计算太频繁,并且/或者表达式是“heavy”,那么您可以/应该通过useMemo钩子对其进行记忆。
例子:

function MyComponent({ isInitialized, isValueTrue }) {
  const isMammal = useMammal();

  const showBanner = useMemo(() => {
    return !isMammal && isInitialized && isValueTrue;
  }, [isMammal, isInitialized, isValueTrue]);

  useEffect(() => {
    // do something
  }, [showBanner]);

  ...
}

相关问题