useMemo为什么会打印两次?

发布于 2022-09-12 03:13:38 字数 2337 浏览 24 评论 0

问题描述

我正在学习 useMemo,但是发现 useMemo 执行了两次,会打印两次11,无论初始化时,还是改变 name 时。我在 useMemo 里打印 name,发现打印的是两个相同的值。

问题出现的环境背景及自己尝试过哪些方法

我用了 ts,index.tsx 中即使我把其它组件都注释掉,只留下 DemoMemo,也会打印两次。

相关代码

DemoMemo.tsx

import React, {useState} from 'react';
import Button from './Button';

function DemoMemo(){
  const [name, setName] = useState(0);
  const [content, setContent] = useState(100);
  
  return (
    <>
      <h2>useMemo</h2>
      <button onClick={() => {
        setName(new Date().getTime());
      }}>name</button>
      <button onClick={() => {
        setContent(new Date().getTime());
      }}>content</button>
      <Button name={name}>{content}</Button>
    </>
  );
}

export default DemoMemo;

Button.tsx

import React, {useMemo} from 'react';

function Button({name, children}){
  function changeName(name){
    console.log(11);
    return `${name} 改变name的方法`;
  }

  // let otherName = changeName(name);

  let otherName: string = useMemo(() => {
    console.log(name);
    return changeName(name);
  }, [name]);

  return (
    <>
      <div>{otherName}</div>
      <div>{children}</div>
    </>
  );
}

export default Button;

index.tsx

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import Counter from './Counter';
import UseReducer from './UseReducer';
import LazilyInit from './LazilyInit';
import DemoMemo from './DemoMemo';
import Callback from './Callback';
import * as serviceWorker from './serviceWorker';

ReactDOM.render(
  <React.StrictMode>
    <App />
    <Counter />
    <UseReducer />
    <LazilyInit initialCount={5} />
    <DemoMemo />
    <Callback />
  </React.StrictMode>,
  document.getElementById('root')
);

// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();

你期待的结果是什么?实际看到的错误信息又是什么?

每次修改 name,useMemo 应该只执行一次才对。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夜无邪 2022-09-19 03:13:38

StrictMode 在 development mode 下一些 hooks 的回调会调用两次以确保没有副作用。

https://reactjs.org/docs/stri...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文