React 模態框的設計(二)

自定義組件是每個前端開發者必備的技能。我們在使用現有框架時難免有一些超乎框架以處的特別的需求,比如關于彈窗,每個應用都會用到,但是有時我們使用的框架中提供的彈窗功能也是功能有限,無法滿足我們的應用需求,今天 我來講一下在React中如何自定義各種樣式的彈窗。相信通過這篇文章,你能在自定義組件方面技能有一個質的提升。相關的知識能夠掌握的更加牢固。

先看最終的效果:
在這里插入圖片描述

首先本實例都是在MUI及基礎上設計的,樣式部分我使用了emotion-react

彈窗的設計有兩種方案,一種是直接把彈窗組件嵌入到頁面中,用的時候讓它直接顯示或關閉即可,一般的UI框架都是采用這種方法。這種使用方法有一個好處是不受瀏覽器插件的影響,尤其是廣告攔截插件的影響。但使用上有點不方便,必須要在使用彈窗的組件中加入這個彈窗,使用上不太方便。另一種方案是動態創建彈窗組件,在使用的時候直接alert就可以了。就像使用js原生的彈窗一樣簡單。本篇文章就是圍繞這種設計思路設計一個優雅的彈窗組件。

彈窗遮罩

遮罩很簡單,就一個div, 在MUI里就是一個Box組件。

const maskCss = css`position: fixed;background-color: rgba(0,0,0,0.6);border-radius: 5px;top: 0px;left: 0px;width: 100%;height: 100%;overflow: hidden;z-index: 999;display: flex;justify-content: center;align-items: center;`;

這是遮罩的樣式,我直接賦于一個Box就好了。

/** @jsxImportSource @emotion/react */
import { css, jsx, keyframes } from '@emotion/react'
import { useState, useRef, useEffect, useCallback } from 'react';
import Box from '@mui/material/Box';export default function Model(props) {return (<Box css={maskCss}></Box>)
}

我們再來臨時創建一個簡單的彈窗主體

/** @jsxImportSource @emotion/react */
import { css, jsx, keyframes } from '@emotion/react'
import React, { useState } from 'react';
import Box from '@mui/material/Box';const maskCss = css`position: fixed;background-color: rgba(0,0,0,0.6);border-radius: 5px;top: 0px;left: 0px;width: 100%;height: 100%;overflow: hidden;z-index: 999;display: flex;justify-content: center;align-items: center;`;const modelCss = css`position: relative;background-color: white;border: 1px solid #ccc;border-radius: 5px;overflow: hidden;box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);width: 400px;height: 300px;`const titleCss = css`background-color: #f0f0f0;padding: 8px;cursor: move;`;const modelContentCss = css`padding: 16px;`;const Modal = (props) => {const {onClose} = props;const onClick = (e) => { console.log('target:', e.target.className);}return (<Box css={maskCss}onClick = {onClose}><Box css={modelCss}><Boxcss={titleCss}className=".modelHandler">這是標題</Box><Box css={modelContentCss}>這是彈窗內容</Box></Box></Box>);
};export default Modal;

這是一個簡單的彈窗,如何讓它彈出來呢。我的想法是動態的把這個彈窗插入到documentbody

// 創建一個div容器,作為彈窗的根節點
const modelContainer = document.createElement("div");// 將div容器添加到body中
document.body.appendChild(modelContainer);

上面我只是創建了一個dom節點,但我們必須把這個dom節點添加到React中才能真實的渲染出來。

// 創建一個根節點
const modelRoot = ReactDOM.createRoot(modelContainer);

然后渲染出來

modelRoot.render(<Model />
);

這樣就在body中插入了model組件了,并且能渲染出來。當然能掛載我們還要有卸載才行。很簡單

// 卸載事件
const unmountEvent = () => {modelContainer.remove();
}

我們將上面的彈窗方法整合成一個hook就好了,這樣調用起來就相當的哇塞了。

