material-ui用useStyles / jss覆盖主题

时间:2019-12-23 11:15:50

标签: javascript reactjs material-ui

如何在不使用!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>
}

输出:

enter image description here

enter image description here

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

1 个答案:

答案 0 :(得分:3)

覆盖无效的原因是,指定className道具等同于指定root CSS class for Input,但是主题覆盖位于input CSS类上应用于另一个元素(根元素是div,输入元素是该div中的<input>元素)。

在下面的示例中,您可以看到两种用于定位<input>元素的方法。第一种方法使用nested selector定位.MuiInputBase-input。第二种方法使用classes属性(而不是className),并提供覆盖内容作为input CSS类。

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);

Edit override input styling from theme