精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深度掌握 ReactJS 高級概念:前端開發者必備

開發 前端
ReactJS 的核心運行機制就是把 JSX 轉成 ??React.createElement()?? 調用,再把這些 “React Element” 組成虛擬 DOM。

這篇文章匯總了 ReactJS 中值得深入研究的高級概念。讀完后,不僅在前端面試中能更胸有成竹,還能自行開發一個類似 ReactJS 的 UI 庫。

目錄

  1. Rendering 的含義與過程
  2. Re-rendering 發生的機制及原因
  3. Virtual DOM 的原理
  4. Reconciliation 算法的運行方式
  5. ReactJS 的性能優化方案

1. 什么是 Rendering?它是如何進行的?

在 React 中,我們常提到 “渲染(Rendering)”。本質上,它是把 JSX 或通過 React.createElement() 生成的元素轉換為實際的 DOM 節點,讓頁面在瀏覽器中展現出來。

JSX 與 React.createElement()

JSX(JavaScript XML)是一種 React 引入的語法糖。瀏覽器只能理解 JavaScript,所以 JSX 需要先經過 Babel 編譯成 React.createElement() 的調用,才會生成所謂的 “React Element”(一個純粹的 JavaScript 對象)。

示例:

例 1

// JSX 寫法
const jsx = <h1>Hello, React!</h1>;

// Babel 轉換后
const element = React.createElement("h1", null, "Hello, React!");

image.png

例 2

const Jsx = <h1 className="title">Hello, React!</h1>;

// Babel 轉換后
const element = React.createElement("h1", { className: "title" }, "Hello, React!");

例 3

<div>
  <h1>Hello</h1>
  <p>Welcome to React</p>
</div>

// Babel 轉換后

const element = React.createElement(
  "div",
  null,
  React.createElement("h1", null, "Hello"),
  React.createElement("p", null, "Welcome to React")
);

例 4

const Jsx = <Card data = {cardData} />

// Babel 轉換后
const element = React.createElement(Card, { data: cardData })

React.createElement(type, props, ...children) 會返回一個描述 DOM 結構的 JS 對象,如:

{
  type: "h1",
  props: {
    className: "title",
    children: "Hello, React!"
  },
  key: null,
  ref: null,
  ...
}

React 最終會根據這些對象來構造真實 DOM。

初次渲染(Initial Rendering)

初次渲染的流程大致是:

  1. React 組件(函數式/類)返回 JSX
  2. Babel 將其轉換為 React Element
  3. React 構建出一份虛擬的 DOM 結構(Virtual DOM)
  4. React 將虛擬 DOM 與真實 DOM 同步,頁面上出現相應的節點

大型應用通常有成百上千個組件嵌套,最終 React 會構建出巨大的虛擬 DOM 樹,再將其 “映射” 到真實 DOM。初次加載時生成的真實 DOM 較多,耗時也更多。

2. 什么是 Re-rendering,組件何時會重新渲染?

Re-rendering 指組件為了更新 UI,會再次執行渲染過程。React 只在需要時重新渲染,而不是盲目全量刷新,以提高效率。

觸發重新渲染的場景

  • State 變化
    當 useState 或 this.setState 更新了 state,組件會重新渲染。
import React, { useState } from "react";

function Counter() {
  const [count, setCount] = useState(0);

  console.log("Counter Re-Rendered!");

  return (
    <div>
      <h1>Count: {count}</h1>
      <button notallow={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}

export default Counter;
  • Props 改變
    如果父組件傳遞的新 props 和舊 props 不同,子組件會重新渲染。
function Parent() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <Child count={count} />
      <button notallow={() => setCount(count + 1)}>Update Count</button>
    </div>
  );
}


function Child({ count }) {
  console.log("Child Re-Rendered!");

  return <h1>Count: {count}</h1>;
}

export default Parent;
  • 父組件重渲染
    只要父組件重新渲染,即使子組件的 props 沒變,子組件也默認跟著渲染。
function Parent() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <Child />
      <button onClick={() => setCount(count + 1)}>Re-Render Parent</button>
    </div>
  );
}

function Child() {
  console.log("Child Re-Rendered!");
  return <h1>Hello</h1>;
}

點按鈕后,父組件因為 state 改變而重渲染,Child 也跟著渲染。如果不想子組件重復渲染,可以使用 React.memo(Child),阻止不必要的更新。

React 18+ 中的嚴格模式雙重渲染

在開發模式下,<React.StrictMode> 會讓組件在初始化時執行兩次渲染,以檢測副作用。這在生產環境不會觸發,只需要知道這是為了幫助開發調試即可。

