首页 > 解决方案 > material-ui 用 useStyles / jss 覆盖主题

问题描述

如何在不使用 !important 的情况下使用样式覆盖 Material-UI 主题?

const theme = createMuiTheme({
  overrides: {
     MuiInputBase: {
      input: {
        background: '#dd7711',
        padding: 10,
      },
     },
    },
  },
})

export default makeStyles(theme => ({
  hutber: {
    background: '#000',
    color: '#fff',
  },
}))


function SpacingGrid() {
   const classes = useStyles()
   return <MuiThemeProvider theme={theme}><Input label="Outlined" variant="outlined" className={classes.hutber} /></MuiThemeProvider>
}

输出:

在此处输入图像描述

在此处输入图像描述

如您所见,覆盖样式的唯一方法是创建另一个主题:OI 想知道是否styles

标签: javascriptreactjsmaterial-uijss

解决方案


覆盖不起作用的原因是因为指定className道具等同于root 为 Input 指定 CSS 类,但是您的主题覆盖在input应用于不同元素的 CSS 类上(根元素是 div,输入元素是该 div 中的一个<input>元素)。

在下面的示例中,您可以看到两种不同的定位<input>元素的方法。第一种方法使用嵌套选择器来定位.MuiInputBase-input. 第二种方法使用classesprop (而不是className)并提供覆盖作为inputCSS 类。

import React from "react";
import ReactDOM from "react-dom";

import {
  createMuiTheme,
  MuiThemeProvider,
  makeStyles
} from "@material-ui/core/styles";
import Input from "@material-ui/core/Input";

const theme = createMuiTheme({
  overrides: {
    MuiInputBase: {
      input: {
        background: "#dd7711",
        padding: 10
      }
    }
  }
});

const useStyles = makeStyles(theme => ({
  hutber: {
    "& .MuiInputBase-input": {
      background: "#000",
      color: "#fff"
    }
  },
  alternateApproach: {
    background: "#000",
    color: "#fff"
  }
}));

function App() {
  const classes = useStyles();
  return (
    <MuiThemeProvider theme={theme}>
      <Input defaultValue="Without overrides" variant="outlined" />
      <br />
      <br />
      <Input
        defaultValue="With overrides"
        variant="outlined"
        className={classes.hutber}
      />
      <br />
      <br />
      <Input
        defaultValue="Alternate approach"
        variant="outlined"
        classes={{ input: classes.alternateApproach }}
      />
    </MuiThemeProvider>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

从主题编辑覆盖输入样式


推荐阅读