Material ui 根据所选主题模式使用调色板原色

2023-12-20

在使用 mui React 时,我想使用主题主调色板中的颜色为使用 div 制作的一些非材质 ui 自定义组件着色。

我目前可以使用theme.palette.primary.main or the .light直接颜色,包括theme.palette.text.primary对于文本颜色。

But如果我将主题更改为深色模式,我还必须通过检查来更改颜色参考theme.mode条件如下:

  <div
    style={{
      backgroundColor:
        theme.palette.mode == "light"
          ? theme.palette.primary.dark
          : theme.palette.primary.light
    }}
  >
    Test
  </div>

那么有没有一种方法可以让我们像在 Material ui 组件中一样工作呢?通过theme.palette.primary可以与主题模式更改一起使用吗?

也许更简单一些,比如:

<div style={{ backgroundColor: theme.palette.primary }}></div>

你可以使用Context https://reactjs.org/docs/context.html要全局保存您的主题设置,您还需要将主题分开,例如light and dark.

// SettingsContext.js
import React, {
  createContext,
  useState
} from 'react';

const defaultSettings = {
  // you could add sort of global settings here
  theme: 'light'
};

const SettingsContext = createContext({
  settings: defaultSettings,
  saveSettings: () => {}
});

export const SettingsProvider = ({ settings, children }) => {
  const [currentSettings, setCurrentSettings] = useState(settings || defaultSettings);

  return (
    <SettingsContext.Provider
      value={{
        settings: currentSettings,
      }}
    >
      {children}
    </SettingsContext.Provider>
  );
};

export const SettingsConsumer = SettingsContext.Consumer;

export default SettingsContext;

您可以将设置上下文构建为挂钩,但您可以跳过此步骤。

// useSettings.js
import { useContext } from 'react'; 
import SettingsContext from './SettingsContext';

const useSettings = () => useContext(SettingsContext);

export default useSettings;

然后尝试创建包含深色和浅色模式的自定义主题。

// theme.js
import { createTheme as createMuiTheme } from '@mui/material/styles';

const themes = {
  'light': {
    ...
  },
  'dark': {
    ...
  }
];

export const createTheme = (name) => {
  return createMuiTheme(themes[name]);
}

之后,您需要传递您在中选择的主题App.js or index.js无论什么顶级文件。

// App.js
...
import { ThemeProvider } from '@mui/material/styles';
import useSettings from './useSettings';
import { createTheme } from './theme.js';

const App = () => {
  const { settings } = useSettings();

  const theme = createTheme(settings.theme);

  return (
    <ThemeProvider theme={theme}>
      ...
    </ThemeProvider>
  );
};

export default App;
...

就这样。

现在,您可以使用选定的主题,而无需在组件中进行条件渲染。

<div style={{ backgroundColor: theme.palette.primary }}></div>

但这不会阻止硬刷新后选定的主题。

因此,如果您想在刷新浏览器后仍保持选定的主题,那么您可以将主题设置保存在本地存储 https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Material ui 根据所选主题模式使用调色板原色 的相关文章

