学习:卡颂 https://react.iamkasong.com/process/reconciler.html#%E9%80%92-%E9%98%B6%E6%AE%B5
render阶段开始于performSyncWorkOnRoot或performConcurrentWorkOnRoot方法的调用。这取决于本次更新是同步更新还是异步更新。
// performSyncWorkOnRoot会调用该方法function workLoopSync() {while (workInProgress !== null) {performUnitOfWork(workInProgress);}}// performConcurrentWorkOnRoot会调用该方法function workLoopConcurrent() {while (workInProgress !== null && !shouldYield()) {performUnitOfWork(workInProgress);}}
区别:shouldYield。如果当前浏览器帧没有剩余时间,shouldYield会中止循环,直到浏览器有空闲时间后再继续遍历。
performUnitOfWork——创建下一个Fiber节点,并赋值给workInProgress,并将workInProgress与创建的Fiber节点连接构成Fiber树。
注:只有单一文本子节点的Fiber,React会特殊处理。优化点。
demo
import logo from "./logo.svg"import "./App.css"import { useState } from "react"function App() {const [num, setNum] = useState(0)return (<div className="App"><header className="App-header"><img src={logo} className="App-logo" alt="logo" /><p onClick={() => setNum(num++)}>Edit <code>{num}</code> and save to reload.</p><a className="App-link" href="https://reactjs.org" target="_blank" rel="noopener noreferrer">Learn React</a></header></div>)}export default App
import React from 'react';import ReactDOM from 'react-dom/client';import './index.css';import App from './App';import reportWebVitals from './reportWebVitals';const root = ReactDOM.createRoot(document.getElementById('root'));root.render(<React.StrictMode><App /></React.StrictMode>);// If you want to start measuring performance in your app, pass a function// to log results (for example: reportWebVitals(console.log))// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitalsreportWebVitals();
