React项目动态修改主题颜色的方案

 更新时间:2025年01月07日 09:50:54   作者:月月鸟pt  
这篇文章主要介绍了React项目动态修改主题颜色的方案,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

背景

因为公司是做办公软件的,所以需要适配明亮和暗黑的主题。

不推荐的方案

公司之前就是这种方案,费时费力。

就是在项目的根目录的 public 文件夹下创建一个 dark.css 文件,所有的黑暗样式在这个文件中。

切换主题的方法:

const getTheme = (isDark: boolean) => {
  const darkStyle: any = document.getElementById('darkTheme');
  
  if (!darkStyle) {
      var link = document.createElement('link');
      link.rel = 'stylesheet';
      link.type = 'text/css';
      link.id = "darkTheme"
      link.disabled = false;
      link.href = './dark.css';
      document.getElementsByTagName('head')[0].appendChild(link);
  }
  
  darkStyle.disabled = !!isDark;
}

推荐的方案

通过控制 css 变量来展示两种主题,方便简洁。

因为公司是使用的 less, 所以以下以 less 为例,但是 scsscss 是一样的。

1.创建两个主题的文件

在src文件夹下创建theme文件夹,在这个文件夹下创建lightTheme.lessdarkTheme.less文件。

lightTheme.less

:root[data-theme="light"] {
    --primary-text-color: #FFFFFF;
    --primary-white-color: #2A2A2D;
    --primary-color: #3591F4;
    --text-color: #363A45; 
}

darkTheme.less

:root[data-theme="light"] {
    --primary-text-color: #FFFFFF;
    --primary-white-color: #2A2A2D;
    --primary-color: #3591F4;
    --text-color: #fff; 
}

2.在入口的处的 index.less 引入这两个文件

@import './theme/lightTheme.less';
@import './theme/darkTheme.less';

3.在入口处的tsx文件中,能获取到的主题的方法中,调用切换主题的方法

const getDarkTheme = (isDark: boolean) => {
    const root = document.documentElement;

    if (!isDark) {
      // 修改 data-theme 属性的值为 "light"
      root.setAttribute('data-theme', 'light');
      return
    }

    // 修改 data-theme 属性的值为 "dark"
    root.setAttribute('data-theme', 'dark');
}

getDarkTheme(theme)

使用例子

.btn {
    color: var(--primary-color);
}

总结

在react项目中,通过这种修改css变量的方法来动态的修改主题颜色。更加方便简洁,只需要在实际的使用中只写一个css变量就好。使得项目的样式文件更好的维护。

以上就是React项目动态修改主题颜色的方案的详细内容,更多关于React修改主题颜色的资料请关注脚本之家其它相关文章!

相关文章

  • React实现pc端的弹出框效果

    React实现pc端的弹出框效果

    这篇文章主要为大家详细介绍了React实现pc端的弹出框效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 浅谈redux以及react-redux简单实现

    浅谈redux以及react-redux简单实现

    这篇文章主要介绍了浅谈redux以及react-redux简单实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • 在React中编写样式的六种方式

    在React中编写样式的六种方式

    在React中,编写样式主要有以下几种方式,内联样式,外部样式表,CSS Modules,Styled Components,Emotion和Radium这六种样式,下面我将针对上面提到的6种方式给出详细的代码示例,需要的朋友可以参考下
    2024-01-01
  • 在 React 中使用 Context API 实现跨组件通信的方法

    在 React 中使用 Context API 实现跨组件通信的方法

    在React中,ContextAPI是一个很有用的特性,可用于组件间的状态共享,它允许跨组件传递数据而无需通过每个组件手动传递props,本文给大家介绍在 React 中如何使用 Context API 来实现跨组件的通信,感兴趣的朋友一起看看吧
    2024-09-09
  • 浅谈react-router@4.0 使用方法和源码分析

    浅谈react-router@4.0 使用方法和源码分析

    这篇文章主要介绍了浅谈react-router@4.0 使用方法和源码分析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • 浅谈react新旧生命周期钩子

    浅谈react新旧生命周期钩子

    所谓的生命周期就是指某个事物从开始到结束的各个阶段,本文主要介绍了浅谈react新旧生命周期钩子,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • React 高阶组件HOC用法归纳

    React 高阶组件HOC用法归纳

    高阶组件就是接受一个组件作为参数并返回一个新组件(功能增强的组件)的函数。这里需要注意高阶组件是一个函数,并不是组件,这一点一定要注意,本文给大家分享React 高阶组件HOC使用小结,一起看看吧
    2021-06-06
  • react时间分片实现流程详解

    react时间分片实现流程详解

    实现react时间分片,主要内容包括什么是时间分片、为什么需要时间分片、实现分片开启 - 固定、实现分片中断、重启 - 连续、分片重启、实现延迟执行 - 有间隔、时间分片异步执行方案的演进、时间分片简单实现、总结、基本概念、基础应用、原理机制和需要注意的事项等
    2022-11-11
  • 一文详解ReactNative状态管理rematch使用

    一文详解ReactNative状态管理rematch使用

    这篇文章主要为大家介绍了ReactNative状态管理rematch使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 模块化react-router配置方法详解

    模块化react-router配置方法详解

    这篇文章主要介绍了模块化react-router配置方法详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06

最新评论