将SVG嵌入到ReactJS中

nic*_*las 123 javascript svg reactjs

是否可以将SVG标记嵌入到ReactJS组件中?

render: function() {
  return (
    <span>
      <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmln ...
    </span>
  );
}
Run Code Online (Sandbox Code Playgroud)

导致错误:

不支持命名空间属性.ReactJSX不是XML.

这样做最轻的方法是什么.使用像React ART这样的东西对我正在尝试做的事情来说过分了.

And*_*ton 162

更新2016-05-27

从React v15开始,React中对SVG的支持是(接近?)100%奇偶校验,当前浏览器支持SVG().你只需要应用一些语法转换来使它与JSX兼容,就像你必须为HTML做的那样(classclassName,style="color: purple"style={{color: 'purple'}}).对于任何命名空间(冒号分隔)属性,例如xlink:href,删除:和大写属性的第二部分,例如xlinkHref.下面是与SVG的例子<defs>,<use>以及内嵌样式:

function SvgWithXlink (props) {
    return (
        <svg
            width="100%"
            height="100%"
            xmlns="http://www.w3.org/2000/svg"
            xmlnsXlink="http://www.w3.org/1999/xlink"
        >
            <style>
                { `.classA { fill:${props.fill} }` }
            </style>
            <defs>
                <g id="Port">
                    <circle style={{fill:'inherit'}} r="10"/>
                </g>
            </defs>

            <text y="15">black</text>
            <use x="70" y="10" xlinkHref="#Port" />
            <text y="35">{ props.fill }</text>
            <use x="70" y="30" xlinkHref="#Port" className="classA"/>
            <text y="55">blue</text>
            <use x="0" y="50" xlinkHref="#Port" style={{fill:'blue'}}/>
        </svg>
    );
}
Run Code Online (Sandbox Code Playgroud)

工作codepen演示

有关特定支持的更多详细信息,请查看文档的受支持SVG属性列表.这是(现已关闭的)GitHub问题,它跟踪对命名空间SVG属性的支持.


以前的答案

您可以dangerouslySetInnerHTML通过仅剥离命名空间属性来执行简单的SVG嵌入,而无需使用.例如,这有效:

        render: function() {
            return (
                <svg viewBox="0 0 120 120">
                    <circle cx="60" cy="60" r="50"/>
                </svg>
            );
        }
Run Code Online (Sandbox Code Playgroud)

此时,您可以考虑添加道具fill,或者其他可能有用的配置.


Sop*_*ert 55

如果你想要包含一个静态svg字符串,你可以使用dangerouslySetInnerHTML:

render: function() {
    return <span dangerouslySetInnerHTML={{__html: "<svg>...</svg>"}} />;
}
Run Code Online (Sandbox Code Playgroud)

和React将直接包含标记而不进行处理.

  • 我正在使用React控制SVG内部的一些路径,但React似乎不支持过滤器元素.有没有办法支持这个?看起来像dangerouslySetInnerHTML将无法工作,因为我不能在SVG中放置一个span,我不能使用它来设置路径上的filter属性.我不认为有一种方法像往常一样创建React元素,但让它们将所有属性逐字传递给DOM元素? (3认同)

las*_*tid 27

根据反应开发人员的说法,您不需要命名空间xmlns.如果您需要该属性xlink:href,可以使用xlinkHref from react 0.14

Icon = (props) => {
  return <svg className="icon">
    <use xlinkHref={ '#' + props.name }></use>
  </svg>;
}
Run Code Online (Sandbox Code Playgroud)


You*_*kko 11

如果你想从文件加载它,你可以尝试使用React-inlinesvg - 这非常简单和直接.

import SVG from 'react-inlinesvg';

<SVG
  src="/path/to/myfile.svg"
  preloader={<Loader />}
  onLoad={(src) => {
    myOnLoadHandler(src);
  }}
>
  Here's some optional content for browsers that don't support XHR or inline
  SVGs. You can use other React components here too. Here, I'll show you.
  <img src="/path/to/myfile.png" />
</SVG>
Run Code Online (Sandbox Code Playgroud)


Dem*_*mez 7

您可以导入 svg 并像图像一样使用它

import chatSVG from '../assets/images/undraw_typing_jie3.svg'
Run Code Online (Sandbox Code Playgroud)

并将其放入 img 标签中

<img src={chatSVG} className='iconChat' alt="Icon chat"/>
Run Code Online (Sandbox Code Playgroud)

  • 那么如果需要改变颜色怎么办? (3认同)