问答

useMemo为什么会打印两次?

作者:admin 2021-07-18 我要评论

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

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

问题描述

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

###

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

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

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • useMemo为什么会打印两次?

    useMemo为什么会打印两次?

  • CentOS 更换国内源的问题

    CentOS 更换国内源的问题

  • vuecli怎么配置多页某个页面不引入任何

    vuecli怎么配置多页某个页面不引入任何

  • 关于 Type接口和ParameterizedType接口

    关于 Type接口和ParameterizedType接口

腾讯云代理商
海外云服务器