目录
设置项目
这是一个轻巧的主题!
实现切换
这是一个{主题==='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)

VUE 3 VUE 3 Apr 02, 2025 pm 06:32 PM

它的出局!恭喜Vue团队完成了完成,我知道这是一项巨大的努力,而且很长时间。所有新文档也是如此。

您可以从浏览器获得有效的CSS属性值吗? 您可以从浏览器获得有效的CSS属性值吗? Apr 02, 2025 pm 06:17 PM

我有人写了这个非常合法的问题。 Lea只是在博客上介绍了如何从浏览器中获得有效的CSS属性。那样的是这样。

在CI/CD上有点 在CI/CD上有点 Apr 02, 2025 pm 06:21 PM

我说的“网站”比“移动应用程序”更合适,但我喜欢Max Lynch的框架:

带有粘性定位的堆叠卡和一点点的杂物 带有粘性定位的堆叠卡和一点点的杂物 Apr 03, 2025 am 10:30 AM

前几天,我发现了科里·金尼文(Corey Ginnivan)网站上的这一点,当您滚动时,彼此之间的卡片堆放集。

在WordPress块编辑器中使用Markdown和本地化 在WordPress块编辑器中使用Markdown和本地化 Apr 02, 2025 am 04:27 AM

如果我们需要直接在WordPress编辑器中向用户显示文档,那么最佳方法是什么?

比较浏览器的响应式设计 比较浏览器的响应式设计 Apr 02, 2025 pm 06:25 PM

这些桌面应用程序中有许多目标是同时在不同的维度上显示您的网站。因此,例如,您可以写作

如何将CSS网格用于粘头和页脚 如何将CSS网格用于粘头和页脚 Apr 02, 2025 pm 06:29 PM

CSS网格是一系列属性的集合,旨在使布局比以往任何时候都容易。像任何东西一样,那里有一点学习曲线,但是网格是

Google字体可变字体 Google字体可变字体 Apr 09, 2025 am 10:42 AM

我看到Google字体推出了新设计(Tweet)。与上一次大型重新设计相比,这感觉更加迭代。我几乎无法分辨出区别

See all articles