MUI Box 组件有什么用?

IT技术 reactjs material-ui
2021-03-25 01:08:40

尽我所能,我无法理解这里给出的描述

Box 组件用作大多数 CSS 实用程序需求的包装器组件。

什么是 CSS 实用程序需求?

这个组件的用例是什么?它解决什么问题?你如何使用它?

我发现 MUI 文档非常有限且难以理解。我用谷歌搜索过,但通常只能找到关于如何使用 Material UI 的相当轻量级的博客文章。除了帮助理解这个组件之外,我真的很感激任何好的资源(比如他们自己文档的更好版本,如果存在的话)。

(背景,我大体了解React、JS、CSS、HTML等,后两者实力较弱)。

4个回答

编辑:这是在 MUI v4 时代写的。在 MUI v5 中,所有 MUI 组件都允许您通过sxprop定义 CSS 样式,而不仅仅是Box; Box也接受顶层和sx.

其他答案并没有真正解释使用Box.

Box呈现一个<div>可以应用CSS样式直接通过阵营props,为方便起见,因为像单独的CSS文件的替代品,CSS-在-JS,或者内嵌样式可以输入更多的文字和轻松使用。

例如,考虑这个使用 JSS 的组件:

import * as React from 'react'

import { makeStyles } from '@material-ui/styles'

const useStyles = makeStyles(theme => ({
  root: {
    display: 'flex',
    flexDirection: 'column',
    alignItems: 'center',
    padding: theme.spacing(1),
  }
}))

const Example = ({children, ...props}) => {
  const classes = useStyles(props);

  return (
    <div className={classes.root}>
      {children}
    </div>
  )
}

Box通过传递你想要的props来做到这一点要短得多

import * as React from 'react'

import Box from '@material-ui/core/Box'

const Example = ({children}) => (
  <Box display="flex" flexDirection="column" alignItems="stretch" padding={1}>
    {children}
  </Box>
)

还要注意如何padding={1}是 的简写theme.spacing(1)Box为使用此类 Material-UI 主题提供各种便利。

在较大的文件中,与样式就在元素上相比,在渲染元素和样式之间来回跳转可能会更麻烦。

情况下,你不会想使用Box(MUI V4):

  • 您希望封闭组件能够通过传递来覆盖样式classesmakeStyles启用此功能。 <Example classNames={{ root: 'alert' }} />makeStyles示例中有效,但在Box示例中无效。)
  • 您需要使用非平凡的选择器(例如 JSS 选择器:$root > li > a, $root .third-party-class-name
@reddtoric 这真的取决于你的目标。如果您希望设计团队能够在不乱写代码的情况下编辑 UI 外观,那么这很糟糕。如果您拥有所有编码人员并且不希望有一个单独的设计团队,那么与内联 CSS 相比,在 JSX 和 CSS 之间来回跳跃可能不值得浪费精力。
2021-05-23 01:08:40
我在哪里可以找到这样记录的东西?MUI文档显然只说明了如何使用的组件,如果你已经知道你要使用哪一个,不是为了什么目的,他们是为了做用。
2021-05-24 01:08:40
实际上有这个页面:material-ui.com/system那实际上是我第一次了解到Box.
2021-05-26 01:08:40
因此,如果我理解正确,如果我不使用/传入display="flex" padding={1}等 CSS 样式的东西,我可以只使用常规的 olediv吗?除了少打字和利用预制的东西(bgcolor="primary.main"theme.spacing(1)as{1}或其他任何东西),为什么有人会这样做?!它还使用 CSS 样式使结构混乱。不鼓励内联 CSS,这基本上就是这样吗?!?
2021-06-07 01:08:40
对于material-ui v5,Box 将发生变化。
2021-06-22 01:08:40

ABox就是这样,一个盒子。它是一个包裹在其内容周围的元素,它本身不包含样式规则,对视觉输出也没有任何默认效果。但它是根据需要放置样式规则的地方。它不提供任何真正的功能,只是一个用于控制分层标记结构中样式的占位符。

从结构上讲,它导致<div>.

我经常认为它在语义上类似于 JSX 空元素:

<>
  Some elements here
</>

因为它用于对事物进行分组。但它会导致<div>并且可以包含一些 Material UI 功能:

<Box className={classes.someStyling}>
  Some elements here
</Box>
这个答案可能具有误导性,Box 实际上在 DOM 中渲染了一个 div,而 `<></>" 代表了一个未在 DOM 中渲染的 React Fragment,它仅在您需要包装多个元素时使用,因为您只能返回JSX 中的单个元素
2021-06-10 01:08:40
@XavierTaylor:您目前可能确实没有理由包装您的任何元素。如果我有几个兄弟元素要组合在一起并将样式应用于分组,我会将它们包装在Box. 如果我有一个复杂的 UI 设置,我需要嵌套元素来执行一些 CSS 技巧(例如背景和文本之间的透明效果),那么我将使用 aBox作为父容器元素,因为它除了我明确应用的样式之外不应用任何默认样式告诉它。
2021-06-19 01:08:40
谢谢你的阐述。我还是不明白。它从根本上是一种为其他 Material-UI(或普通 React)元素设置样式的机制吗?为什么我要将其他元素包装在 <Box> 中?
2021-06-22 01:08:40

Material UI 中的 Box 组件它有很多有用的东西

最重要的是 box 元素默认内置了 material-ui/system 功能,这意味着如果您将其用作包装器,您可以将系统功能应用于您需要的内容

像这个例子:

<Box bgcolor="primary.main" color="primary.contrastText" p={2}>
  primary.main
</Box>

对于核心,您可以根据需要向其添加 css 类

它提供的另一个有用的东西可以在其他组件中扭曲,并且非常有助于将系统功能应用于它

像这个例子:

<Typography component="div" variant="body1">
  <Box color="primary.main">primary.main</Box>
</Typography>

上面的两个示例都是我从文档中获取的,您可以在此链接中找到它们:here

你可以找到我所说的材料 ui 系统功能的意思:这里

注意:您可以将任何材料 ui 系统功能添加到任何组件,例如此处的文档但我建议您使用 box 组件扭曲您需要的内容,它使生活更轻松

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使用useThemehook获取对象并创建内联样式,如果到处滥用,这不是一个好习惯:

<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在其他组件中,例如TypographyStack还支持系统属性,允许您将样式值传递给顶级props,从而导致代码更短。在内部,系统属性被收集并与sxprops合并,因此它们是相同的(有关更多详细信息,请参阅答案)

<Box
  bgcolor="primary.main"
  color="text.secondary"
  border={4}
  borderRadius={2}
  px={2}
  fontWeight="fontWeightBold"
  zIndex="tooltip"
  boxShadow={8}
>
  Box
</Box>

因为Box利用了sxprops,您还可以使用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那就用普通的吧
  • 当您在高度可重用的组件中使用它时,例如列表项、网格项或表格单元格。这是因为sxprop 的性能最慢(比第二慢的方法慢 2 倍
  • 当您使用其他 MUI 组件时。在 v5 中,来自 MUI 的所有组件都sx支持,因此Box如果您只想设置其他 MUI 组件的样式,则无需将其用作包装器或根组件。

代码沙盒演示

*:默认情况下 aBox是 a div,但您可以覆盖它的根组件。例如:<Box component='span'>