今天要講解的內容,在前面講解theme的應用時,有稍微講解了一些基本的應用,官方文件內前半部的內容我就不再提及了,我們會從 Overriding styles 開始講解。
makeStyles(hook)和 withStyles (HOC) API 允許為每個樣式表創建多個樣式規則,每個樣式規則都有自己的類名,類名通過 classes 變量提供給組件。
// A style sheet
const useStyles = makeStyles({
  root: {}, // a style rule
  label: {}, // a nested style rule
});
function Nested(props) {
  const classes = useStyles();
  return (
    <button className={classes.root}> // 'jss1'
      <span className={classes.label}> // 'jss2'
        nested
      </span>
    </button>
  );
}
function Parent() {
  return <Nested />
}
然而,類名通常是不確定的。父組件如何覆蓋嵌套元素的樣式?
包裝的組件接受一個 classes 屬性,它只是合併樣式表提供的類名。
const Nested = withStyles({
  root: {},
  label: {},
})(({ classes }) => (
  <button className={classes.root}>
    <span className={classes.label}> // 'jss2 my-label'
      Nested
    </span>
  </button>
));
function Parent() {
  return <Nested classes={{ label: 'my-label' }} />
}
這個就是前面範例中常用的方法
const useStyles = makeStyles({
  root: {},
  label: {},
});
function Nested(props) {
  const classes = useStyles(props);
  return (
    <button className={classes.root}>
      <span className={classes.label}> // 'jss2 my-label'
        nested
      </span>
    </button>
  );
}
function Parent() {
  return <Nested classes={{ label: 'my-label' }} />
}
如果你更喜歡 CSS 語法而不是 JSS,您可以使用 jss-plugin-template 插件。
import React from 'react';
import { jssPreset, StylesProvider, makeStyles } from '@material-ui/core/styles';
import { create } from 'jss';
import jssTemplate from 'jss-plugin-template';
const jss = create({
  plugins: [jssTemplate(), ...jssPreset().plugins],
});
const useStyles = makeStyles({
  root: `
    background: linear-gradient(45deg, #fe6b8b 30%, #ff8e53 90%);
    border-radius: 3px;
    font-size: 16px;
    border: 0;
    color: white;
    height: 48px;
    padding: 0 30px;
    box-shadow: 0 3px 5px 2px rgba(255, 105, 135, 0.3);
  `,
});
function Child() {
  const classes = useStyles();
  return (
    <button type="button" className={classes.root}>
      String templates
    </button>
  );
}
function StringTemplates() {
  return (
    <StylesProvider jss={jss}>
      <Child />
    </StylesProvider>
  );
}
export default StringTemplates;
後面都屬 jss 應用的部分,我就不再提及了,因為之後有機會做 JSS 系列的講解時再來補足這部分的應用。
那麼今天的內容就先到這邊了,明天的會講解 API 的部分。