reactjs - 当将组件作为函数调用而不是将其用作标签时,React 没有相同的执行顺序?

我只是在做一些实验,我注意到我是否有:

const Component1 = () => {
  console.log("Component1");
  return <div>Component1</div>;
};
const Component2 = () => {
  console.log("Component2");

  return <div>Component2</div>;
};

现在使用这样的组件时:

export default function App() {
  const [state, setState] = useState(false);
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>

      <Component1 />
      {Component2()}

      <button onClick={setState.bind(null, !state)}>Change State</button>
    </div>
  );
}

我注意到在 console.log 中 component2 出现在 component1 之前,即使它们以正确的顺序呈现,为什么会发生这种情况?

最佳答案

JSX 元素是 React.createElement 的语法糖。 React.createElement 不会立即运行其中的组件:

const TheComponent = () => {
  console.log('component being created');
};
React.createElement(TheComponent);
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div class='react'></div>

相反,它等待元素呈现

当你做的时候

<Component1 />
{Component2()}

您立即调用 Component2,但由于渲染不会立即发生 - 它会稍后发生 - Component1 需要一些时间来记录。

请注意,永远不要使用

{Component2()}

渲染元素时 - 始终使用 JSX 语法或 React.createElement,正如 React 希望您做的那样。

https://stackoverflow.com/questions/67944280/

相关文章:

typescript - 如何强制两种类型在 TypeScript 中不兼容?

mysql - Spring Boot、Java、Docker Compose,尝试在两个容器(my

python - 天蓝色函数 : How do I write my logs to Azure A

git - 如何让 Git 在 Windows 上的 RStudio 中打开提交消息?

.net-core - 仅禁用与 HealthCheck 相关的日志记录

c# - 在 UWP 中,我应该在哪里保存用户数据?

javascript - 如何测试 Chrome 扩展程序的 chrome.runtime.onIn

node.js - 在 NodeJs 中使用 Docker-compose 热重载

python - odoo 13 定制多家公司的产品和供应商

azure - Azure DevOps 中的应用程序服务名称显示未找到结果