Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
168 views
in Technique[技术] by (71.8m points)

useMemo为什么会打印两次?

问题描述

我正在学习 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 应该只执行一次才对。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share

2.1m questions

2.1m answers

63 comments

56.5k users

...