随机推荐

  • 如何简化空安全的compareTo()实现?

    我正在实施compareTo 像这样的简单类的方法 能够使用Collections sort 以及 Java 平台提供的其他好处 public class Metadata implements Comparable
  • android 改造,使用这种格式发布整个 Pojo

    我想在retrofit2中发布这种请求 所以如果有人对此有想法 那么这将对我有很大帮助 reqObject task singleUser taskData userID 1 是的 好问题 这是一些什么无法理解 for Beginner 所
  • 如何从 SQL Server 表获取 JSON 对象?

    我有一个视图 我想将其转换为 JSON 我可以使用什么 SQL 在服务器上生成需要返回的 JSON 字符串 Author Thiago R Santos Create date Aug 3rd 2008 Description Return
  • 使用 Gradle 2.2.1 和 Android Studio 1.2.2 构建项目

    我想从 Eclipse 切换到 Android Studio 然后我下载 k9mail 开源项目并决定将其导入 AS 中 我不熟悉 AS 和 Gradle 以及构建系统 我安装 Android Studio 1 2 2 版本和 Gradle
  • 不支持的方法:GradleProject.getBuildScript()

    我在 mac os x 上将 adt 项目 导出并创建 gradle 文件后 导入 Android Studio 时遇到此错误 android studio 版本是 3 6 最新 gradle 版本是 1 8 最新 错误显示为 不受支持的方
  • 寻找 Jetpack Compose YouTube 视频播放器包装依赖项

    Intro 我是 Jetpack Compose 的新手 对我来说 在第一次尝试时理解或让所有内容都正确并不容易 这就是为什么我喜欢查看其他人的开源工作以更好地理解该主题 Problem 我当前的问题是我必须将 YouTube 视频嵌入到我
  • 使用 POST 作为 URL 字符限制的解决方法

    如果你有一个API 仅仅因为URL长度限制和请求中传递复杂参数而支持POST操作 你还能说你有RESTful架构吗 上面的内容基本上意味着 对于这个特定的 只读 API GET 和 POST 之间没有语义差异 因此可以使用 GET 完成的操
  • CPanel SQLSTATE[HY000] [1045] 用户访问被拒绝

    我是 Cpanel laravel 托管的新手 我面临一个具体问题SQLSTATE HY000 1045 用户 mbaam trodian localhost 的访问被拒绝 使用密码 YES SQL 从users where email 电
  • 使用 ReSharper 进行 AngularJS 单元测试

    我正在尝试为与 ReSharper 测试运行程序一起运行的 AngularJS 控制器进行 Jasmine 单元测试 以便我可以在 VS 2012 中的一个位置运行客户端和服务器端测试 我遇到了一个问题 即 ReSharper 测试运行程序
  • Spring Data Mongo 可以只更新文档中的脏字段吗?

    我已经开始使用spring data mongo对于有很多东西需要持久化的应用程序 我们实际上选择了 mongo 因为它是这样宣传的 现在 我们严重沉迷于 Spring 我们发现使用它的一些功能我们的生活非常轻松 感谢 Spring 数据人
  • DotNet 舍入日期时间为最后 15 分钟 [重复]

    这个问题在这里已经有答案了 是否有函数可以将日期时间四舍五入到上个季度 例子 08 03 00 becomes 08 00 00 08 14 00 becomes 08 00 00 08 15 00 stays 08 15 00 08 16
  • 了解 DICOM 图像内的 BPP

    几天以来我一直在使用 FO DICOM 处理 DICOM 文件 我使用一组 dicom 文件进行测试 并且打印了 光度解释 和 每像素样本 值 以便更好地了解我正在处理的图像类型 光度解释的结果是 MONOCHROME2 每像素样本的结果是
  • MySQL ODBC 配置

    我已经成功地让我的 Access 作为 MySQL 的前端 我已经设法通过连接字符串使其工作 但由于代码中的一些细节 我想将 DSN 配置保存为用户 DSN 我遇到了一个具体问题 我需要使用option 3在我的连接字符串中 因为没有opt
  • java.lang.NumberFormatException:需要一个 int,但在第 1 行第 8454 列处为 0.6

    我在演示项目中使用改造库进行调用 我收到以下错误 java lang NumberFormatException 预期为 int 但在第 1 行第 8454 列路径 result results ads 2 acres 处为 0 6 我知道
  • 创建默认结构的最惯用方法

    要创建默认结构 我曾经看到过fn new gt Self在 Rust 中 但是今天 我发现Default 因此有两种方法可以创建默认结构体 struct Point x i32 y i32 impl Point fn new gt Self
  • MongoDB 字符串转int

    我想将MongoDB值字段的字符串转换为整数 然后计算平均值 这是我的 JSON id ObjectId 5c49f398fc0078178c76705b my json data Time Created ISODate 2019 01
  • 匹配可变参数非类型模板

    假设我有两个结构 Foo and Bar template
  • 是否有任何不明显的滥用 GUID 的方式?

    GUID 通常用于唯一地标识各种实体 来自外部系统 文件等的请求 像魔术一样工作 您调用 GiveMeGuid Windows 上的 UuidCreate 函数 一个全新的 GUID 随时为您服务 鉴于我的代码每次需要新的 GUID 时都会
  • 如果有 css3 skew 的 ie 过滤器是什么?

    我现在有 moz transform rotate 45deg skewX 45deg ms transform rotate 45deg skew 45deg 0deg webkit transform rotate 45deg skew
  • Material ui 根据所选主题模式使用调色板原色

    在使用 mui React 时 我想使用主题主调色板中的颜色为使用 div 制作的一些非材质 ui 自定义组件着色 我目前可以使用theme palette primary main or the light直接颜色 包括theme pal