当前位置: 首页 > 知识库问答 >
问题:

组件渲染两次吗?这是代码沙盒问题吗?

华欣怡
2023-03-14

以下是我的简单反应应用程序:

let idCounter = 0;

export default function App() {
  const id = useMemo(() => {
    console.log("useMemo");
    return idCounter++;
  }, []);

  console.log("render", id);

  useEffect(() => {
    console.log("useEffect", id);
  });

  return id;
}

https://codesandbox.io/s/morning-bush-swky8

这是控制台输出:

useMemo
render 0
useEffect 1

为什么在用效应id等于1?

看起来组件已经呈现了两次,但是为什么第二次没有调用useMemo和useEffect呢?我是怎么变成1的?

共有1个答案

呼延德华
2023-03-14

从React Docs-严格模式:

从React 17开始,React自动修改控制台方法,如console。log()以在对生命周期函数的第二次调用中使日志静音。但是,在可以使用变通方法的某些情况下,它可能会导致不期望的行为。

组件确实渲染了两次,但在由StrictMode引起的第二次重新渲染期间,React会隐藏日志语句。

如果删除StrictMode,您将获得预期的输出。

另一个选项是在控制台对象上使用不同的方法进行日志记录,例如console.dir

let idCounter = 0;

function App() {
  const id = React.useMemo(() => {
    console.dir("useMemo");
    return idCounter++;
  }, []);

  console.dir("render");
  console.dir(id);

  React.useEffect(() => {
    console.log("useEffect", id);
  });

  return id;
}

ReactDOM.render(
  <React.StrictMode>
    <App/>
  </React.StrictMode>, 
  document.querySelector("#root")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.development.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.development.min.js"></script>

<div id="root"></div>
 类似资料:
  • 此组件渲染两次并抛出错误。我知道这个错误是因为它们在reduce函数中没有返回语句。但我不明白的是,为什么它会渲染两次? 此外,当我删除代码时,它只呈现一次。据我所知,一个组件只能在四种情况下重新渲染 状态的变化 道具的变化 强制渲染 父母重新渲染。 在我的例子中,父组件没有重新渲染(我通过在父组件中使用console.log检查了它),并且这个组件是无状态的,没有道具被传递给它。有人能解释一下这

  • 我有一个应用程序组件和测试组件 应用程序组件 测试组件:

  • 所以就像标题所说的,我的应用程序的主页因为某种原因渲染了两次,我不知道为什么。从我的浏览器路由器,我最初调用一个JS文件,从那里我调用我的HomePage组件和React路由器,但然后我的页面渲染两次,我不知道为什么。 我的浏览器路由器(index.js): 然后pp.js被称为: 然后我的主页组件(index.jsx): 和路线。js: 但是我的页面是这样渲染的: 我真的很困惑,所以任何建议都会

  • 非常简单的例子:我的App.js文件读取 我的Test.js文件上写着 在控制台中,渲染总是打印两次。为什么啊?

  • 我遇到了这个简单的React函数组件,它渲染四次,而我希望它最初渲染一次,执行useffect更新状态,然后再次渲染。相反,控制台发送4个日志输出,表示它渲染了4次。了解react功能组件的基本生命周期的原因和资源吗? https://codesandbox.io/s/solitary-tree-t120d?file=/src/App.js:149-191

  • 也许你们中的一些人可以帮我睁开眼睛。 我不明白为什么在这段代码中:https://codesandbox.io/s/use-state-renders-twice-6r1xl组件应用程序在安装并单击按钮时呈现两次(console.log被调用两次) 代码: 结果: 它只是一个功能组件挂钩!