如何设置作为道具传递的material-ui图标的样式 [英] How do I style a material-ui Icon which was passed as prop
问题描述
我正在编写一个自定义的Material UI React组件,我想将Icon
传递给它作为道具.但是,我想在获得图标时设置其样式,并使其最小宽度和高度.
I'm writing a custom Material UI React component which I want to pass an Icon
into as a prop. However I want to style the icon when I get it and make it a minimum width and height.
这是我正在尝试做的简化版本.我想将iconStyle
应用于作为props.statusImage
传入的图标,但不知道如何操作.
Here's a simplified version of what I'm trying to do. I want to apply the iconStyle
to the icon passed in as props.statusImage
but can't figure out how.
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".
I've also tried wrapping the supplied Icon
in another Icon
element and attempting to style that. However that didn't work and seems sort of 'hacky' anyway.
推荐答案
主要有三种选择:
- 传入图标的元素类型而不是元素(例如,用
Done
代替<Done/>
),然后在渲染元素时添加className
(这是Fraction的回答). li>
- 克隆元素以向其中添加
className
道具. - 在父元素上放置一个类,并定位适当的子类型(例如
svg
).
- Pass in the element type of the icon rather than an element (e.g.
Done
instead of<Done/>
) and then add theclassName
as you render the element (this is the approach in Fraction's answer). - Clone the element in order to add the
className
prop to it. - Put a class on the parent element and target the appropriate child type (e.g.
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;
这篇关于如何设置作为道具传递的material-ui图标的样式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!