import React from "react";
import ReactDOM from "react-dom";

function App() {
  console.log("Component Rendered!");
  return <h1>Hello</h1>;
}

ReactDOM.createRoot(document.getElementById("root")).render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

3. 理解 Virtual DOM

虛擬 DOM(V-DOM)是 React 在內存中維護的一份輕量級 DOM 結構,能顯著減少對真實 DOM 的頻繁操作。

  • 真實 DOM 操作昂貴
  • 虛擬 DOM 先在內存中對比,再只更新有差異的地方

工作流程

  • 生成初始虛擬 DOM
  • 數據或 props 變動時,生成新的虛擬 DOM
  • 對比新舊虛擬 DOM 的差別(Diff 過程)
  • 有變化的地方才更新真實 DOM

這種按需更新機制提升了性能。比方說文本從 “Count: 0” 變成 “Count: 1”,React 只會修改文本內容,而不會重新創建整個 <h1> 標簽。

4. Reconciliation:React 的高效更新算法

Reconciliation 是 React 用來高效處理 DOM 更新的過程,核心是 Diff 算法。

Diff 規則

  • 不同類型的元素
    如果 type 變了(比如從 <h1> 變 <p>,或從 Card 組件變成 List 組件),React 會銷毀原節點并新建節點。
function App({ showText }) {
  return showText ? <h1>Hello</h1> : <p>Hello</p>;
}
  • 相同類型的元素
    如果 type 相同,只更新變更部分。例如修改屬性或文本內容。
function App({ text }) {
  return <h1 className="title">{text}</h1>;
}

將 text 從 "Hello" 改為 "World" 會使 React 僅更新文本。

  • 列表中的 Key
    當使用 map() 渲染列表時,務必給每個項加唯一 key,這樣 React 才能跟蹤列表項,做最小化更新。如果沒有 key(或 key 不唯一),React 很可能重渲染整個列表,導致性能浪費。

代碼錯誤(無key) → diff 效率低

function List({ items }) {
  return (
    <ul>
      {items.map((item) => (
        <li>{item}</li>
      ))}
    </ul>
  );
}

如果在開始時添加了一個新項目,React 會重新渲染所有 <li> 元素,這樣做很慢,因為 React 無法跟蹤沒有鍵的單個項目。

良好代碼(key) → 優化對賬

function List({ items }) {
  return (
    <ul>
      {items.map((item) => (
        <li key={item.id}>{item.name}</li>
      ))}
    </ul>
  );
}

5. ReactJS 的性能優化技巧

5.1 React.memo():防止不必要的子組件重復渲染

在父組件刷新而子組件 props 未變的情況下,React.memo(Child) 能阻止子組件重復渲染。

const ChildComponent = React.memo(({ count }) => {
  console.log("Child render");
  return <h2>Count: {count}</h2>;
});

只要 count 沒變化,就不會重復渲染。

5.2 useMemo():緩存昂貴計算結果

如果某個函數計算量大且多次使用相同參數,可以用 useMemo 緩存結果,避免重復計算。

function expensiveComputation(num) {
  console.log("Computing...");
  return num * 2; 
}

function App() {
  const [number, setNumber] = useState(5);
  const memoizedValue = useMemo(() => expensiveComputation(number), [number]);

  // 每次渲染,只要 number 不變,就不會重復執行 expensiveComputation
  return <h2>Computed Value: {memoizedValue}</h2>;
}

5.3 useCallback():緩存函數引用,減少子組件不必要的渲染

React 每次渲染都會重新創建函數。如果子組件接收函數作為 props,默認會認為 props 變了,進而觸發子組件渲染。用 useCallback() 可以讓函數在依賴不變時保持相同引用。

