React中createPortal 的詳細用法

createPortal 是 React 提供的一個實用工具,用于將 React 子元素渲染到 DOM 中的某個位置,而該位置與父組件不在同一個 DOM 層次結構中。這在某些特殊場景下非常有用,比如實現模態框、彈出菜單、固定定位元素等功能。

基本語法

JavaScript

復制

const portal = createPortal(child, container);
  • child 是要渲染的 React 子元素。

  • container 是 DOM 元素,子元素將被渲染到這個元素中。

使用場景

  1. 模態框:將模態框的內容渲染到 body 的頂層,以確保模態框不會被其他元素遮擋。

  2. 彈出菜單:將彈出菜單渲染到 body 的頂層,以確保菜單不會被其他元素遮擋。

  3. 固定定位元素:將固定定位的元素渲染到 body 的頂層,以確保元素的定位不會受到父元素的影響。

示例

下面是一個使用 createPortal 實現模態框的示例:

import React, { useState, useEffect } from 'react';
import { createPortal } from 'react-dom';function Modal() {const [showModal, setShowModal] = useState(false);// 創建一個 DOM 元素作為模態框的容器const modalRef = React.useRef(document.createElement('div'));useEffect(() => {// 將模態框容器添加到 body 中document.body.appendChild(modalRef.current);return () => {// 組件卸載時移除模態框容器document.body.removeChild(modalRef.current);};}, []);return (<><button onClick={() => setShowModal(true)}>Open Modal</button>{showModal && (createPortal(<div className='modal-overlay'><div className='modal'><h2>Modal Title</h2><p>This is a modal content</p><button onClick={() => setShowModal(false)}>Close Modal</button></div></div>,modalRef.current))}</>);
}export default Modal;
CSS
.modal-overlay {position: fixed;top: 0;left: 0;right: 0;bottom: 0;background-color: rgba(0, 0, 0, 0.5);display: flex;justify-content: center;align-items: center;
}.modal {background-color: white;padding: 20px;border-radius: 8px;box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);width: 300px;
}

優點

  • 靈活性:可以將子元素渲染到 DOM 中的任意位置。

  • 避免樣式沖突:通過將元素渲染到不同的 DOM 層次結構中,可以避免樣式沖突。

  • 優化性能:通過減少不必要的 DOM 操作,可以優化性能。

注意事項

  • 清理資源:在組件卸載時,確保移除創建的 DOM 元素,以避免內存泄漏。

  • 樣式隔離:確保渲染到不同 DOM 層次結構中的元素不會受到其他樣式的影響。

總結

createPortal 是 React 提供的一個強大工具,用于將子元素渲染到 DOM 中的任意位置。通過使用 createPortal,可以實現模態框、彈出菜單等功能,并確保這些元素的樣式和行為不受父組件的影響。

以下是一個更完整的示例,展示如何使用 createPortal 實現一個模態框:

import React, { useState } from 'react';
import { createPortal } from 'react-dom';function Modal() {const [showModal, setShowModal] = useState(false);// 創建一個 DOM 元素作為模態框的容器const modalRef = React.useRef(document.createElement('div'));// 將模態框容器添加到 body 中useEffect(() => {document.body.appendChild(modalRef.current);return () => {document.body.removeChild(modalRef.current);};}, []);return (<><button onClick={() => setShowModal(true)}>Open Modal</button>{showModal && (createPortal(<div className='modal-overlay'><div className='modal'><h2>Modal Title</h2><p>This is a modal content</p><button onClick={() => setShowModal(false)}>Close Modal</button></div></div>,modalRef.current))}</>);
}export default Modal;
.modal-overlay {position: fixed;top: 0;left: 0;right: 0;bottom: 0;background-color: rgba(0, 0, 0, 0.5);display: flex;justify-content: center;align-items: center;z-index: 1000;
}.modal {background-color: white;padding: 20px;border-radius: 8px;box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);width: 300px;max-height: 80vh;overflow-y: auto;
}

在這個示例中,模態框的內容被渲染到一個獨立的 DOM 容器中,該容器被添加到 body 中。這確保了模態框不會被其他元素遮擋,并且可以獨立于父組件進行樣式控制。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903176.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903176.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903176.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

電池的壽命

