MUI Sandbox @ github
MUI 架構
Understanding MUI packages @ MUI v5
MUI Core
- Material UI(
@mui/material):使用基於 Material Design 所設計出來的元件,同時包含「功能」和「樣式」。 - MUI Base(
@mui/base):包含許多 Unstyled(headless)的 React UI 元件,只是用提供的「功能」,CSS 樣式的部分需 要自己處理。 - MUI System(
@mui/system):相對於只用「功能」的 MUI Base,MUI System 則是提供許多 CSS Utilities 可以使用,特別像是sx,它需要搭配 MUI Base、MUI components 使用。
MUI System
MUI System @ MUI 5
sx
The sx prop @ MUI 5
MUI system 的 sx 特別適合用在一次性(one-ff)的元件。
一般使用
到 Properties 可以找到所有可以用的屬性名稱,以及可以直接使用到的 theme mapping,並且看 ${value} 的地方。
舉例來說:

- 如果寫
{ border: 3 },表示的即是border: 3px solid - 如果寫
{ borderColor: 'success.dark' },對應的會是theme.palette.success.dark的顏色 - 如果寫
{ gap: 3 },對應到的是theme.spacing(3) - 如果寫
{ display: 'inline-block' },因為這裡沒有任何 mapping(none),所以就是直接帶入該值 - 如果寫
{ fontFamily: 'fontFamily' },因為它的 mapping 是theme.typography[value],因此會套用theme.typography.fontFamily,表示會套用預設的 font family。
一般來說,搭配 <Box /> 使用 sx 是最簡單的方式:
<Box
sx={{
border: 1, // 1px solid
bgcolor: 'background.paper', // bgcolor 的 "c" 是小寫,theme.palette.background.paper
boxShadow: 1, // theme.shadows[1]
borderRadius: 2, // theme.shape.borderRadius * 2
p: 2, // theme.spacing(2)
minWidth: 300, // 300px
fontFamily: 'fontFamily', // theme.typography.fontFamily
}}
/>
除了可以把上述的 System keys 放在 sx 中使用外,也可以把它們當成 <Box /> 的 props 帶入:
// 個人認為還是把 CSS 相關的屬性放在 `sx` 中集中管理比較好,和「功能」較相關的再用 props 傳下去。
<Box color="text.primary" fontSize={32} fontWeight="medium" fontFamily="fontFamily">
98.3 K
</Box>
把樣式相關的屬性集中管理在 sx 中
個人認為還是把 CSS 相關的屬性放在 sx 中集中管理比較好,和「功能」較相關的再用 props 傳下去。
callback value:需要使用到 theme 時
需要的話,sx 的「值」或「屬性值」都可以帶 callback function,特別適合用在需要使用 theme 的時候:
// 屬性值使用 callback
<Box
sx={{
height: (theme) => theme.spacing(2),
}}
/>
// sx 的值使用 callback
<Box
sx={(theme) => ({
...theme.typography.body1,
color: theme.palette.primary.main
})}
/>