function App() {
  const [count, setCount] = useState(0);

  const handleClick = useCallback(() => {
    console.log("Button clicked");
  }, []);

  return (
    <div>
      <ChildComponent onClick={handleClick} />
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}

這樣 ChildComponent 不會因為 onClick prop 每次都換新函數而被動重渲染。

總結

ReactJS 的核心運行機制就是把 JSX 轉成 React.createElement() 調用,再把這些 “React Element” 組成虛擬 DOM。通過比較新舊虛擬 DOM 的差異(Reconciliation),React 能用最小代價更新真實 DOM?;谶@個原理,就能延伸出許多優化策略,比如:

  • 使用 React.memo 防止子組件反復刷新
  • 通過 useMemo、useCallback 緩存耗時操作及函數引用
  • 在列表中使用 key,避免不必要的遍歷和重繪

這些技巧能夠在大規模項目中讓性能和可維護性都大幅提升,也是真正掌握 ReactJS 的關鍵所在。

責任編輯:武曉燕 來源: 大遷世界
相關推薦

2021-12-15 20:06:48

ReactJSSentry開發者

2019-03-12 10:38:18

前端開發Nginx

2021-04-08 10:40:24

前端工具代碼

2013-08-08 10:26:08

前端開發Web

2013-10-08 10:42:27

前端開發開發

2021-04-01 07:52:57

前端開發技術熱點

2025-01-23 13:58:17

2025-03-11 11:00:00

后端前端開發

2025-06-09 02:11:00

2024-08-09 15:01:00

2023-11-30 15:30:19

Python編程語言

2025-07-11 02:20:00

2012-02-13 10:21:11

Skala PreviiOS應用

2017-01-16 13:15:19

前端開發者清單

2013-07-19 09:47:57

White ElephHadoopLinkedIn

2011-03-01 13:10:06

WebjQueryHTML 5

2013-12-30 13:46:27

Android開發者

2011-01-11 11:35:17

jQueryAndroidgoogle

2014-04-18 13:20:34

Android安卓開發工具

2017-10-23 09:27:47

點贊
收藏

51CTO技術棧公眾號

xxxxxxxxx欧美| 久久99精品视频| 欧美色大人视频| 日韩黄色影视| 91免费视频播放| 国产精品毛片一区二区在线看| 欧美精品成人一区二区三区四区| 制服诱惑一区| 不卡视频免费在线观看| 精品999日本| 精品视频久久久久久久| 欧美自拍小视频| 人人干在线视频| 国产福利一区二区三区视频在线 | caoporm免费视频在线| 老司机午夜精品视频在线观看| 亚洲欧洲偷拍精品| 亚洲天堂国产视频| 午夜伦理在线视频| 97久久精品人人做人人爽 | 阿v视频在线观看| 久久亚洲精品国产精品紫薇| 国产精品久久久久影院日本| 丝袜 亚洲 另类 欧美 重口| 都市激情亚洲欧美| 欧美性色aⅴ视频一区日韩精品| 综合一区中文字幕| 天天摸天天碰天天爽天天弄| 九九视频精品免费| 性欧美激情精品| 久草手机视频在线观看| 国产一区二区三区不卡av| 欧美在线你懂的| 中文网丁香综合网| 日本一卡二卡四卡精品 | wwwxxx黄色片| 91麻豆免费在线视频| 97久久超碰精品国产| 91精品久久久久久久久久久久久久 | 国产超碰91| 91丨九色丨海角社区| 午夜精品999| 亚洲一级免费视频| 美女搡bbb又爽又猛又黄www| 日日夜夜一区| 一本久久a久久免费精品不卡| 日本一道在线观看| www黄在线观看| av在线不卡观看免费观看| 国产在线a不卡| 午夜精品久久久久久久蜜桃| 亚洲国产一区二区三区a毛片| 最近中文字幕2019免费| 国产精品揄拍100视频| 麻豆国产一区二区三区四区| 亚洲福中文字幕伊人影院| 黄色www在线观看| av中文字幕在线| 91蜜桃网址入口| 国产伦精品一区二区三区四区视频 | 88av.com| 中文在线免费二区三区| 亚洲v日本v欧美v久久精品| 潘金莲一级淫片aaaaaa播放1| 国产一二在线观看| 91丨九色丨尤物| 欧美日韩精品中文字幕一区二区| 蝌蚪视频在线播放| 欧美激情综合在线| 亚洲精品中文字幕乱码三区不卡 | 日韩精品一区国产| 日韩一级片网站| 亚洲精品第二页| 特黄特色欧美大片| 亚洲丝袜在线视频| 天天摸日日摸狠狠添| 欧美jizz| 欧美贵妇videos办公室| 国产一级淫片a| 免费看的黄色欧美网站| 国产精品久久久久久久久久| 在线黄色av网站| 国产精品99久久不卡二区| 国产精品视频一区二区三区经| 三级黄视频在线观看| 国产日韩成人精品| 二级片在线观看| heyzo在线播放| 91福利区一区二区三区| 日韩在线一区视频| 老牛国内精品亚洲成av人片| 亚洲欧美国产一区二区三区| 91ts人妖另类精品系列| 国产精品mm| 奇米四色中文综合久久| 国产在成人精品线拍偷自揄拍| 国产精品影视天天线| 鲁鲁视频www一区二区| a√资源在线| 亚洲一区二区美女| 性生交免费视频| 一区二区三区四区视频免费观看| 日韩精品视频免费在线观看| 国产第一页精品| 国产一区观看| 国产精品视频一区二区三区四| 精品乱子伦一区二区| 久久综合av免费| 国产911在线观看| 欧美天堂视频| 欧美不卡在线视频| 无码人中文字幕| 99精品视频免费观看| 91精品啪在线观看麻豆免费| 清纯唯美亚洲色图| 一区二区三区毛片| 亚洲 欧美 另类人妖| 久草精品视频| 欧美精品在线极品| 中文字幕在线观看高清| 99re66热这里只有精品3直播| 秋霞在线一区二区| 国产69精品久久久久9999人| 亚洲精品久久久久久久久| 91人妻一区二区三区蜜臀| 免费中文字幕日韩欧美| 国产精华一区| 操你啦视频在线| 欧美午夜精品理论片a级按摩| 国产精品300页| 欧美日韩1区| 91天堂在线观看| 91av资源在线| 色综合久久久久综合体| 国产女人18毛片水真多18| 欧美国产另类| 成人黄色在线免费| 在线视频三区| 欧美在线制服丝袜| 国产成人无码精品久久二区三| 91久久视频| 国产亚洲精品久久飘花| 啦啦啦中文在线观看日本| 欧美一区二区在线免费播放| 911国产在线| 美腿丝袜亚洲综合| 一区二区日本| 色999韩欧美国产综合俺来也| 中文字幕亚洲欧美日韩2019| 超碰在线97观看| 国产拍欧美日韩视频二区| 激情五月开心婷婷| 欧美禁忌电影网| 国产精品99久久久久久久久久久久| 欧洲视频在线免费观看| 欧美午夜宅男影院在线观看| 中文乱码人妻一区二区三区视频| 激情欧美丁香| 国产精品日韩一区二区免费视频| 2024短剧网剧在线观看| 日韩一区二区三区免费看| 99热精品免费| 国产成人精品影院| 精品少妇在线视频| 人体久久天天| 欧美一区二区三区免费观看| 男人天堂网在线| 欧美午夜精品一区二区三区| 黑人操日本美女| 国产精品一区二区在线观看网站| 国产精品免费看久久久无码| 国产成人澳门| 秋霞av国产精品一区| 2021av在线| 欧美一级欧美三级| 国产精品黄色网| 久久精品一区蜜桃臀影院| 国产又猛又黄的视频| 91精品国产乱码久久久久久| 999国内精品视频在线| 国产高潮在线| 国产一区二区成人| www.麻豆av| 欧美性xxxx极品hd欧美风情| 欧美亚洲色综久久精品国产| 国产剧情在线观看一区二区| 国产一区二区网| 欧美艳星介绍134位艳星| 91久久久久久久一区二区| 蜜桃传媒在线观看免费进入| 亚洲男人的天堂在线播放| 中文字幕一级片| 亚洲高清视频中文字幕| 天天躁夜夜躁狠狠是什么心态| 寂寞少妇一区二区三区| xxxx18hd亚洲hd捆绑| 欧美日韩久久精品| 成人黄动漫网站免费| 电影天堂国产精品| 欧美成人精品一区二区| 女人天堂在线| 91精品国产色综合久久久蜜香臀| 日韩毛片在线播放| 中文字幕一区二区在线播放| 精品视频站长推荐| 精品在线免费视频| 国产xxxxx在线观看| 亚洲情侣在线| 色视频一区二区三区| jizz18欧美18| 成人免费高清完整版在线观看| 欧美另类老肥妇| 不用播放器成人网| 成人在线免费观看| 亚洲精品99久久久久中文字幕| 一级黄在线观看| 日本精品视频一区二区三区| 久久综合加勒比| 国产精品久久久久婷婷二区次| 久久久久9999| 国产成人午夜视频| 色免费在线视频| 欧美亚洲三区| 国产高清av在线播放| 欧美~级网站不卡| 亚洲精品一区二区三区樱花| 中文字幕伦av一区二区邻居| 国产精品毛片va一区二区三区| 巨大黑人极品videos精品| 欧美一区二区三区免费视| 欧美精品videosex| 超碰91人人草人人干| 91在线高清| 在线丨暗呦小u女国产精品| 人成在线免费视频| 日韩成人性视频| 黑人操亚洲女人| 日韩你懂的电影在线观看| 国产精品一级二级| 在线电影一区二区三区| 亚洲天堂国产精品| 在线观看91精品国产入口| 日韩综合在线观看| 色噜噜偷拍精品综合在线| 国产伦精品一区二区三区视频网站| 亚洲大片免费看| 国产一级做a爱免费视频| 亚洲精品成人悠悠色影视| 欧美肥妇bbwbbw| 亚洲视频一区在线观看| 国产免费一区二区三区四区| 国产精品三级av| 国产中文字幕久久| 亚洲天堂精品在线观看| 色哟哟一一国产精品| 亚洲色图在线视频| 澳门黄色一级片| 亚洲午夜在线电影| 欧美三级午夜理伦| 色婷婷精品大在线视频| 亚洲永久精品一区| 欧美嫩在线观看| 国产美女www爽爽爽视频| 欧美一区二区三区婷婷月色| a级片在线视频| 日韩视频一区二区三区在线播放| а√中文在线资源库| 亚洲第一视频网站| 青青草免费在线视频| 在线日韩第一页| 黄色网页在线看| 欧美激情在线播放| 免费毛片b在线观看| 国产精品aaa| 久久久久亚洲精品中文字幕| 春色成人在线视频| 深爱激情综合| 最新欧美日韩亚洲| 亚洲第一区色| 精品少妇无遮挡毛片| 狠狠色丁香婷婷综合| 日韩av影视大全| 91香蕉视频mp4| 亚洲综合久久av一区二区三区| 依依成人精品视频| 人妻 日韩精品 中文字幕| 欧美日韩在线精品一区二区三区激情| 国产精品毛片一区视频播| 精品国产91久久久久久久妲己 | 欧美影视资讯| 国产在线日韩在线| 免费日韩一区二区三区| 亚洲高清在线观看一区| 黄色日韩在线| 天天碰免费视频| 粉嫩高潮美女一区二区三区| 无码h肉动漫在线观看| 亚洲免费av观看| youjizz在线视频| 日韩一区二区三区免费观看| 免费一级在线观看播放网址| 美女少妇精品视频| 韩国成人漫画| 国产富婆一区二区三区| 成人免费看片39| 秋霞无码一区二区| 精品在线播放午夜| 国产成人av一区二区三区不卡| 中文字幕一区免费在线观看| 影音先锋亚洲天堂| 日韩免费一区二区三区在线播放| 国产一区精品| 午夜精品久久久99热福利| 日韩欧美激情| 日本中文不卡| 亚洲一区不卡| 一级全黄裸体片| 国产精品初高中害羞小美女文| 欧美 日韩 精品| 精品久久一区二区三区| 巨大荫蒂视频欧美另类大| 国产精品久久久久久久电影| 欧美做受69| 日韩在线观看a| 国产呦精品一区二区三区网站 | 亚洲乱码国产乱码精品精的特点| 国产免费a视频| 亚洲精品中文字幕av| 国产精品偷拍| www日韩av| 一区二区三区毛片免费| 亚洲精品久久久久久宅男| www日韩大片| 久久久久久久久久久久久av| 亚洲国产成人久久综合| 丰乳肥臀在线| 91九色露脸| 欧美精品麻豆| 日本黄色一级网站| 自拍偷拍欧美激情| 国产精品久久久久久久免费| 日韩在线精品视频| 欧美大片网站| 一区二区三区在线视频看| 美女网站色91| 波多野结衣喷潮| 在线电影院国产精品| 精精国产xxxx视频在线| 成人黄色免费片| 亚洲蜜桃视频| a级大片免费看| 亚洲一区二区三区激情| 日本波多野结衣在线| 国产综合在线视频| 欧美美女在线直播| 久热免费在线观看| 亚洲最新无码中文字幕久久| 色阁综合伊人av| 99久久999| 男女啪啪免费观看| 成人免费av资源| 日韩成人av毛片| 日韩精品中文字| 欧美羞羞视频| 亚洲精品一卡二卡三卡四卡| 蜜桃视频在线观看一区| 色偷偷男人天堂| 51精品视频一区二区三区| 亚洲综合影视| 国内一区在线| 久久亚洲精选| 欧美日韩中文字幕视频| 欧美男生操女生| 牛牛精品视频在线| 九九九九精品| 久久亚洲国产精品一区二区| 国产中文字幕久久| 精品国产乱码久久久久久影片| 日韩激情电影免费看| 少妇精品久久久久久久久久| 狠狠久久亚洲欧美| 国产精品成人aaaa在线| 亚洲欧美日韩久久久久久| 羞羞视频在线观看一区二区| 久久久久久久久久伊人| 97国产精品videossex| 欧美视频xxxx| 欧美日韩爱爱视频| 久久99免费视频| 天天操精品视频| 欧美日韩美女视频| 色三级在线观看| 韩国一区二区三区美女美女秀| 三级欧美在线一区| 久久成人国产精品入口| 亚洲美女在线观看| 在线日韩成人| 另类小说第一页| 亚洲一区av在线| 午夜在线播放|