思路&#xff1a; 首先&#xff0c;我們觀察發現&#xff1a;由于每枚電池的使用時間不同&#xff0c;而我們又要減少浪費才能使所有電池加起來用得最久&#xff0c;不難發現&#xff1a;當n2時&#xff0c;輸出較小值。 第一步&#xff1a;將電池分為兩組&#xff0c;使兩組…

LeetCode每日一題4.27

3392. 統計符合條件長度為 3 的子數組數目 問題 問題分析 統計符合條件的長度為 3 的子數組數目。具體條件是&#xff1a;子數組的第一個數和第三個數的和恰好為第二個數的一半。 思路 遍歷數組&#xff1a;由于子數組長度固定為 3&#xff0c;我們可以通過遍歷數組來檢查每…

Linux日志處理命令多管道實戰應用

全文目錄 1 日志處理1.1 實時日志分析1.1.1 nginx日志配置1.1.2 nginx日志示例1.1.3 日志分析示例 1.2 多文件合并分析1.3 時間范圍日志提取 2 問題追查2.1 進程級問題定位2.2 網絡連接排查2.3 硬件故障追蹤 3 數據統計3.1 磁盤空間預警3.2 進程資源消耗排名3.3 HTTP狀態碼統計…

0803分頁_加載更多-網絡ajax請求2-react-仿低代碼平臺項目

文章目錄 1 分頁1.1 url與分頁參數1.2 分頁組件與url1.3 列表頁引用分頁組件 2 加載更多2.1 狀態2.2 觸發時機2.3 加載數據2.4優化 結語 1 分頁 1.1 url與分頁參數 查詢問卷列表接口&#xff0c;添加分頁參數&#xff1a; page&#xff1a;當前頁碼&#xff08;第幾頁&#…

【技術追蹤】基于擴散模型的腦圖像反事實生成與異常檢測(TMI-2024)

一種新穎的擴散模型雙重采樣策略&#xff0c;DDPM DDIM ~ 論文&#xff1a;Diffusion Models for Counterfactual Generation and Anomaly Detection in Brain Images 0、摘要 病理區域的分割掩模在許多醫學應用中很有用&#xff0c;例如腦腫瘤和中風管理。此外&#xff0c;疾…

第十六屆藍橋杯大賽軟件賽省賽第二場 C/C++ 大學 A 組

比賽還沒有開始&#xff0c;竟然忘記寫using namespace std; //debug半天沒看明白 (平時cv多了 然后就是忘記那個編譯參數&#xff0c;&#xff08;好慘的開局 編譯參數-stdc11 以下都是賽時所寫代碼&#xff0c;賽時無聊時把思路都打上去了&#xff08;除了倒數第二題&#…

CentOS 7上Memcached的安裝、配置及高可用架構搭建

Memcached是一款高性能的分布式內存緩存系統&#xff0c;常用于加速動態Web應用的響應。本文將在CentOS 7上詳細介紹Memcached的安裝、配置&#xff0c;以及如何實現Memcached的高可用架構。 &#xff08;1&#xff09;、搭建memcached 主主復制架構 Memcached 的復制功能支持…

告別進度失控:用燃盡圖補上甘特圖的監控盲區

在職場中&#xff0c;項目經理最頭疼的莫過于“計劃趕不上變化”。明明用甘特圖排好了時間表&#xff0c;任務卻總像脫韁野馬——要么進度滯后&#xff0c;要么資源分配失衡。甘特圖雖能直觀展示任務時間軸&#xff0c;但面對突發風險或團隊效率波動時&#xff0c;它更像一張“…

爬蟲-oiwiki

我們將BASE_URL 設置為 "https://oi-wiki.org/" 后腳本就會自動開始抓取該url及其子頁面的所有內容&#xff0c;并將統一子頁面的放在一個文件夾中 import requests from bs4 import BeautifulSoup from urllib.parse import urljoin, urlparse import os import pd…

業務中臺與數據中臺:企業數字化轉型的核心引擎

前言&#xff1a;在當今數字化浪潮下&#xff0c;企業為了提升運營效率、加速創新步伐并更好地適應市場變化&#xff0c;業務中臺與數據中臺應運而生&#xff0c;成為企業架構中的關鍵組成部分。本文將深入探討業務中臺和數據中臺的簡介、發展史、技術流環節以及在實際生產中的…

