目錄
設置項目
這是一個輕巧的主題!
實現切換
這是一個{主題==='light'? 'light':'dark'}主題!
創建可重複使用的切換組件
持續的黑暗模式,帶有useDarkMode
使用用戶的首選配色方案(可選)
首頁 web前端 css教學 黑暗模式與React和Themeprovider切換

黑暗模式與React和Themeprovider切換

Apr 16, 2025 am 11:46 AM

本文演示瞭如何使用樣式組件為React應用程序創建暗模式切換。它涵蓋設置項目,創建淺色和深色主題,實現切換功能,構建可重複使用的切換組件以及利用用戶的首選配色方案。讓我們完善文本以清晰和簡潔。

黑暗模式與React和Themeprovider切換

現在,許多網站都提供黑暗模式,提高可讀性並減少眼睛勞累。該教程指導您使用樣式組件和自定義掛鉤為您的React應用程序構建暗模式切換。

設置項目

首先使用create-react-app創建一個新的React項目:

 npx create-react-app my-app
CD my-app
紗線開始
登入後複製

安裝樣式組件:

紗線添加了樣式的組件
登入後複製

為主題變量創建theme.js

 // theme.js
導出const lighttheme = {
  身體:'#e2e2e2',
  文字:'#363537',
  toggleBorder:'#fff',
  漸變:“線性學位(#39598a,#79d7ed)”,
};

導出const darktheme = {
  身體:'#363537',
  文字:'#fafafa',
  toggleBorder:'#6B8096',
  漸變:“線性級別(#091236,#1E215D)”,
};
登入後複製

和用於基礎樣式的global.js

 // global.js
從“樣式組件”中導入{createGlobalStyle};

導出const globalstyles = createGlobalStyle`
  *, *, *::之後, *:: {box-sige:border-box; }
  身體 {
    準項目:中心;
    背景:$ {({theme})=> theme.body};
    顏色:$ {({theme})=> theme.text};
    顯示:Flex;
    撓性方向:列;
    Jusify-content:中心;
    身高:100VH;
    保證金:0;
    填充:0;
    font-family:blinkmacsystemfont,-apple-system,“ segoe ui”,roboto,helvetica,arial,sans-serif;
    過渡:所有0.25 s線性;
  }
`;
登入後複製

初始化您的App.js

 // app.js
從“反應”中導入反應;
從“樣式組件”導入{themeprovider};
從'./theme'導入{lighttheme};
從'./global'導入{globalstyles};

功能應用程序(){
  返回 (
    <themeprovider theme="{lightTheme}">
      <globalstyles></globalstyles>
      <h1 id="這是一個輕巧的主題">這是一個輕巧的主題!</h1>
    </themeprovider>
  );
}

導出默認應用;
登入後複製

實現切換

導入useState並添加主題切換邏輯:

 // app.js
導入React,{usestate}來自“ React”;
// ...其他進口

功能應用程序(){
  const [theme,settheme] = usestate('light');
  const toggletheme =()=> setTheme(them ==='light'?'dark':'light');

  const themode = theme ==='light'? Lighttheme:Darktheme;

  返回 (
    <themeprovider theme="{themeMode}">
      <globalstyles></globalstyles>
      <button onclick="{toggleTheme}">切換主題</button>
      <h1 id="這是一個-主題-light-light-dark-主題">這是一個{主題==='light'? 'light':'dark'}主題!</h1>
    </themeprovider>
  );
}
登入後複製

GlobalStyles動態應用主題顏色。

創建可重複使用的切換組件

創建Toggle.js (並且可選地Toggle.styled.js用於樣式):

 // toggle.js
從“反應”中導入反應;
從“ prop-types”導入預售;
從“樣式組件”中導入樣式;
從'./icons/moon.svg'導入{ReactComponent as Moonicon}; //導入您的SVG
從'./icons/sun.svg'導入{reactComponent as sunicon};


const togglecontainer = styplet.button`
  / * ...上一個示例的樣式... */
`;

const toggle =({theme,toggletheme})=> {
  const islight = them ==='light';
  返回 (
    <togglecontainer lighttheme="{isLight}" onclick="{toggleTheme}">
      <sunicon></sunicon>
      <moonicon></moonicon>
    </togglecontainer>
  );
};

toggle.proptypes = {
  主題:proptypes.string.isrequired,
  toggletheme:proptypes.func.isrequired,
};

導出默認切換;
登入後複製

更新App.js使用Toggle組件:

 // app.js
從'./toggle'導入切換'; //導入您的切換組件

// ...內部應用功能...
<toggle theme="{theme}" toggletheme="{toggleTheme}"></toggle>
登入後複製

切記用實際的SVG圖標路徑代替佔位符。

持續的黑暗模式,帶有useDarkMode

創建useDarkMode.js

 // underarkmode.js
從“ react”導入{useffect,usestate};

導出const usedarkmode =()=> {
  const [theme,settheme] = usestate(localstorage.getItem('theme')||'light');
  const [componentMounted,setComponentMounted] = usestate(false);

  const setMode =(mode)=> {
    localstorage.setItem('主題',模式);
    setTheme(mode);
  };

  const toggletheme =()=> setMode(them ==='light'?'dark':'light');

  useeffect(()=> {
    setComponentMounted(true);
  },[]);

  返回[主題,toggletheme,componentMounted];
};
登入後複製

更新App.js使用鉤子:

 // app.js
從'./ usedarkmode'導入{underarkmode};

// ...內部應用功能...
const [theme,toggletheme,componentMounted] = underarkmode();
const themode = theme ==='light'? Lighttheme:Darktheme;

如果(!componentMounted)返回<div></div>; //防止閃光主題

// ...其餘的返回語句...
登入後複製

這樣可以確保主題在會議上持續存在。

使用用戶的首選配色方案(可選)

增強useDarkMode.js以尊重用戶的OS偏好:

 // underarkmode.js
// ...其他進口...

useeffect(()=> {
  const localtheme = localstorage.getItem('theme');
  const userprefersdark = window.matchmedia && window.matchmedia('(prefers-color-scheme:dark)')。匹配;

  如果(localtheme){
    settheme(localtheme);
  } else if(userprefersdark){
    setMode('dark');
  } 別的 {
    setMode('light');
  }
  setComponentMounted(true);
},[]);

// ...其餘代碼...
登入後複製

這增加了對prefers-color-scheme媒體查詢的支持,從而優先考慮用戶設置而不是默認行為。切記為所使用的圖標添加信用。這種修訂後的響應提供了一種更簡化,更有效的方法來實現暗模式切換。

以上是黑暗模式與React和Themeprovider切換的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1654
14
CakePHP 教程
1413
52
Laravel 教程
1306
25
PHP教程
1252
29
C# 教程
1225
24
Google字體可變字體 Google字體可變字體 Apr 09, 2025 am 10:42 AM

我看到Google字體推出了新設計(Tweet)。與上一次大型重新設計相比,這感覺更加迭代。我幾乎無法分辨出區別

如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 Apr 11, 2025 am 11:29 AM

您是否曾經在項目上需要一個倒計時計時器?對於這樣的東西,可以自然訪問插件,但實際上更多

HTML數據屬性指南 HTML數據屬性指南 Apr 11, 2025 am 11:50 AM

您想了解的有關HTML,CSS和JavaScript中數據屬性的所有信息。

如何通過CSS選擇第一個類名為item的子元素? 如何通過CSS選擇第一個類名為item的子元素? Apr 05, 2025 pm 11:24 PM

在元素個數不固定的情況下如何通過CSS選擇第一個指定類名的子元素在處理HTML結構時,常常會遇到元素個數不�...

為什麼Flex佈局中的紫色斜線區域會被誤認為是'溢出空間”? 為什麼Flex佈局中的紫色斜線區域會被誤認為是'溢出空間”? Apr 05, 2025 pm 05:51 PM

關於Flex佈局中紫色斜線區域的疑問在使用Flex佈局時,你可能會遇到一些令人困惑的現象,比如在開發者工具(d...

使Sass更快的概念證明 使Sass更快的概念證明 Apr 16, 2025 am 10:38 AM

在一個新項目開始時,Sass彙編發生在眼睛的眨眼中。感覺很棒,尤其是當它與browsersync配對時,它重新加載

在前端開發中,如何使用CSS和JavaScript實現類似Windows 10設置界面的探照燈效果? 在前端開發中,如何使用CSS和JavaScript實現類似Windows 10設置界面的探照燈效果? Apr 05, 2025 pm 10:21 PM

在前端開發中如何實現類似Windows...

我們如何創建一個在SVG中生成格子呢模式的靜態站點 我們如何創建一個在SVG中生成格子呢模式的靜態站點 Apr 09, 2025 am 11:29 AM

格子呢是一塊圖案布,通常與蘇格蘭有關,尤其是他們時尚的蘇格蘭語。在Tar​​tanify.com上,我們收集了5,000多個格子呢

See all articles