将Material-UI Box组件与抽屉组件一起使用

时间:2020-01-28 10:31:09

标签: reactjs material-ui

Material-UI Box component允许我们引用其他组件,如下所示:

import Button from "@material-ui/core/Button";
import Box from "@material-ui/core/Box";

const NewButton = ({ children }) => (
  <Box compoment={Button} px={3} py={1} color="white" bgcolor="primary.dark">
    {children}
  </Box>
)

这就像我想要的那样工作。但是,现在让我用Drawer组件尝试一下:

import Drawer from "@material-ui/core/Drawer";
import Box from "@material-ui/core/Box";

const NewDrawer = ({ children, open }) => {
  return (
    <Box component={Drawer} width="300px" bgcolor="secondary.dark">
      {children}
    </Box>
  )
}

有效。

有人知道为什么不这样做以及如何使它工作吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

根据Material UI文档,对于Drawer组件,我们必须将open道具传递为true

还需要像下面那样传递抽屉内容,

<Drawer open={true}>{renderContents()}</Drawer>

在Box组件api中,我们可以将组件数据作为“函数”传递。像下面的例子一样。

import Drawer from "@material-ui/core/Drawer";
import Box from "@material-ui/core/Box";

const NewDrawer = ({ children, open }) => {
  return (
    <Box component={() => {
      return <Drawer open={true}>{renderContents()}</Drawer>
    }} width="300px" bgcolor="secondary.dark">
      {children}
    </Box>
  )
}

请参阅我的code sandbox示例。

答案 1 :(得分:0)

在将Drawertemporary变体一起使用时(默认),className道具将获得applied to the Modal,这不是您要设置样式的元素。 / p>

相反,您想将样式Box应用于Paper element within the Drawer。您可以对Box子项使用render props approach来完成此操作,如下面的示例所示。

import React from "react";
import Drawer from "@material-ui/core/Drawer";
import Box from "@material-ui/core/Box";
import Button from "@material-ui/core/Button";

const BoxDrawer = explicitProps => {
  return (
    <Box width="300px" bgcolor="secondary.dark">
      {({ className }) => (
        <Drawer {...explicitProps} PaperProps={{ className: className }} />
      )}
    </Box>
  );
};
export default function App() {
  const [open, setOpen] = React.useState(false);
  return (
    <div className="App">
      <Button variant="contained" onClick={() => setOpen(!open)}>
        Open Drawer
      </Button>
      <BoxDrawer open={open} onClose={() => setOpen(false)}>
        <div style={{ textAlign: "center" }}>
          <h1>Hello CodeSandbox</h1>
          <Button variant="contained" onClick={() => setOpen(!open)}>
            Close Drawer
          </Button>
        </div>
      </BoxDrawer>
    </div>
  );
}

Edit Box Drawer