React+Ant Design的Layout布局實現暗黑模式切換

目錄

  • 效果預覽
  • 完整代碼
  • 我遇到的BUG
    • 問題代碼
    • BUG1:暗黑模式下內容區不變成深色
    • BUG2:光亮模式下的左右區域是深色
  • 補充知識
    • ConfigProvider是什么?
    • Ant Design中的theme如何使用?
      • theme 配置的常見字段
      • 主題算法
      • 通過 useToken 獲取主題

效果預覽

暗黑模式:
在這里插入圖片描述

光亮模式:
在這里插入圖片描述

完整代碼

import React, { useState } from 'react';
import { Breadcrumb, Layout, Menu, theme, ConfigProvider, Switch } from 'antd';const { Header, Content, Footer } = Layout;const items = [{ key: '0', label: '測試' }];const App: React.FC = () => {const [isDarkMode, setIsDarkMode] = useState(false);return (<ConfigProvidertheme={{algorithm: isDarkMode ? theme.darkAlgorithm : theme.defaultAlgorithm,}}>{/* useToken 必須在 ConfigProvider 作用域內 */}<ThemeWrapper isDarkMode={isDarkMode} setIsDarkMode={setIsDarkMode} /></ConfigProvider>);
};const ThemeWrapper: React.FC<{ isDarkMode: boolean; setIsDarkMode: React.Dispatch<React.SetStateAction<boolean>> }> = ({ isDarkMode, setIsDarkMode }) => {const { token } = theme.useToken(); // 確保 useToken 在 ConfigProvider 作用域內return (<Layout style={{minHeight : window.innerHeight}}><Headerstyle={{display: 'flex',alignItems: 'center',background: token.colorBgElevated, // 修正 Header 適配暗黑模式}}><Menutheme={isDarkMode ? 'dark' : 'light'}mode="horizontal"defaultSelectedKeys={['0']}items={items}style={{flex: 1,minWidth: 0,background: token.colorBgElevated, // 確保 Menu 顏色一致}}/><div><Switchchecked={!isDarkMode}onChange={() => setIsDarkMode(!isDarkMode)}checkedChildren="🌙"unCheckedChildren="??"/></div></Header><Content style={{ padding: '0 48px' }}><Breadcrumbstyle={{ margin: '16px 0' }}items={[{ title: 'Home' }, { title: 'List' }, { title: 'App' }]}/><divstyle={{background: token.colorBgContainer, // 確保背景顏色正確color: token.colorText, // 文字顏色適配暗黑模式minHeight: 580,padding: 24,borderRadius: token.borderRadiusLG,}}>Content</div></Content><Footer style={{ background: token.colorBgElevated, textAlign: 'center' }}>Ant Design ?{new Date().getFullYear()} Created by Ant UED</Footer></Layout>);
};export default App;

我遇到的BUG

問題代碼

import React, { useState } from 'react';
import { Breadcrumb, Layout, Menu, theme, ConfigProvider, Switch } from 'antd';
import './index.css';const { Header, Content, Footer } = Layout;const items = [{key: 0,label: '測試',},
];const App: React.FC = () => {// 主題切換狀態const [isDarkMode, setIsDarkMode] = useState(false);// 獲取當前主題 token(應該在組件頂層調用)const { token } = theme.useToken();return (<ConfigProvidertheme={{algorithm: isDarkMode ? theme.darkAlgorithm : theme.defaultAlgorithm,}}><Layout><Header style={{ display: 'flex', alignItems: 'center' }}><Menutheme={isDarkMode ? 'dark' : 'light'}mode="horizontal"defaultSelectedKeys={['0']}items={items}style={{ flex: 1, minWidth: 0 }}/><Switchchecked={!isDarkMode}onChange={() => setIsDarkMode(!isDarkMode)}checkedChildren="🌙"unCheckedChildren="??"/></Header><Content style={{ padding: '0 48px' }}><Breadcrumbstyle={{ margin: '16px 0' }}items={[{ title: 'Home' }, { title: 'List' }, { title: 'App' }]}/><divstyle={{backgroundColor: token.colorBgContainer,minHeight: 1080,padding: 24,borderRadius: token.borderRadiusLG,}}>Content</div></Content><Footer style={{ textAlign: 'center' }}>Ant Design ?{new Date().getFullYear()} Created by Ant UED</Footer></Layout></ConfigProvider>);
};export default App;

BUG1:暗黑模式下內容區不變成深色

效果如圖:
在這里插入圖片描述

原因:theme.useToken() 的 token 在 ConfigProvider 重新渲染時沒有立即更新。
解決辦法:確保 theme.useToken() 在 ConfigProvider 作用域內,并且 ConfigProvider 重新渲染時 token 正確更新。

BUG2:光亮模式下的左右區域是深色

效果如下:
在這里插入圖片描述
產生原因:Header 組件默認沒有使用 theme.useToken() 提供的背景色,而是繼承了 Ant Design 默認的 light 主題顏色
解決辦法:使用 token.colorBgElevated 作為 Header 的背景(它適用于暗黑模式的頂層容器)。確保 Header、Menu、Switch 共享相同的 backgroundColor。

