今天來釐清 @material-ui/core/styles 的 API。
一個返回類名生成器函數的函數。
options (Object [optional]):
class name generator: 提供給 JSS。
import React from 'react';
import { StylesProvider, createGenerateClassName } from '@material-ui/core/styles';
const generateClassName = createGenerateClassName({
productionPrefix: 'c',
});
export default function App() {
return (
<StylesProvider generateClassName={generateClassName}>...</StylesProvider>
);
}
這個函數在運行時並沒有真正“做任何事情”,它只是身份函數,唯一目的是在為主題的函數 makeStyles/withStyles 提供樣式規則時阻止 TypeScript 的類型擴展。
styles: 樣式Object.
import { makeStyles, createStyles } from '@material-ui/core/styles';
const useStyles = makeStyles((theme: Theme) => createStyles({
root: {
backgroundColor: theme.color.red,
},
}));
export default function MyComponent {
const classes = useStyles();
return <div className={classes.root} />;
}
這就是我們之前範例常常使用的 hook。
hook: 可以在functional component 中使用。
import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
const useStyles = makeStyles({
root: {
backgroundColor: 'red',
color: props => props.color,
},
});
export default function MyComponent(props) {
const classes = useStyles(props);
return <div className={classes.root} />;
}
這是一個處理服務器端渲染的類助手,實用範例。
import ReactDOMServer from 'react-dom/server';
import { ServerStyleSheets } from '@material-ui/core/styles';
const sheets = new ServerStyleSheets();
const html = ReactDOMServer.renderToString(sheets.collect(<App />));
const cssString = sheets.toString();
const response = `
<!DOCTYPE html>
<html>
<head>
<style id="jss-server-side">${cssString}</style>
</head>
<body>${html}</body>
</html>
`;
使用樣式組件模式將樣式表與功能組件鏈接起來。
Component: 建立一個新的 component。
import React from 'react';
import { styled } from '@material-ui/core/styles';
const MyComponent = styled('div')({
backgroundColor: 'red',
});
const MyThemeComponent = styled('div')(({
theme
}) => ({
padding: theme.spacing(1),
}));
export default function StyledComponents() {
return (
<MyThemeComponent>
<MyComponent />
</MyThemeComponent>
);
}
那麼今天的內容就到這邊,明天還會接續講解後面的 API。