将 type: 'dark' 应用到 MUI 调色板会破坏我的网站,除非它直接在 createMuiTheme() 函数中定义

Posted

技术标签:

【中文标题】将 type: \'dark\' 应用到 MUI 调色板会破坏我的网站,除非它直接在 createMuiTheme() 函数中定义【英文标题】:Applying type: 'dark' to a MUI palette breaks my site unless it is defined directly in the createMuiTheme() function将 type: 'dark' 应用到 MUI 调色板会破坏我的网站,除非它直接在 createMuiTheme() 函数中定义 【发布时间】:2019-11-16 11:54:25 【问题描述】:

当在直接 createMuiTheme() 函数之外的任何地方声明 type: 'dark' 时,我无法使用 MUI 为我的网站定义“黑暗”主题。

例如,以下工作:

const siteTheme = createMuiTheme(
  palette: 
    primary: 
      light: '#484848',
      main: '#212121',
      dark: '#000000',
      contrastText: '#fff',
    ,
    secondary: 
      light: '#b0ff57',
      main: '#76ff03',
      dark: '#32cb00',
      contrastText: '#000',
    ,
    type: 'dark'
  ,
)

但以下中断:

const theme = 
  palette: 
    primary: 
      light: '#484848',
      main: '#212121',
      dark: '#000000',
      contrastText: '#fff',
    ,
    secondary: 
      light: '#b0ff57',
      main: '#76ff03',
      dark: '#32cb00',
      contrastText: '#000',
    ,
    type: 'dark'
  ,


const siteTheme = createMuiTheme(theme)

它给出的错误是

54 | const siteTheme = createMuiTheme(主题)

类型参数'调色板:主要:灯光:字符串;主要:字符串;黑暗:字符串;对比文本:字符串; ;次要:灯:字符串;主要:字符串;黑暗:字符串;对比文本:字符串; ;类型:字符串; ; ' 不可分配给“ThemeOptions”类型的参数。 属性“调色板”的类型不兼容。 类型'主要:灯:字符串;主要:字符串;黑暗:字符串;对比文本:字符串; ;次要:灯:字符串;主要:字符串;黑暗:字符串;对比文本:字符串; ;类型:字符串; ' 不可分配给类型 'PaletteOptions'。 属性“类型”的类型不兼容。 类型 'string' 不可分配给类型 '"dark" | “光” |未定义'.ts(2345)

我正在使用.tsx 文件。

为什么我不能在直接createMuiTheme() 函数之外定义type = 'dark'

【问题讨论】:

您找到解决方案了吗? 【参考方案1】:

因为您使用的是 TypeScript,所以您需要确保将其转换为正确的类型:

import  PaletteType  from '@material-ui/core';

const theme = 
  palette: 
    type: 'dark' as PaletteType,
  

【讨论】:

请注意PaletteType 似乎已重命名为PaletteMode@material-ui/core/index.d.ts:50 - export type PaletteMode = 'light' | 'dark'; 这反过来意味着 type 键已相应地重命名为 mode 你救了我:)【参考方案2】:

自 @Farser's accepted answer 以来,命名似乎已经改变,所以我添加了一个更新的答案,以防将来有人像我一样偶然发现这个问题。

我在@material-ui/core/index.d.ts:50 找到以下行,因此我假设作者已决定将调色板“type”重命名为“mode”:

export type PaletteMode = 'light' | 'dark';

这是App.tsx 的最小工作示例(假设默认index.tsxcreate-react-app 或类似生成):

import React from "react";
import  createMuiTheme, PaletteMode, ThemeProvider  from "@material-ui/core";

const theme = createMuiTheme(
  palette: 
    mode: "dark" as PaletteMode
  
);

export default function App() 
  return (
    <ThemeProvider theme=theme>
      <CssBaseline />
      <div className="App" />
    </ThemeProvider>
  );

附带说明一下,还应该可以使用useMediaQuery("(prefers-color-scheme: dark)") 来确定用户喜欢深色还是浅色主题,并自动设置合适的主题,如下所示:

mode: (useMediaQuery("(prefers-color-scheme: dark)") ? "dark" : "light") as PaletteMode

另一个小补充/注意:不要忘记在&lt;ThemeProvider&gt; 顶部添加&lt;CssBaseline /&gt;,通常位于根元素/组件上方。

【讨论】:

以上是关于将 type: 'dark' 应用到 MUI 调色板会破坏我的网站,除非它直接在 createMuiTheme() 函数中定义的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(自定义调色板填充色dark2灰度比例)实战

第二章:seaborn调色板

Seaborn 调色板不适用于线图

使用 MUI V5 最新版本通过 React、Next JS 和本地存储切换暗模式

可视化库-seaborn-调色板(第五天)

ECharts的高级使用(主题调色板颜色渐变)