」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 在 React 中的選項卡之間發送資料。

在 React 中的選項卡之間發送資料。

發佈於2024-09-17
瀏覽:576

Send data between tabs in React.

本文將介紹如何在 React 全域元件之間發送數據,甚至在不同的瀏覽器標籤中也是如此。


故事

想像您有一個項目列表,例如用戶。

每個使用者都可以在模態視窗中開啟進行修改。

您沒有任何後端訂閱,這表示如果使用者發生變化,使用者清單不會自動與後端同步。

因此,一旦使用者的個人資料更新,您希望自動刷新模式視窗下的使用者清單(甚至在網站的所有其他標籤中)。

我們將如何同步這些不相關的元件和標籤中的資料?


解決方案

模態視窗和使用者清單應該能夠交換事件和資料。

因此,如果在模態視窗中執行操作,則應將事件傳送至等待此類操作的所有元件(例如使用者清單),以便它們可以對此事件做出反應,例如,透過正在同步資料。

讓我們透過使用一個小套件 use-app-events 在「UserList」和「UserProfileModal」元件之間建立這樣的通訊:

const UserProfileModal = () => {
  // retrieve a user ID from URL, for example
  const { userId } = useParams();

  // 1. Create an instance of useAppEvents
  const { notifyEventListeners } = useAppEvents();

  const submitUpdate = async () => {
    // send a request to BE here, await the response...

    // 2. Send an event containing the updated user ID to
    // all other components that are listening for it
    notifyEventListeners('user-update', userId);
  };

  return ;
};

模態視窗

用戶列表

const UserList = () => {
  const [users, setUsers] = useState([]);

  // 1. Create an instance of useAppEvents
  const { listenForEvents } = useAppEvents();

  // 2. Listen and wait for the 'user-update' event to happen in the app
  listenForEvents('user-update', (userId) => {
    // 3. React to the occurred event by loading the refreshed
    // list of users from BE here...
  });

  return users.map((user) => (
    // render users here...
  ));
};

use-app-events 是一個小型開源包,沒有依賴性和風險,它也得到積極維護並且使用安全。

此時,UserProfileModal中使用者個人資料的更新會自動通知UserList等所有監聽器,從而觸發UserList中使用者清單的刷新,從而帶來更好的UX。

UserList 和 UserProfileModal 放置在組件樹中的哪個位置並不重要,它們仍然能夠在彼此之間發送數據,即使在不同的瀏覽器選項卡中


結論

如果您需要輕鬆設定全域通訊以在元件之間交換資料 - 請使用 use-app-events 套件。

它提供了易於使用的 API、豐富的文件和嚴格的類型,以確保您擁有最佳的開發人員體驗。