django admin 去掉新增 刪除

在Django Admin中&#xff0c;你可以通過自定義Admin類來自定義哪些按鈕顯示&#xff0c;哪些不顯示。如果你想隱藏“新增”和“刪除”按鈕&#xff0c;可以通過重寫change_list_template或使用ModelAdmin的has_add_permission和has_delete_permission屬性來實現。 方法1&…

基于云原生架構的后端微服務治理實戰指南

一、引言&#xff1a;為什么在云原生時代更需要微服務治理&#xff1f; 在單體應用時代&#xff0c;開發和部署雖然簡單&#xff0c;但隨著系統規模的擴大&#xff0c;單體架構的維護成本急劇上升&#xff0c;部署頻率受限&#xff0c;模塊之間相互影響&#xff0c;最終導致系…

MIT6.S081 - Lab10 mmap(文件內存映射)

本篇是 MIT6.S081 2020 操作系統課程 Lab10 的實驗筆記&#xff0c;目標只有一個&#xff1a;實現文件映射到內存的功能&#xff0c;也就是 mmap。 作為一名 Android 開發者&#xff0c;我可太熟悉 mmap 這個詞兒了。Android 的 跨進程通信 Binder 驅動、圖形內存分配和管理、…

基于BenchmarkSQL的OceanBase數據庫tpcc性能測試

基于BenchmarkSQL的OceanBase數據庫tpcc性能測試 安裝BenchmarkSQL及其依賴安裝軟件依賴編譯BenchmarkSQLBenchmarkSQL props文件配置數據庫和測試表配置BenchmarkSQL壓測裝載測試數據TPC-C壓測(固定事務數量)TPC-C壓測(固定時長)生成測試報告重復測試流程梳理安裝Benchmar…

WinForm真入門(17)——NumericUpDown控件詳解

一、基本概念? NumericUpDown 是 Windows 窗體中用于數值輸入的控件&#xff0c;由文本框和上下調節按鈕組成。用戶可通過以下方式調整數值&#xff1a; 點擊調節按鈕增減數值鍵盤直接輸入使用方向鍵調整 適用于需要限制數值范圍或精確控制的場景&#xff08;如年齡、參數配…

汽車自動駕駛介紹

0 Preface/Foreword 1 介紹 1.1 FSD FSD: Full Self-Driving&#xff0c;完全自動駕駛 &#xff08;Tesla&#xff09; 1.2 自動駕駛級別 L0 - L2&#xff1a;輔助駕駛L3&#xff1a;有條件自動駕駛L4/5 &#xff1a;高度/完全自動駕駛

AiCube 試用 - ADC 水位監測系統

AiCube 試用 - ADC 水位監測系統 水位檢測在水資源管理、城市防洪、農業灌溉、家用電器和工業生產等多領域發揮積極建設作用。利用水位傳感器&#xff0c;可以實現水資源的智能管理&#xff0c;提高生產效率。 本文介紹了擎天柱開發板利用 AiCube 工具快速創建 I/O 電壓讀取&…

秒殺壓測計劃 + Kafka 分區設計參考

文章目錄 前言&#x1f680; 秒殺壓測計劃&#xff08;TPS預估 測試流程&#xff09;1. 目標設定2. 壓測工具推薦3. 壓測命令示例&#xff08;ab版&#xff09;4. 測試關注指標 &#x1f4e6; Kafka Topic 分區設計參考表1. 單 Topic 設計2. 分區路由規則設計&#xff08;Part…

memcpy 使用指南 (C語言)

memcpy 是 C 語言標準庫中的一個重要函數&#xff0c;用于在內存區域之間復制數據。它是 <string.h> 頭文件中定義的高效內存操作函數之一。 函數原型 void *memcpy(void *dest, const void *src, size_t n); 參數說明 dest: 目標內存地址&#xff0c;數據將被復制到這…

跨境電商貨物體積與泡重計算器:高效便捷的物流計算工具

跨境電商貨物體積與泡重計算器&#xff1a;高效便捷的物流計算工具 工具簡介 貨物體積與泡重計算器是一款免費的在線工具&#xff0c;專門為物流從業者、跨境電商賣家和需要計算貨物運輸體積重量的用戶設計。這款工具可以幫助您快速計算貨物的體積和對應的空運、快遞泡重&…