将 SVG 嵌入到 ReactJS 中

IT技术 javascript svg reactjs
2021-03-28 03:09:40

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

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

结果报错:

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

这样做的最简单方法是什么。使用React ART 之类的东西对于我正在尝试做的事情来说过分了。

6个回答

更新 2016-05-27

从 React v15 开始,React 对 SVG 的支持(接近?)100% 与当前浏览器对 SVG 的支持(source)相同。您只需要应用一些语法转换以使其与 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>
    );
}

工作代码笔演示

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


上一个答案

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

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

在这一点上,您可以考虑添加像 一样的propsfill,或者其他任何可能对配置有用的东西。

@ChinonsoChukwuogor 好问题!我不知道,我从未使用过 React Native。你试一试了吗?
2021-05-23 03:09:40
@HelloWorld 你能给我举个例子说明它不起作用吗?我只是分叉了我的原始演示来添加classB它并且它起作用了:codepen.io/acusti/pen/BVJzNg
2021-05-26 03:09:40
谢谢你,从此开始我已经成功地从文件导入SVG作为一个阵营成分没有任何装载机,我刚刚删除```的xmlns:OSB =“ openswatchbook.org/uri/2009/osb ”```从svg 标签,只留下 xlmns。显然,这都是关于标签解析的。以防万一,我也遵循了以下步骤:blog.logrocket.com/how-to-use-svgs-in-react
2021-05-27 03:09:40
@AndrewPatton 带有刻度字符的多个 Css 类名称不起作用:' .class1, .class2{fill: #005baa;}' 我该如何解决?
2021-06-08 03:09:40
为什么人们容忍 JSX?
2021-06-15 03:09:40

如果您只想包含一个静态 svg 字符串,则可以使用dangerouslySetInnerHTML

render: function() {
    return <span dangerouslySetInnerHTML={{__html: "<svg>...</svg>"}} />;
}

React 将直接包含标记而不进行任何处理。

到 2019 年,似乎您可以使用危险的SetInnerHTML,但我仍然无法使用危险的SetInnerHTML 使阴影过滤器在 Chrome 上工作,但它在 Firefox 上工作。
2021-06-14 03:09:40
我正在使用 React 控制 SVG 内部的一些路径,但 React 似乎不支持过滤器元素。有没有办法支持这个?似乎危险的SetInnerHTML 不起作用,因为我不能在 SVG 中放置一个跨度,我不能使用它来设置路径上的过滤器属性。我不认为有一种方法可以像往常一样创建 React 元素,而是让它们将所有属性逐字传递给 DOM 元素?
2021-06-21 03:09:40

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

例子

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

如果你想从文件中加载它,你可以尝试使用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>

您可以导入 svg 并将其用作图像

import chatSVG from '../assets/images/undraw_typing_jie3.svg'

并将其放在 img 标签中

<img src={chatSVG} className='iconChat' alt="Icon chat"/>
我相信这不是最初的要求
2021-05-29 03:09:40
那么如果你需要改变颜色怎么办?
2021-05-31 03:09:40
该问题要求专门嵌入 svg 内联。
2021-06-16 03:09:40