版本聲明 本文轉載於:https://dev.to/maqs/send-data-between-tabs-in-react-obk?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 網站時間資料集
    網站時間資料集
    您好,我在kaggle上發現了一個網站使用時間的資料集,所以我想找到訪問頁面數與網站總時間之間的比率。 您可以在我的github中找到資料集和程式碼:https://github.com/victordalet/Kaggle_analysis/tree/feat/website_traffic ...
    程式設計 發佈於2024-11-07
  • 如何在 PHP 中以陣列形式從 GET 參數檢索多個值?
    如何在 PHP 中以陣列形式從 GET 參數檢索多個值?
    在PHP 中以數組形式存取值$_GET在PHP 中,$_GET 超全域變數提供了一種存取從Web 表單或URL 查詢發送的數據的方法細繩。但是,目前還不清楚如何以數組形式取得 $_GET 數組中的值。 讓我們考慮一個場景,您想要在URL 中發送「id」參數的多個值:http://link/foo.p...
    程式設計 發佈於2024-11-07
  • 從格式化字串建構日期時如何解決 Internet Explorer 的 NaN 錯誤?
    從格式化字串建構日期時如何解決 Internet Explorer 的 NaN 錯誤?
    修復Internet Explorer 日期構造中的NaN 問題在Web 開發中,使用JavaScript 日期構造函數構造日期可能會在某些瀏覽器中帶來挑戰。特別是在 Internet Explorer (IE) 中,開發人員可能會遇到結果為 NaN 而不是有效日期物件的問題。當嘗試解析「m、d、Y...
    程式設計 發佈於2024-11-07
  • Floyd 演算法如何偵測鍊錶中的迴圈?
    Floyd 演算法如何偵測鍊錶中的迴圈?
    使用 Floyd 演算法檢測鍊錶中的循環確定給定鍊錶是否包含循環在 Java 程式設計中是一項具有挑戰性的任務。當清單中的最後一個節點引用前一個節點而不是空引用時,就會發生循環。 為了有效地偵測循環,開發人員通常採用 Floyd 的循環查找演算法,也稱為龜兔賽跑演算法。該演算法使用兩個引用,一個慢速...
    程式設計 發佈於2024-11-07
  • 如何在不使用 Flash 的情況下使用 JavaScript 在客戶端調整圖像大小?
    如何在不使用 Flash 的情況下使用 JavaScript 在客戶端調整圖像大小?
    使用JavaScript 在客戶端調整圖像大小:開源解決方案在當今的Web 開發環境中,通常需要在客戶端調整圖像大小之前將它們上傳到伺服器。這種方法可以優化影像質量,減少伺服器負載,並透過加快頁面載入時間來改善使用者體驗。 雖然 Flash 是調整圖片大小的常見選項,但許多開發人員寧願避免使用它。幸...
    程式設計 發佈於2024-11-07
  • 通訊:數據獲取模式
    通訊:數據獲取模式
    重大公告! 我開始了我日常的前端系統設計學習之旅。我將在部落格中分享每個模組的見解。所以,這就是開始,還有更多精彩! 在本部落格中,我們將探討前端系統設計所必需的不同資料取得機制,包括短輪詢、長輪詢、WebSocket、伺服器發送事件 (SSE) 和 Webhook。每種技術都滿足向客戶端和伺服...
    程式設計 發佈於2024-11-07
  • #daysofMiva 編碼挑戰日:將 JavaScript 連結到 HTML 檔案。
    #daysofMiva 編碼挑戰日:將 JavaScript 連結到 HTML 檔案。
    嗨,大家好。很抱歉這篇文章遲發了,但遲發總比不發好?無論如何,讓我們深入了解今天的文章。 為什麼要將 Javascript 連結到 HTML 檔案。 JavaScript 是一種在瀏覽器中運行的程式語言,可以操縱網頁的內容、結構和樣式。透過將 JavaScript 檔案連結到 HT...
    程式設計 發佈於2024-11-07
  • 為什麼我的 canvas.toDataURL() 沒有儲存我的圖像?
    為什麼我的 canvas.toDataURL() 沒有儲存我的圖像?
    Resolving Image Saving Issues with canvas.toDataURL()When attempting to utilize canvas.toDataURL() to save&&]When attempting to utilize canvas.toDataU...
    程式設計 發佈於2024-11-07
  • Node.js 中的新增功能
    Node.js 中的新增功能
    TL;DR: 让我们探索 Node.js 22 的主要功能,包括 ECMAScript 模块支持和 V8 引擎更新。此版本引入了 Maglev 编译器和内置 WebSocket 客户端,以增强性能和实时通信。还涵盖了测试、调试和文件系统管理方面的改进。 Node.js 22 将于 10 月进入 LT...
    程式設計 發佈於2024-11-07
  • 了解 MongoDB 的distinct() 操作:實用指南
    了解 MongoDB 的distinct() 操作:實用指南
    MongoDB 的distinct() 操作是一個強大的工具,用於從集合中的指定欄位檢索唯一值。本指南將幫助您了解distinct() 的用途、使用它的原因和時間,以及如何在 MongoDB 查詢中有效地實現它。 什麼是distinct()? distinct() 方法傳回集合或集...
    程式設計 發佈於2024-11-07
  • 為什麼 JavaScript 中的「0」在比較中為 False,而在「if」語句中為 True?
    為什麼 JavaScript 中的「0」在比較中為 False,而在「if」語句中為 True?
    揭開JavaScript 的悖論:為什麼「0」在比較中為假,但在If 語句中為假在JavaScript中,原語" 的行為0」給開發者帶來了困惑。雖然諸如“==”之類的邏輯運算符將“0”等同於假,但“0”在“if”條件下表現為真。 比較悖論代碼下面演示了比較悖論:"0" ...
    程式設計 發佈於2024-11-07
  • GitHub Copilot 有其怪癖
    GitHub Copilot 有其怪癖
    過去 4 個月我一直在將 GitHub Copilot 與我們的生產代碼庫一起使用,以下是我的一些想法: 好的: 解釋複雜程式碼:它非常適合分解棘手的程式碼片段或商業邏輯並正確解釋它們。 單元測試:非常擅長編寫單元測試並快速產生多個基於場景的測試案例。 程式碼片段:它可以輕鬆地為通用用例產生有用...
    程式設計 發佈於2024-11-07
  • 靜態類別或實例化類別:什麼時候應該選擇哪一個?
    靜態類別或實例化類別:什麼時候應該選擇哪一個?
    在靜態類別和實例化類別之間做出選擇:概述在PHP 中設計軟體應用程式時,開發人員經常面臨在使用靜態類別或實例化物件。這個決定可能會對程式的結構、效能和可測試性產生重大影響。 何時使用靜態類別靜態類別適用於物件不具備靜態類別的場景獨特的數據,只需要存取共享功能。例如,用於將 BB 程式碼轉換為 HTM...
    程式設計 發佈於2024-11-07
  • ⚠️ 在 JavaScript 中使用 `var` 的隱藏危險:為什麼是時候繼續前進了
    ⚠️ 在 JavaScript 中使用 `var` 的隱藏危險:為什麼是時候繼續前進了
    关键字 var 多年来一直是 JavaScript 中声明变量的默认方式。但是,它有一些怪癖和陷阱,可能会导致代码出现意外行为。现代替代方案(如 let 和 const)解决了许多此类问题,使它们成为大多数情况下声明变量的首选。 1️⃣ 提升:var 在不知不觉中声明变量! ?解释:...
    程式設計 發佈於2024-11-07
  • PDO::MYSQL_ATTR_INIT_COMMAND 需要「SET CHARACTER SET utf8」嗎?
    PDO::MYSQL_ATTR_INIT_COMMAND 需要「SET CHARACTER SET utf8」嗎?
    在有「PDO::MYSQL_ATTR_INIT_COMMAND」的 PDO 中「SET CHARACTER SET utf8」是否必要? 在PHP 和MySQL 中,「SET NAMES」 utf8」和「SET CHARACTER SET utf8」通常在使用UTF-8 編碼時使用。但是,當使用PD...
    程式設計 發佈於2024-11-07

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

Copyright© 2022 湘ICP备2022001581号-3