」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > React原始碼中MessageChannel的使用

React原始碼中MessageChannel的使用

發佈於2024-11-08
瀏覽:124

這篇文章我們分析React原始碼中MessageChannel的用法。

MessageChannel usage in React source code

我們先來了解什麼是MessageChannel。

訊息頻道

Channel Messaging API 的 MessageChannel 介面允許我們建立一個新的訊息通道並透過它的兩個 MessagePort 屬性發送資料。

例子

以下範例摘自 MDN 文檔,您可以看到使用 MessageChannel() 建構子建立了一個新通道。

載入 IFrame 後,我們為 MessageChannel.port1 註冊一個 onmessage 處理程序,並使用 window.postMessage 方法將 MessageChannel.port2 與訊息一起傳送到 IFrame。

當從 IFrame 接收回訊息時,onMessage 函數將訊息輸出到段落。


const channel = new MessageChannel();
const output = document.querySelector(".output");
const iframe = document.querySelector("iframe");
// Wait for the iframe to load
iframe.addEventListener("load", onLoad);
function onLoad() {
  // Listen for messages on port1
  channel.port1.onmessage = onMessage;
  // Transfer port2 to the iframe
  iframe.contentWindow.postMessage("Hello from the main page!", "*", [
   channel.port2,
  ]);
}
// Handle messages received on port1
function onMessage(e) {
 output.innerHTML = e.data;
}


好了,現在我們了解了MessageChannel的基礎知識,接下來我們來學習它在React原始碼中的用法。

React原始碼中MessageChannel的用法:


const channel = new MessageChannel();
channel.port1.onmessage = callback;
channel.port2.postMessage(undefined);


React 如何使用它:

  • 建立一個新的 MessageChannel 實例:React 建立一個具有兩個通訊連接埠的新 MessageChannel。

  • 使用 postMessage 安排任務:React 使用 port2.postMessage(undefined) 非同步觸發任務,不會出現 setTimeout 或 setImmediate 可能出現的延遲或乾擾。

  • 觸發onmessage時執行任務:當port1.onmessage收到發布的訊息時執行任務(即傳遞給enqueueTask的回呼)。

為什麼不使用setTimeout或setImmediate? React 程式碼暗示他們希望避免在瀏覽器環境中使用 setTimeout 或 setImmediate,因為它們並不總是精確的,並且可能受到限制、測試環境或其他最佳化(例如測試環境中的偽造計時器)的影響。 React 希望對調度進行精細控制,尤其是在非同步渲染和更新方面。

MessageChannel usage in React source code

關於我們:

在 Think Throo,我們的使命是教授開源專案中使用的高階程式碼庫架構概念。

透過在 Next.js/React 中練習高階架構概念,提升您的程式設計技能,學習最佳實踐並建立生產級專案。

我們是開源的 — https://github.com/thinkthroo/thinkthroo (請給我們一顆星!)

透過我們基於程式碼庫架構的高階課程來提升您的團隊技能。請透過 [email protected] 與我們聯絡以了解更多資訊!

參考:

  • https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel

  • https://github.com/facebook/react/blob/5d19e1c8d1a6c0b5cd7532d43b707191eaf105b7/packages/shared/enqueueTask.js#L42

  • ]
