学习:卡颂 https://react.iamkasong.com/process/reconciler.html#%E9%80%92-%E9%98%B6%E6%AE%B5
    render阶段开始于performSyncWorkOnRoot或performConcurrentWorkOnRoot方法的调用。这取决于本次更新是同步更新还是异步更新。

    1. // performSyncWorkOnRoot会调用该方法
    2. function workLoopSync() {
    3. while (workInProgress !== null) {
    4. performUnitOfWork(workInProgress);
    5. }
    6. }
    7. // performConcurrentWorkOnRoot会调用该方法
    8. function workLoopConcurrent() {
    9. while (workInProgress !== null && !shouldYield()) {
    10. performUnitOfWork(workInProgress);
    11. }
    12. }

    区别:shouldYield。如果当前浏览器帧没有剩余时间,shouldYield会中止循环,直到浏览器有空闲时间后再继续遍历。
    performUnitOfWork——创建下一个Fiber节点,并赋值给workInProgress,并将workInProgress与创建的Fiber节点连接构成Fiber树。

    注:只有单一文本子节点的Fiber,React会特殊处理。优化点。
    demo

    1. import logo from "./logo.svg"
    2. import "./App.css"
    3. import { useState } from "react"
    4. function App() {
    5. const [num, setNum] = useState(0)
    6. return (
    7. <div className="App">
    8. <header className="App-header">
    9. <img src={logo} className="App-logo" alt="logo" />
    10. <p onClick={() => setNum(num++)}>
    11. Edit <code>{num}</code> and save to reload.
    12. </p>
    13. <a className="App-link" href="https://reactjs.org" target="_blank" rel="noopener noreferrer">
    14. Learn React
    15. </a>
    16. </header>
    17. </div>
    18. )
    19. }
    20. export default App
    1. import React from 'react';
    2. import ReactDOM from 'react-dom/client';
    3. import './index.css';
    4. import App from './App';
    5. import reportWebVitals from './reportWebVitals';
    6. const root = ReactDOM.createRoot(document.getElementById('root'));
    7. root.render(
    8. <React.StrictMode>
    9. <App />
    10. </React.StrictMode>
    11. );
    12. // If you want to start measuring performance in your app, pass a function
    13. // to log results (for example: reportWebVitals(console.log))
    14. // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
    15. reportWebVitals();