MUI默认主题扩展失败,无法同时使用自定义主题与默认主题色求助
MUI默认主题扩展失败,无法同时使用自定义主题与默认主题色求助
兄弟,我看你这问题是想同时用MUI自带的主题色和自己加的自定义主题属性,但不管是类型定义还是实际调用都卡壳了对吧?我来帮你拆解下问题,一步步解决~
首先,你犯了两个关键小错误:
1. 调用MUI默认主题色的路径写错了
MUI自带的主题调色板(包括success、primary这些颜色)都存放在theme.palette下面,不是直接挂在theme根节点上的!你之前写的theme.success.main是错的,正确的写法应该是theme.palette.success.main,这大概率是你报错的直接原因。
2. 类型定义的扩展方式有问题
你现在的theme.d.ts里,试图创建一个新的ICustomTheme然后让MUI的Theme接口继承它和原MUITheme,这种写法容易覆盖原接口的属性,反而导致类型丢失。正确的做法是直接在MUI的现有接口上扩展自定义属性,不需要重新继承。
给你一个修正后的src/types/theme.d.ts代码:
import { Theme as MUITheme, ThemeOptions as MUIThemeOptions } from "@mui/material/styles"; declare module "@mui/material/styles" { // 直接在原有Theme接口上添加自定义的custom属性 interface Theme { custom?: { success: React.CSSProperties["color"]; }; } // 同样扩展ThemeOptions,这样创建主题时能传入custom配置 interface ThemeOptions { custom?: { success: React.CSSProperties["color"]; }; } }
3. 确保主题创建时正确合并默认配置
最后,你创建主题的时候,要确保是基于MUI的默认主题来扩展,而不是完全自定义。比如你的主题创建代码应该是这样的:
import { createTheme } from '@mui/material/styles'; const theme = createTheme({ // 这里可以自定义默认主题的属性(比如palette、typography等),也可以留空用默认值 custom: { success: '#2e7d32', // 你的自定义成功色 }, });
现在再回到你的StyledBox组件,两种写法都能正常工作了:
import { Box, styled } from '@mui/material'; const StyledBox = styled(Box)(({ theme }) => ({ height: '250px', width: '250px', backgroundColor: theme.custom?.success, // 自定义主题色,正常生效 backgroundColor: theme.palette.success.main, // MUI默认成功色,现在也不会报错了 }));
这样调整后,应该就能同时使用自定义主题属性和MUI默认的主题色啦~
备注:内容来源于stack exchange,提问作者William Le
相关产品推荐
相关产品推荐