版本聲明 本文轉載於:https://dev.to/thinkthroo/messagechannel-usage-in-react-source-code-3771?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Java中Lambda表達式為何需要“final”或“有效final”變量?
    Java中Lambda表達式為何需要“final”或“有效final”變量?
    Lambda Expressions Require "Final" or "Effectively Final" VariablesThe error message "Variable used in lambda expression shou...
    程式設計 發佈於2025-04-18
  • 如何將MySQL數據庫添加到Visual Studio 2012中的數據源對話框中?
    如何將MySQL數據庫添加到Visual Studio 2012中的數據源對話框中?
    在Visual Studio 2012 儘管已安裝了MySQL Connector v.6.5.4,但無法將MySQL數據庫添加到實體框架的“ DataSource對話框”中。為了解決這一問題,至關重要的是要了解MySQL連接器v.6.5.5及以後的6.6.x版本將提供MySQL的官方Visual...
    程式設計 發佈於2025-04-18
  • 如何在GO編譯器中自定義編譯優化?
    如何在GO編譯器中自定義編譯優化?
    在GO編譯器中自定義編譯優化 GO中的默認編譯過程遵循特定的優化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    程式設計 發佈於2025-04-18
  • 從C#正確調用SQL自定義函數(UDF)方法
    從C#正確調用SQL自定義函數(UDF)方法
    在C#中調用SQL定義的SQL定義已定義的函數在使用C#代碼的SQL定義的函數中查詢數據庫。這是您可以從C#代碼中調用名為“ TCUPOM”的T-SQL標量函數的方法: c#代碼: 原始代碼中的錯誤:Setting the CommandType to StoredProcedure when ...
    程式設計 發佈於2025-04-18
  • 如何在Java中正確顯示“ DD/MM/YYYY HH:MM:SS.SS”格式的當前日期和時間?
    如何在Java中正確顯示“ DD/MM/YYYY HH:MM:SS.SS”格式的當前日期和時間?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解決方案:的,請訪問量很大,並應為procectiquiestate的,並在整個代碼上正確格式不多: java.text.simpledateformat; 導入java.util.calendar; 導入java...
    程式設計 發佈於2025-04-18
  • 為什麼HTML無法打印頁碼及解決方案
    為什麼HTML無法打印頁碼及解決方案
    無法在html頁面上打印頁碼? @page規則在@Media內部和外部都無濟於事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: ...
    程式設計 發佈於2025-04-18
  • 您如何在Laravel Blade模板中定義變量?
    您如何在Laravel Blade模板中定義變量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配變量對於存儲以後使用的數據至關重要。在使用“ {{}}”分配變量的同時,它可能並不總是最優雅的解決方案。 幸運的是,Blade通過@php Directive提供了更優雅的方法: $ old_section =...
    程式設計 發佈於2025-04-18
  • Go模板範圍中如何避免尾隨逗號?
    Go模板範圍中如何避免尾隨逗號?
    在GO的文本模板中的最後一個元素的特殊情況處理處理範圍的最後一個元素時,可能很棘手。以創建類似“(P1,P2,P3)”之類的字符串的任務。如果您使用一個簡單的範圍循環,則最終可能會在末端獲得一個額外的逗號,從而導致“(P1,P2,P3,)”。 來解決此問題,我們可以利用模板範圍的關鍵功能:聲明兩...
    程式設計 發佈於2025-04-18
  • 如何實現文本框自動高度調整?
    如何實現文本框自動高度調整?
    textarea auto height 探索如何自動調整文本核心的高度以匹配其內容的長度,以符合其內容的長度他們包含的文本量。如果文本超過預定義的高度,它將變得無法訪問並需要滾動。 此處提供的解決方案使用純JavaScript根據其實際內容來調整文本方面的高度。定義了一個稱為“ auto_gr...
    程式設計 發佈於2025-04-18
  • Python元類工作原理及類創建與定制
    Python元類工作原理及類創建與定制
    python中的metaclasses是什麼? Metaclasses負責在Python中創建類對象。就像類創建實例一樣,元類也創建類。他們提供了對類創建過程的控制層,允許自定義類行為和屬性。 在Python中理解類作為對象的概念,類是描述用於創建新實例或對象的藍圖的對象。這意味著類本身是使用...
    程式設計 發佈於2025-04-18
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-04-18
  • Python讀取CSV文件UnicodeDecodeError終極解決方法
    Python讀取CSV文件UnicodeDecodeError終極解決方法
    在試圖使用已內置的CSV模塊讀取Python中時,CSV文件中的Unicode Decode Decode Decode Decode decode Error讀取,您可能會遇到錯誤的錯誤:無法解碼字節 在位置2-3中:截斷\ uxxxxxxxx逃脫當CSV文件包含特殊字符或Unicode的路徑逃...
    程式設計 發佈於2025-04-18
  • 如何簡化PHP中的JSON解析以獲取多維陣列?
    如何簡化PHP中的JSON解析以獲取多維陣列?
    php 試圖在PHP中解析JSON數據的JSON可能具有挑戰性,尤其是在處理多維數組時。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    程式設計 發佈於2025-04-18
  • 為什麼不````''{margin:0; }`始終刪除CSS中的最高邊距?
    為什麼不````''{margin:0; }`始終刪除CSS中的最高邊距?
    在CSS 問題:不正確的代碼: 全球範圍將所有餘量重置為零,如提供的代碼所建議的,可能會導致意外的副作用。解決特定的保證金問題是更建議的。 例如,在提供的示例中,將以下代碼添加到CSS中,將解決餘量問題: body H1 { 保證金頂:-40px; } 此方法更精確,避免了由全局保證金重置...
    程式設計 發佈於2025-04-18
  • Python中何時用"try"而非"if"檢測變量值?
    Python中何時用"try"而非"if"檢測變量值?
    使用“ try“ vs.” if”來測試python 在python中的變量值,在某些情況下,您可能需要在處理之前檢查變量是否具有值。在使用“如果”或“ try”構建體之間決定。 “ if” constructs result = function() 如果結果: 對於結果: ...
    程式設計 發佈於2025-04-18

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3