import ReactDOM from 'react-dom/client';
import Model from './_Model';//可高度自定義的統一彈窗。
export default function useAlert() {return (configure) => {// 創建一個div容器,作為彈窗的根節點const modelContainer = document.createElement("div");// 將div容器添加到body中document.body.appendChild(modelContainer);// 創建一個根節點const modelRoot = ReactDOM.createRoot(modelContainer);// 卸載事件const unmountEvent = () => {modelContainer.remove();}modelRoot.render(<ModelonClose={unmountEvent}{...configure}>{configure.component || null}</Model>);}}

我們把卸載事件傳遞給了Model,在遮罩點擊事件上調用,這樣就能開發彈窗也能關閉彈窗。

我們這樣調用就好了:

const alert = useAlert();
alert();

你看一個基本的彈窗就設計完了。

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

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

相關文章

【linux】使用 acme.sh 實現了 acme 協議生成免費的SSL 證書

acme.sh 實現了 acme 協議, 可以從 letsencrypt 生成免費的證書. 主要步驟: 安裝 acme.sh生成證書copy 證書到 nginx/apache 或者其他服務更新證書更新 acme.sh出錯怎么辦, 如何調試 下面詳細介紹. 1. 安裝 acme.sh 安裝很簡單, 一個命令: curl https://get.acme.sh | sh…

隱藏餓了么el-select組件的el-select-dropdown部分,只使用el-select的顯示框

隱藏餓了么el-select組件的el-select-dropdown部分,只使用el-select的顯示框 問題: 由于el-select組件的el-select-dropdown部分是自動插入在最外層Body上的&#xff0c;所以在當前組件的scoped中讓el-select-dropdown組件display:none不會生效所以需要&#xff1a; :popper-…

Java架構師之路六、高并發與性能優化:高并發編程、性能調優、線程池、NIO、Netty、高性能數據庫等。

目錄 高并發編程&#xff1a; 性能調優&#xff1a; 線程池&#xff1a; NIO&#xff1a; Netty&#xff1a; 高性能數據庫&#xff1a; 上篇&#xff1a;Java架構師之路五、微服務&#xff1a;微服務架構、服務注冊與發現、服務治理、服務監控、容器化等。-CSDN博客 下篇…

TiDB 7.5.0 LTS 高性能數據批處理方案

過去&#xff0c;TiDB 由于不支持存儲過程、大事務的使用也存在一些限制&#xff0c;使得在 TiDB 上進行一些復雜的數據批量處理變得比較復雜。 TiDB 在面向這種超大規模數據的批處理場景&#xff0c;其能力也一直在演進&#xff0c;其復雜度也變得越來越低&#xff1a; ○ 從…

11.CSS3的媒介(media)查詢

CSS3 的媒介(media)查詢 經典真題 如何使用媒體查詢實現視口寬度大于 320px 小于 640px 時 div 元素寬度變成 30% 媒體查詢 媒體查詢英文全稱 Media Query&#xff0c;顧名思義就是會查詢用戶所使用的媒體或者媒介。 在現在&#xff0c;網頁的瀏覽終端是越來越多了。用戶可…

C++:string類

標準庫中的string類 string類 1. 字符串是表示字符序列的類 2. 標準的字符串類提供了對此類對象的支持&#xff0c;其接口類似于標準字符容器的接口&#xff0c;但添加了專門用于操作單字節字符字符串的設計特性。 3. string類是使用char(即作為它的字符類型&#xff0c;使用…

ChatGPT 是什么

文章目錄 一、ChatGPT 是什么二、ChatGPT的發明者三、ChatGPT的運作方式四、ChatGPT的技術五、ChatGPT的優勢六、ChatGPT的局限性七、ChatGPT的應用八、ChatGPT的未來九、總結 一、ChatGPT 是什么 OpenAI的ChatGPT&#xff0c;即Chat Generative Pre-Trained Transformer&…

3個精美的wordpress企業網站模板

WordPress企業網站模板 https://www.zhanyes.com/qiye/6305.html WordPress企業官網模板 https://www.zhanyes.com/qiye/6309.html WordPress律師模板 https://www.zhanyes.com/qiye/23.html

SQL注入漏洞解析--less-2

首先我們進入第二關 思路&#xff1a; 1.先判斷是什么類型的注入 2.根據類型我們在找注入點 步驟&#xff1a; 1.提示我們輸入id數字&#xff0c;那我們先輸入1猜一下 2.這里正常回顯&#xff0c;當我們后邊加上時可以看到報錯&#xff0c;且報錯信息看不到數字&#xff0…

輕松掌握opencv的8種圖像變換

文章目錄 opencv的8種圖像變換1. 圖像放大、縮小2. 圖像平移3. 圖像旋轉4. 圖像仿射變換5. 圖像裁剪6. 圖像的位運算&#xff08;AND, OR, XOR&#xff09;7. 圖像的分離和融合8. 圖像的顏色空間 opencv的8種圖像變換 1. 圖像放大、縮小 我們先看下原圖 import cv2 import ma…

C++面試:程序的編譯與運行

程序的編譯和運行是軟件開發中的基本環節&#xff0c;尤其是在使用編譯型語言&#xff08;如C/C、Java等&#xff09;進行開發時。這個過程涉及將人類可讀的源代碼轉換成機器能夠執行的指令&#xff0c;然后運行這些指令來完成既定的任務。下面是這一過程的詳細介紹&#xff0c…

基于java+springboot+vue實現的美食信息推薦系統(文末源碼+Lw)23-170

1 摘 要 使用舊方法對美食信息推薦系統的信息進行系統化管理已經不再讓人們信賴了&#xff0c;把現在的網絡信息技術運用在美食信息推薦系統的管理上面可以解決許多信息管理上面的難題&#xff0c;比如處理數據時間很長&#xff0c;數據存在錯誤不能及時糾正等問題。這次開發…

Shell好用的工具: cut

目標 使用cut可以切割提取指定列\字符\字節的數據 介紹 cut 譯為“剪切, 切割” , 是一個強大文本處理工具&#xff0c;它可以將文本按列進行劃分的文本處理。cut命令逐行讀入文本&#xff0c;然后按列劃分字段并進行提取、輸出等操作。 語法 cut [options] filename opti…

樹中枝繁葉茂:探索 B+ 樹、B 樹、二叉樹、紅黑樹和跳表的世界

歡迎來到我的博客&#xff0c;代碼的世界里&#xff0c;每一行都是一個故事 樹中枝繁葉茂&#xff1a;探索 B 樹、B 樹、二叉樹、紅黑樹和跳表的世界 前言B樹和B樹B樹&#xff08;Binary Tree&#xff09;&#xff1a;B樹&#xff08;B Plus Tree&#xff09;&#xff1a;應用場…

Cobra在ubuntu中設置自動補全

Cobra在ubuntu中設置自動補全 yourprogram指的是你程序&#xff0c;并且必須是使用了Cobra cli bash設置 $ source <(yourprogram completion bash)$ yourprogram completion bash > /etc/bash_completion.d/yourprogramzsh設置 $ echo "autoload -U compinit; …

Linux之用戶和用戶組用戶賬號系統文件

一、簡介 1.用戶的定義 在linux系統中用戶&#xff08;User&#xff09;需要用用戶賬號來訪問系統&#xff0c;服務和信息&#xff0c;系統中的每個進程&#xff08;運行的程序&#xff09;都是使用一個特定的用戶運行。每個文件都屬于一個特定的用戶所有。對文件和目錄的訪…

STM32Cubemx TB6612直流電機驅動

一、TB6612FNG TB6612是一個支持雙電機的驅動模塊&#xff0c;支持PWM調速。PWMA、AIN1、AIN2 為一組控制引腳&#xff0c;PWMA 為 PWM 速度控制引腳&#xff0c;AIN1、AIN2 為方向控制引腳&#xff1b;PWMB、BIN1、BIN2 為一組控制引腳&#xff0c;PWMB 為 PWM 速度控制引腳&…

【力扣hot100】刷題筆記Day11

前言 科研不順啊......又不想搞了&#xff0c;隨便弄弄吧&#xff0c;多花點時間刷題&#xff0c;今天開啟二叉樹&#xff01; 94. 二叉樹的中序遍歷 - 力扣&#xff08;LeetCode&#xff09; 遞歸 # 最簡單遞歸 class Solution:def inorderTraversal(self, root: TreeNode) …

idea運行項目時右下角彈出“Lombok requires enabled annotation processing”

文章目錄 錯誤描述原因分析解決方式參考 錯誤描述 Lombok requires enabled annotation processing&#xff1a;翻譯過來就是Lombok 需要啟用注釋處理 原因分析 idea安裝了Lombok插件&#xff0c;但有些設置未做。 解決方式 參考 idea配置和使用Lombok

全文搜索的工作原理講解

Elasticsearch全文搜索是一種強大的搜索技術&#xff0c;它基于Lucene構建&#xff0c;能夠處理大規模數據集&#xff0c;提供快速、準確的搜索結果。要充分利用Elasticsearch的全文搜索能力&#xff0c;關鍵在于理解和應用其核心組件&#xff1a;分詞&#xff08;Tokenization…