補充知識

ConfigProvider是什么?

ConfigProvider 是 Ant Design 中的一個組件,用于在應用中全局配置和定制 Ant Design 組件的默認行為和主題。它是一個上下文提供器,用來設置應用中的全局配置,比如主題、國際化語言、組件的默認樣式等。

Ant Design中的theme如何使用?

在 Ant Design 中,theme 是用于設置和管理 UI 樣式的工具,通常與 ConfigProvider 一起使用來定制整個應用的視覺風格。theme 允許開發者通過配置顏色、字體、布局、組件樣式等來調整 Ant Design 組件的外觀,使其與應用的整體設計保持一致。

theme 配置的常見字段

  • colorPrimary:設置主色調。影響許多組件的顏色,如按鈕、鏈接、選中狀態等。
  • colorLink:設置鏈接文字的顏色。
  • colorBgBase:設置基礎背景顏色。
  • colorTextBase:設置基礎文字顏色。
  • borderRadiusBase:設置全局組件的邊框圓角。
  • fontSizeBase:設置基礎字體大小。
  • size:設置默認組件尺寸(如 small, middle, large)。

主題算法

Ant Design 支持多種主題算法,其中常見的包括:

  • theme.defaultAlgorithm:默認主題算法,通常用于淺色模式。
  • theme.darkAlgorithm:暗黑主題算法,用于暗黑模式。

通過 useToken 獲取主題

在使用主題時,你可以通過 theme.useToken 來訪問當前的主題 token 和樣式變量。例如,訪問當前主題下的背景色、文本色等:

import React from 'react';
import { theme } from 'antd';const App: React.FC = () => {const { token } = theme.useToken();return (<div style={{ backgroundColor: token.colorBgContainer, color: token.colorText }}>Content with dynamic theme</div>);
};export default App;

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

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

相關文章

TCP 三次握手與四次揮手過程

TCP 作為一種面向連接的、可靠的傳輸層協議&#xff0c;其連接管理機制對于保障數據的可靠傳輸至關重要。 三次握手&#xff08;建立連接&#xff09; 三次握手是 TCP 建立連接時所采用的機制&#xff0c;其目的在于確保客戶端和服務器雙方都具備發送和接收數據的能力&#x…

【線程安全的單例模式和STL是否是線程安全/智能指針是否是線程安全】

文章目錄 一、單例模式的特點二、餓漢模式實現單例三、懶漢模式實現單例四、STL線程安全嗎&#xff1f;五、智能指針線程安全嗎&#xff1f; 一、單例模式的特點 一個類&#xff0c;只應該實例化了一個對象&#xff0c;就是單例。 二、餓漢模式實現單例 舉個餓漢模式的例子&…

力扣DAY24 | 熱100 | 回文鏈表

前言 簡單 √ 是反轉鏈表的衍生題&#xff0c;很快寫完了。不過沒考慮到恢復鏈表結構的問題。 題目 給你一個單鏈表的頭節點 head &#xff0c;請你判斷該鏈表是否為回文鏈表。如果是&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 示例 1&#xff1a; 輸…

【GL010】C++

1.C中的const關鍵字有哪些用法&#xff1f; 1.修飾變量&#xff1a;表示變量的值不可修改。 const int a 10; 2.修飾指針&#xff1a; const int* p&#xff1a; // 指針指向的內容不可修改。 int* const p&#xff1a; // 指針本身不可修改。 const int* const…

金融行業 UE/UI 設計:解鎖高效體驗,重塑行業界面

在數字化浪潮中&#xff0c;金融行業的競爭日益激烈&#xff0c;用戶體驗&#xff08;UE&#xff09;和用戶界面&#xff08;UI&#xff09;設計成為企業脫穎而出的關鍵。蘭亭妙微憑借豐富的經驗和創新的方法&#xff0c;為金融行業打造了一套行之有效的 UE/UI 解決方案&#x…

C語言字符函數,字符串函數以及內存函數

那么博主寫這一片博客的目的就是為下一篇c的string類做鋪墊&#xff0c;那么下面就請期待博主的下一篇文章吧。 目錄 1.字符函數 2.字符串函數&#xff08;均在string.h頭文件中&#xff09; strlen的使用和模擬實現 strcpy 的使用和模擬實現 strcat 的使用和模擬實現 s…

_DISPATCHER_HEADER結構中的WaitListHead和_KWAIT_BLOCK的關系

第一部分&#xff1a; // // Wait block // // begin_ntddk begin_wdm begin_nthal begin_ntifs begin_ntosp typedef struct _KWAIT_BLOCK { LIST_ENTRY WaitListEntry; struct _KTHREAD *RESTRICTED_POINTER Thread; PVOID Object; struct _KWAIT_BLOCK *R…

flutter 自定義控件RenderObjectWidget使用

