React - 渲染导入的.svg文件

时间:2017-06-19 20:13:31

标签: reactjs svg

我需要渲染.svg文件。我不想使用dangerouslySetInnerHTML。如果我直接复制svg内容并从组件中呈现它,我能够成功呈现svg。

然而,这不是非常可重复使用的。我不想从每个.svg文件中复制内容。我希望能够导入一个svg文件并将其传递给我的组件,然后将其呈现内容。

这是我到目前为止所做的,但它并没有渲染我的svg。

我创建了一个接受导入的svg文件的组件,如下所示:

import React from "react";

class SvgComponent extends React.Component {
  constructor(props) {
     super(props);
   }
  render() {  
    return (
     props.svg // this works if I copy my .svg contents here (<svg>....</svg>)
  );
 }
};

SvgComponent.propTypes = {
  svg: React.PropTypes.string.isRequired,
};

export default SvgComponent;

以下是我使用该组件的方式:

import mySvg from './images/mySvg.svg';
const Icon = (props) => { 
  return (
    <svgComponent svg={mySvg} />
  );
};

Icon.propTypes = {
  icon: React.PropTypes.string.isRequired,
};

export default Icon;

这不起作用 - 它不会在网页上显示我的svg,甚至不会显示在dom中。当我检查页面时,我看到的只是一个空的svgComponent:

<svgComponent />

任何有关获取.svg文件以显示反应的帮助都很棒!

1 个答案:

答案 0 :(得分:2)

我创建了一个模块来解决这个问题。有了它,您可以加载svg并使用JSX操作其元素,而无需粘贴svg代码。

Npm包:https://www.npmjs.com/package/react-samy-svg

检查Glitch上的示例:https://fossil-transport.glitch.me

使用简单

<Samy path="path to your svg file">
     <Proxy select="#Star" fill="red"/>
 </Samy>

每当您需要更改某些SVG属性时,只需创建一个Proxy元素并使用'select'prop(接受CSS选择器)。在Proxy上设置的所有道具都将被作为SVG元素的属性