二. 什么是 createPortal API?

通常情況下,React 組件與其子組件存在父子關系,所有子組件渲染后都嵌套在父組件內。然而,通過 createPortal,React 組件可以將部分或全部子組件渲染到 DOM 中非父節點的位置。

1. createPortal 函數簽名

ReactDOM.createPortal(children, domNode, [key])

a. 參數說明

createPortal 返回一個 React 節點,可以在組件返回 JSX 或嵌套在其他組件中使用。


三. createPortal 的核心特性

1. 渲染位置的靈活性

Portal 僅改變組件在 DOM 中的渲染位置,其行為與普通組件一致。例如,從 portal 觸發的事件沿著 React 樹冒泡,而非 DOM 樹。

2. 父子關系的保留

Portal 雖然渲染在 DOM 的其他位置,但仍然是渲染它的父組件的子組件。父組件 props 或 context 改變時,portal 會重新渲染。


四. 使用 createPortal 的優勢

1. 靈活的渲染位置

Portal 可以將元素渲染到父組件之外的 DOM 節點,適用于工具提示、模態框等 UI 組件。

2. 與非 React 庫的集成

Portal 允許 React 組件在非 React 的第三方庫中渲染,為集成提供便利。參考示例


五. 使用 createPortal 的最佳實踐

1. 簡化 Portal 組件

盡量保持 portal 內部組件簡單,減少維護成本。示例模態框:

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

const Modal = ({ isOpen, children, onClose }) = > {
  if (!isOpen) return null;
  return ReactDOM.createPortal(
    < div className="modal" >
      {children}
      < button onClick={onClose} > 關閉 < /button >
    < /div > ,
    document.getElementById('modal-root')
  );
};

2. 集中狀態管理

在父組件中管理影響 portal 的狀態,避免在 portal 內部管理狀態。

3. 樣式傳遞

Portal 不會繼承父組件的 CSS 樣式,需要顯式傳遞:

const style = { color: 'red' };
ReactDOM.createPortal( < p style={style} > Hello, Portal! < /p > , document.getElementById('modal-root'));

4. 無障礙訪問

確保 portal 內容對屏幕閱讀器友好,使用 ARIA 角色和屬性增強可訪問性。


六. createPortal 的局限性

1. 樣式繼承問題

Portal 不會繼承父組件 CSS,可能導致樣式問題,特別是在復雜布局中。

2. 復雜性增加

多個相互依賴的 portal 增加維護和調試難度,DOM 渲染位置與 React 組件層級不一致可能造成理解難度。

3. 事件冒泡路徑

Portal 的事件沿 React 樹冒泡,而非 DOM 樹,可能導致調試困難。


七. createPortal 的常見用途

1. 模態框、工具提示和彈窗

const Modal = ({ isOpen, onClose }) = > {
  if (!isOpen) return null;
  return ReactDOM.createPortal(
    < div className="modal" >
      < p > 這是一個模態框 < /p >
      < button onClick={onClose} > 關閉 < /button >
    < /div > ,
    document.getElementById('modal-root')
  );
};

2. 與非 React 應用集成

Portal 支持將 React 組件渲染到 DOM 的任意位置,方便在靜態頁面或非 React 應用中使用。


八. 測試 Portals 的技巧

1. 驗證渲染位置

expect(document.getElementById('modal-root').textContent).toBe('Hello, Portal!');

2. 測試交互行為

驗證按鈕點擊是否觸發正確邏輯,例如關閉模態框。

3. 可訪問性測試

檢查 ARIA 屬性是否正確設置,確保屏幕閱讀器可訪問 portal 內容。

4. 資源清理

父組件卸載時,確保 portal 內容正確卸載,避免內存泄漏。


九. 總結

createPortal 是 React DOM 提供的強大工具,允許開發者將子組件渲染到 DOM 的其他位置。它在構建模態框、工具提示、彈窗和通知框等 UI 組件時非常實用。

使用時需注意樣式繼承、事件冒泡路徑和復雜性等問題。通過遵循最佳實踐和測試方法,可以充分發揮 createPortal 的優勢,提供靈活高效的用戶交互體驗。


原文鏈接
Refine 官方博客

上一篇:

FastApi 簡單入門,附生產級腳手架代碼

下一篇:

用足球數據api構建足球數據分析應用的技術實踐
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費