reactjs Material UI Box组件是用来做什么的?

zysjyyx4  于 2023-05-22  发布在  React
关注(0)|答案(4)|浏览(362)

尽管我可能会尝试,我还是无法理解给出的here描述。
Box组件充当大多数CSS实用程序需要的 Package 器组件。
什么是'的' CSS实用程序的需要?
此组件的使用情形是什么?它能解决什么问题?你怎么使用它?
我发现Material UI文档非常有限,很难理解。我在谷歌上搜索过,但通常只找到关于如何使用Material UI的相当轻量级的博客文章。此外,为了帮助理解这个组件,我真的会很感激任何好的资源(比如他们自己的文档的更好版本,如果这样的东西存在的话)。
(背景,我一般懂React、JS、CSS、HTML等,后两者实力较弱)。

bqjvbblv

bqjvbblv1#

  • 编辑:这是在Material UI v4 days中编写的。在Material UI v5中,所有Material UI组件都允许您通过sx属性定义CSS样式,而不仅仅是Box;但是Box也接受顶级的样式 prop ,以及sx内的样式 prop 。*

其他答案并不能真正解释使用Box的动机。
Box呈现了一个<div>,为了方便起见,你可以直接通过React props应用CSS样式,因为像单独的CSS文件,CSS-in-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(Material UI v4)的情况:

  • 您希望封闭组件能够通过传递classes来覆盖样式(makeStyles启用了此功能。<Example classNames={{ root: 'alert' }} />可以在makeStyles示例中工作,但不能在Box示例中工作。)
  • 你需要使用非平凡的选择器(例如JSS选择器:$root > li > a$root .third-party-class-name
ee7vknir

ee7vknir2#

一个Box基本上是一个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>

如果你需要用一个普通的div来做上面的事情,你必须使用useTheme钩子来获取theme对象,并创建一个内联样式,如果到处都被滥用,这不是一个好的做法:

<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)也支持系统属性,允许您将样式值传递给顶级属性,从而缩短代码。在内部,系统属性被收集并与sx prop合并,因此它们是相同的(有关更多详细信息,请参见this答案)

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

由于Box利用了sx prop,因此您还可以使用sx功能,例如添加responsive values

<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,因此如果您只想对其他MUI组件进行样式化,则不需要使用Box作为 Package 器或根组件。

  • :默认情况下,Boxdiv,但您可以覆盖它的根组件。例如:<Box component='span'>
nnvyjq4y

nnvyjq4y3#

Box就是一个盒子。它是一个围绕其内容的元素,它本身不包含样式规则,也没有任何默认的视觉输出效果。但它是根据需要放置样式规则的地方。它不提供任何真实的的功能,只是一个占位符,用于控制分层标记结构中的样式。
在结构上,它会导致<div>
我经常认为它在语义上类似于JSX空元素:

<>
  Some elements here
</>

因为它是用来分组的。但它会导致<div>,并且可以包含一些Material UI功能:

<Box className={classes.someStyling}>
  Some elements here
</Box>
yiytaume

yiytaume4#

Material UI中的Box组件有很多有用的东西
最重要的是,box元素已经默认内置了material-ui/system功能,这意味着如果将其用作 Package 器,则可以将系统功能应用于所需内容

例如:

<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
你可以找到我所说的Material UI系统功能:here

注意:你可以添加任何材料的ui系统功能到任何组件,如docs here,但我建议你翘曲你需要与框组件,它使生活容易得多

相关问题