我如何设置作为prop传递的material-ui图标的样式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何设置作为prop传递的material-ui图标的样式相关的知识,希望对你有一定的参考价值。
我正在编写一个自定义Material UI React组件,我想将其传递给Icon
作为道具。但是,我想在获得图标时设置其样式并使其最小宽度和高度。
这里是我正在尝试做的简化版本。我想将iconStyle
应用于作为props.statusImage
传入的图标,但不知道如何。
import PropTypes from "prop-types";
import makeStyles from "@material-ui/styles";
const useStyles = makeStyles(
iconStyle:
minWidth: 100,
minHeight: 100
);
function MyComponentWithIconProps(props)
const styles = useStyles();
return <div>props.statusImage</div>;
MyComponentWithIconProps.propTypes =
statusImage: PropTypes.element
;
export default MyComponentWithIconProps;
我使用这样的组件
import Done from "@material-ui/icons";
<MyComponentWithIconProps statusImage=<Done/>
代码沙箱:https://codesandbox.io/s/jovial-fermi-dmb0p
我还尝试将提供的Icon
包装在另一个Icon
元素中,并尝试设置其样式。但是,这没有用,无论如何似乎都是“ hacky”。
有三种主要选择:
- 传递图标的元素类型而不是元素(例如,
Done
而不是<Done/>
),然后在渲染元素时添加className
(这是Fraction的回答)。 - 克隆元素以便向其添加
className
属性。 - 在父元素上放置一个类,并指定适当的子类型(例如
svg
)。
方法1:
index.js
import React from "react";
import ReactDOM from "react-dom";
import Done from "@material-ui/icons";
import MyComponentWithIconProps from "./MyComponentWithIconProps";
function App()
return (
<div className="App">
<MyComponentWithIconProps statusImage=Done />
</div>
);
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
MyComponentWithIconProps.js
import React from "react";
import PropTypes from "prop-types";
import makeStyles from "@material-ui/styles";
const useStyles = makeStyles(
iconStyle:
minWidth: 100,
minHeight: 100
);
function MyComponentWithIconProps(props)
const styles = useStyles();
const StatusImage = props.statusImage;
return (
<div>
<StatusImage className=styles.iconStyle />
</div>
);
MyComponentWithIconProps.propTypes =
statusImage: PropTypes.element
;
export default MyComponentWithIconProps;
方法2:
index.js
import React from "react";
import ReactDOM from "react-dom";
import Done from "@material-ui/icons";
import MyComponentWithIconProps from "./MyComponentWithIconProps";
function App()
return (
<div className="App">
<MyComponentWithIconProps statusImage=<Done /> />
</div>
);
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
MyComponentWithIconProps.js
import React from "react";
import PropTypes from "prop-types";
import makeStyles from "@material-ui/styles";
import clsx from "clsx";
const useStyles = makeStyles(
iconStyle:
minWidth: 100,
minHeight: 100
);
function MyComponentWithIconProps(props)
const styles = useStyles();
const styledImage = React.cloneElement(props.statusImage,
// Using clsx to combine the new class name with any existing ones that may already be on the element
className: clsx(styles.iconStyle, props.statusImage.className)
);
return <div>styledImage</div>;
MyComponentWithIconProps.propTypes =
statusImage: PropTypes.element
;
export default MyComponentWithIconProps;
方法3:
index.js
import React from "react";
import ReactDOM from "react-dom";
import Done from "@material-ui/icons";
import MyComponentWithIconProps from "./MyComponentWithIconProps";
function App()
return (
<div className="App">
<MyComponentWithIconProps statusImage=<Done /> />
</div>
);
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
MyComponentWithIconProps.js
import React from "react";
import PropTypes from "prop-types";
import makeStyles from "@material-ui/styles";
const useStyles = makeStyles(
iconStyle:
"& > svg":
minWidth: 100,
minHeight: 100
);
function MyComponentWithIconProps(props)
const styles = useStyles();
return <div className=styles.iconStyle>props.statusImage</div>;
MyComponentWithIconProps.propTypes =
statusImage: PropTypes.element
;
export default MyComponentWithIconProps;
我会这样:
import React from "react";
import PropTypes from "prop-types";
import makeStyles from "@material-ui/styles";
const useStyles = makeStyles(
iconStyle:
minWidth: 100,
minHeight: 100,
color: "red"
);
function MyComponentWithIconProps(props)
const styles = useStyles();
return <div className=styles.iconStyle>props.statusImage</div>;
MyComponentWithIconProps.propTypes =
statusImage: PropTypes.element
;
export default MyComponentWithIconProps;
像这样传递图标:
<MyComponentWithIconProps statusImage=Done />
然后按如下所示使用它:
return <div><props.statusImage className=styles.iconStyle /></div>;
以上是关于我如何设置作为prop传递的material-ui图标的样式的主要内容,如果未能解决你的问题,请参考以下文章
使用 TypeScript 时如何将 prop 传递给 material-ui@next 中的自定义根组件?
使用 Typescript 将 props 传递给由 styled-components 包装的 material-ui 按钮
如何自定义 Material-UI 和 styled-components 基于 props 的样式
Material-UI Button 组件如何推断传递给 `component` 属性的组件的属性?