重新初始化状态

时间:2021-04-22 09:31:30

标签: javascript reactjs

我有一个带有一些“动态”导入的复杂组件。

我在 codeandbox 上重新创建了我的组件树:https://codesandbox.io/s/clever-rosalind-t3cfm?file=/src/App.js:298-302

我有一个 App.js 文件,其中有一个对象列表。每个对象,呈现一个 RenderWidget 组件。

RenderWidget 中,我需要获得一个“动态”组合。 (我用一个简单的函数重新创建了它,但在那部分我有更多的复杂性)。所以我将 comp 包裹在 useMemo 上以避免重新创建组件。 (useMemo 有一个 console.log 来检查 Comp 是否重新初始化)

Comp 中,我们有一个 useState 声明,其初始值如下:

const getData = () => {
   console.log("getData called");
   return Math.random();
 };

const [data, setData] = useState(getData());

如果您点击 H1,我们会强制更新 App.js。如果您检查控制台,则每次单击 H1 时都会得到“调用 getData”。

为什么?

2 个答案:

答案 0 :(得分:1)

如果父组件 props 发生变化,它将重新渲染其所有子组件,您可以使用 React.memo 来防止不必要的重新渲染。

我也建议你阅读这篇article,它是由 react 核心团队的作者写的, 除了memo,还有其他方法可以防止重新渲染

export default memo(function RenderWidget() {
  const LocalComp = useMemo(() => {
    console.log("NO RE-INITIALIZED");
    return getComp();
  }, []);

  return <LocalComp />;
});

答案 1 :(得分:0)

我得到了答案!

对于“懒惰”的初始值,我们需要这样调用函数:

// Replace that
const [data, setData] = useState(getData());

// With that
const [data, setData] = useState(() => getData());
相关问题