我不确定我尝试做的事情是否可行,或者是否有更好的方法来实现我的目标。任何见解都会非常有用。
IconsIndex.js
文件中,并按原样导出: export { default as Rocket } from "./Rocket";
import * as Icon from "./icons/IconsIndex";
这使我基本上可以:<Icon.Rocket />
完美呈现SVG组件。
我想做的是能够让<Icon />
组件从父组件变得更加动态。
例如:
class ResourceBlock extends React.Component {
render() {
return (
<BlockContainer>
<BlockIcon>
<Icon.Rocket />
</BlockIcon>
<BlockTitle>{this.props.caption}</BlockTitle>
<Button>{this.props.buttonText}</Button>
</BlockContainer>
);
}
}
这将在调用Rocket
组件的任何位置输出ResourceBlock
图标。我希望能做的是这样的事情:
<ResourceBlock icon={Icon.Rocket} caption="Lorem..." buttonText="..." />
这可能吗?如何通过我们的图标实现这种灵活性?
关键是要尽可能地将SVG保持分离,因此将它们全部包装在一个额外的<Icon />
组件中并不吸引人。
答案 0 :(得分:3)
有点奇怪,但是in JSX if the node name is lowercase it will be translated as an html tag,而不是组件参考。因此,只需将您的图标属性分配给大写的本地const并以这种方式呈现:
class ResourceBlock extends React.Component {
render() {
const Icon = this.props.icon;
return (
<BlockContainer>
<BlockIcon>
<Icon />
</BlockIcon>
<BlockTitle>{this.props.caption}</BlockTitle>
<Button>{this.props.buttonText}</Button>
</BlockContainer>
);
}
}
就像你拥有它一样使用:
<ResourceBlock icon={Icon.Rocket} caption="Lorem..." buttonText="..." />
答案 1 :(得分:1)
不确定
<ResourceBlock icon={<Icon.Rocket />} caption="Lorem..." buttonText="..." />
class ResourceBlock extends React.Component {
render() {
return (
<BlockContainer>
<BlockIcon>
{this.props.icon}
</BlockIcon>
<BlockTitle>{this.props.caption}</BlockTitle>
<Button>{this.props.buttonText}</Button>
</BlockContainer>
);
}
}