ABox
基本上是div
类固醇上的*。Box
允许您div
像内联样式一样非常快速地将动态样式应用于其他正常的样式(但它不是内联样式)。除此之外,它还与MUI主题进行了一流的集成:
<Box
sx={{
bgcolor: 'primary.main',
color: 'text.secondary',
border: 4,
borderRadius: 2,
px: 2,
fontWeight: 'fontWeightBold',
zIndex: 'tooltip',
boxShadow: 8,
}}
>
Box
</Box>
如果您需要使用 normal 执行上述操作div
,则必须theme
使用useTheme
hook获取对象并创建内联样式,如果到处滥用,这不是一个好习惯:
<div
style={{
backgroundColor: theme.palette.primary.main,
color: theme.palette.text.secondary,
border: '4px solid black',
borderRadius: theme.shape.borderRadius * 2,
padding: `0 ${theme.spacing(2)}`,
fontWeight: theme.typography.fontWeightBold,
zIndex: theme.zIndex.tooltip,
boxShadow: theme.shadows[8],
}}
>
div
</div>
Box
在其他组件中,例如Typography
或Stack
还支持系统属性,允许您将样式值传递给顶级props,从而导致代码更短。在内部,系统属性被收集并与sx
props合并,因此它们是相同的(有关更多详细信息,请参阅此答案)
<Box
bgcolor="primary.main"
color="text.secondary"
border={4}
borderRadius={2}
px={2}
fontWeight="fontWeightBold"
zIndex="tooltip"
boxShadow={8}
>
Box
</Box>
因为Box
利用了sx
props,您还可以使用sx
添加响应值等功能:
<Box
display={{
xs: 'none',
sm: 'block',
}}
width={{
sm: 30,
md: 50,
lg: 100,
}}
>
或创建嵌套样式:
<Box
display='flex'
sx={{
'& > :not(:last-child)': {
mr: 2 // maginRight: theme.spacing(2)
},
':hover': {
bgcolor: 'green'
}
}}
>
什么时候使用Box
?
- 当您想
div
快速创建样式原型时。
- 当您想要创建在其他任何地方都无法真正重用的一次性内联样式时。当您想要修复布局的特定部分中的某些内容时,这很方便。
- 当您想要添加动态或响应式样式并同时使您的代码更容易理解时,因为一切都在一个地方定义,加上
sx
语法非常紧凑的事实。
- 当您想要引用多个 MUI 主题属性时,因为许多
sx
属性都是开箱即用的主题感知属性。
什么时候不使用Box
?
- 当您不需要设置任何样式时。
div
那就用普通的吧。
- 当您在高度可重用的组件中使用它时,例如列表项、网格项或表格单元格。这是因为
sx
prop 的性能最慢(比第二慢的方法慢 2 倍)
- 当您使用其他 MUI 组件时。在 v5 中,来自 MUI 的所有组件都
sx
支持,因此Box
如果您只想设置其他 MUI 组件的样式,则无需将其用作包装器或根组件。
*:默认情况下 aBox
是 a div
,但您可以覆盖它的根组件。例如:<Box component='span'>