如何在反应应用程序中重用自定义 Material-ui 按钮?

How to reuse a Custom Material-ui button inside a react-app?

我正在开发我的第一个 React 应用程序。我导入了 Material-ui 按钮并对其进行了自定义。

现在我想在我的应用程序的多个组件中重复使用这个自定义按钮。每次使用此自定义按钮时,我都需要不同的文本。

我需要在哪里为每个按钮写这个特定的文本?

我的按钮在其他组件中导入时是可见的,但是我看不到我在按钮组件中写的文本。该按钮保持为空。

我的自定义按钮组件:MyButton:

import React from "react";
import Button from "@material-ui/core/Button";
import { withStyles } from "@material-ui/core/styles";

const styles = () => ({
  button: {
    margin: 50,
    padding: 10,
    width: 180,
    fontSize: 20
  }
});

function MyButton(props) {
  const { classes } = props;
  return (
    <Button variant="contained" color="primary" className={classes.button}>
      <b>  </b>
    </Button>
  );
}

export default withStyles(styles)(MyButton);

我导入 MyButton 组件的另一个组件:主页:

import React from "react";
import "../App.css";
import MyButton from "./Button";

function Header() {
  return (
    <header className="Header">
      {/* background image in css file */}
      <h1>Welcome </h1>
      <h3> description...</h3>
      <MyButton>Play now</MyButton>
    </header>
  );
}

export default Header;

我希望按钮显示 "Play now" (expected output) but for now it stays empty (actual output)。

将按钮的文本作为道具传递给您的按钮组件

<MyButton text="Play now"></MyButton>

然后在 MyButton 组件中你可以得到它

  function MyButton(props) {
   const { classes,text } = props;
    return (
     <Button variant="contained" color="primary" className={classes.button}>
       <b> {text} </b>
      </Button>
    );
  }

此外,我还找到了另一种解决方案,可以直接在每个按钮(MyButton 的子按钮)中写入文本,并在需要时对其进行自定义。

将 "children" 关键字作为 "props" 传递给 MyButton 组件:

function MyButton(props) {
  const { classes, children } = props;
  return (
    <Button variant="contained" color="primary" className={classes.button}>
      <b>{children}</b>
    </Button>
  );
}

然后像在 html 中那样在按钮内写下按钮的文本:

<MyButton> Play now </MyButton>

如果您将所有道具传递给包装的 Button,您将从自定义 Button 中获得最大的灵活性。这将自动处理 childrenclasses 只要您在 styles 对象中使用与包装组件支持的 CSS classes 相匹配的 class 键。

import React from "react";
import Button from "@material-ui/core/Button";
import { withStyles } from "@material-ui/core/styles";

const styles = () => ({
  root: {
    margin: 50,
    padding: 10,
    width: 180,
    fontSize: 20,
    fontWeight: "bold"
  }
});

function CustomButton(props) {
  return <Button variant="contained" color="primary" {...props} />;
}

export default withStyles(styles)(CustomButton);

注意在沙盒示例中,这允许您仍然利用其他 Button 功能,例如 disabled,指定其他样式,或覆盖 CustomButton 中指定的某些属性。

如果您遇到需要显式处理 children 的场景(在我上面的示例中,我使用 fontWeight CSS 而不是 <b> 标记),您可以使用以下语法仍然将所有道具传递给包装的组件:

function CustomButton({children, ...other}) {
  return <Button variant="contained" color="primary" {...other}><b>{children}</b></Button>;
}