CustomWidget的自定義組件的注釋還是比較清晰的 參考文檔Flutter實戰 import package:flutter/cupertino.dart; import package:flutter/gestures.dart; import package:flutter/material.dart; /* * 如果組件不會包含子組件&#xff0c;則我們可以直接繼承自 LeafRenderObject…

機器視覺場景應用中,有沒有超景深的工業鏡頭

在機器視覺領域,確實存在具有超景深特性的工業鏡頭,這類鏡頭通過特殊的光學設計或技術手段,能夠顯著擴大清晰成像的縱向范圍,從而滿足復雜檢測場景中對多平面物體清晰成像的需求。以下是相關技術要點及典型鏡頭類型: 1. 遠心鏡頭 遠心鏡頭是超景深鏡頭的典型代表,其特點包…

【Linux】同步原理剖析及模擬BlockQueue生產消費模型

&#x1f4e2;博客主頁&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客倉庫&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01; &…

光流 | 基于KLT算法的人臉檢測與跟蹤原理及公式,算法改進,matlab代碼

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 人臉檢測與跟蹤 一、KLT算法原理與分析1. 核心思想2. 數學模型二、人臉…

<數據集>軌道異物識別數據集<目標檢測>

數據集下載鏈接&#xff1a;https://download.csdn.net/download/qq_53332949/90527370 數據集格式&#xff1a;VOCYOLO格式 圖片數量&#xff1a;1659張 標注數量(xml文件個數)&#xff1a;1659 標注數量(txt文件個數)&#xff1a;1659 標注類別數&#xff1a;6 標注類別…

LabVIEW液壓振動錘控制系統

在現代工程機械領域&#xff0c;液壓振動錘的高效與精準控制日益顯得重要。本文通過LabVIEW軟件&#xff0c;展開液壓振動錘啟停共振控制技術的研究與應用&#xff0c;探討如何通過改進控制系統來優化液壓振動錘的工作性能&#xff0c;確保其在復雜工況下的穩定性與效率。 ? …

【開源寶藏】30天學會CSS - DAY7 第七課 CSS 關鍵幀打造Preloader 追逐動畫

你的代碼實現了一個 方形軌跡預加載動畫&#xff08;Preloader Animation&#xff09;&#xff0c;其中三個 span 元素沿著一個 22 網格 軌跡循環移動。現在&#xff0c;我們將 拆解核心實現步驟&#xff0c;讓你能一步步理解并調整動畫效果。 第 0 步&#xff1a;項目概覽 你…

在shell腳本內部獲取該腳本所在目錄的絕對路徑

目錄 需求描述 方法一&#xff1a;使用 dirname 和 readlink 命令 方法二&#xff1a;使用 BASH_SOURCE 變量 方法三&#xff1a;僅使用純 Bash 實現 需求描述 工作中經常有這樣情況&#xff0c;需要在腳本內部獲取該腳本自己所在目錄的絕對路徑。 假如有一個腳本/a/b/c/…

常考計算機操作系統面試習題(一下)

目錄 操作系統基本類型 操作系統的功能 操作系統的主要任務 進程與線程 進程狀態轉變 內存管理 文件系統與文件管理 虛擬存儲器 設備管理 磁盤調度 死鎖 信號量機制 文件打開與管理 進程與線程的互斥與同步 進程同步 進程調度 文件分配磁盤塊的方法 程序執行…

GPT-SoVITS本地部署:低成本實現語音克隆遠程生成音頻全流程實戰

文章目錄 前言1.GPT-SoVITS V2下載2.本地運行GPT-SoVITS V23.簡單使用演示4.安裝內網穿透工具4.1 創建遠程連接公網地址 5. 固定遠程訪問公網地址 前言 今天要給大家安利一個絕對能讓你大呼過癮的聲音黑科技——GPT-SoVITS&#xff01;這款由花兒不哭大佬精心打造的語音克隆神…

JVM(基礎篇)

一.初識JVM 1.什么是JVM JVM全稱Java Virtyal Machine&#xff0c;中文譯名 Java虛擬機 。JVM本質上是一個運行在計算機上的程序&#xff0c;他的職責是運行Java字節碼文件(將字節碼解釋成機器碼)。 2.JVM的功能 解釋和運行&#xff1a;對字節碼文件中的指令號&#xff0c;實時…

【高并發內存池】第四彈---深入理解PageCache:整體設計、核心實現及Span獲取策略詳解

?個人主頁&#xff1a; 熬夜學編程的小林 &#x1f497;系列專欄&#xff1a; 【C語言詳解】 【數據結構詳解】【C詳解】【Linux系統編程】【Linux網絡編程】【項目詳解】 目錄 1、pagecache 1.1、整體設計 1.2、核心實現 1.3、獲取Span 1.3.1、獲取一個非空的Span 1.3…

深入理解C語言數據結構之快速排序三路劃分

在數據結構和算法的世界里&#xff0c;排序算法是基石一般的存在。快速排序作為一種高效的排序算法&#xff0c;以其平均情況下的優秀時間復雜度而被廣泛應用。今天&#xff0c;讓我們深入探討快速排序的一種變體——三路劃分的快速排序&#xff0c;看看它是如何在C語言中施展魔…