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 应该只执行一次才对。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
StrictMode 在 development mode 下一些 hooks 的回调会调用两次以确保没有副作用。
https://reactjs.org/docs/stri...