ReactJSへのSVGの埋め込み


127

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のようなものを使用することは、私がやろうとしていることに対してはやり過ぎです。


1
jsbinを作成できますか?これは、SVGの開始タグをちょうど<svg id="Layer_1">(または、IDなしでさらに)変更するのと同じくらい簡単かもしれません。編集:例を示します:jsbin.com/nifemuwi/2/edit?js,output
Brigand

@FakeRainBrigandありがとう!この場合、それはとても簡単でした。ベンの答えを見てください。必要なときにjsx解析を回避できることを知っておくと役立ちます。
ニコラス2014年

回答:


178

更新2016-05-27

React v15では、ReactでのSVGのサポートは(ほぼ?)、現在のブラウザーによるSVG(ソース)のサポートと100%同等です。すでにHTMLで行う必要があるようにclassclassNamestyle="color: purple"style={{color: 'purple'}})、JSX互換にするためにいくつかの構文変換を適用する必要があるだけです。たとえば、名前空間付き(コロンで区切られた)属性の場合はxlink:href、を削除し:、属性の2番目の部分を大文字にします(例:)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属性のドキュメントのリストを確認してください。そして、名前空間のSVG属性のサポートを追跡した(現在はクローズされている)GitHubの問題を次に示します。


前の答え

dangerouslySetInnerHTML名前空間属性を削除するだけで、使用する必要なく簡単なSVG埋め込みを実行できます。たとえば、これは動作します:

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

その時点でfill、のような小道具やその他の構成に役立つと思われるものを追加することを考えることができます。


@ChinonsoChukwuogorいい質問ですね!わかりません。ReactNativeを使用したことがありません。やってみましたか?
アンドリューパットン

@AndrewPattonティック文字を含む複数のCssクラス名が機能しない: ' .class1, .class2{fill: #005baa;}'どうすれば修正できますか?
HelloWorld 2018年

@HelloWorld機能しない例を教えてください。オリジナルのデモを分岐して追加classBし、うまくいき
Andrew Patton

おかげで、これから始めて、ローダーを使用せずにファイルからsvgをReactコンポーネントとしてインポートできました。```xmlns:osb = " openswatchbook.org/uri/2009/osb " `` `をsvgタグ。xlmnsのみを残します。どうやらタグの解析がすべてです。念のため、次の手順も実行しました:blog.logrocket.com/how-to-use-svgs-in-react
Funder

56

含める静的svg文字列がある場合は、次のように使用できますdangerouslySetInnerHTML

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

そしてReactはマークアップをまったく処理せずに直接含めます。


3
Reactを使用してSVG内のいくつかのパスを制御していますが、Reactはフィルター要素をサポートしていないようです。これをサポートする方法はありますか?SVG内にスパンを配置できず、それを使用してパスにフィルター属性を設定できないため、dangerouslySetInnerHTMLは機能しないようです。通常どおりにReact要素を作成する方法はないと思いますが、すべての属性をそのままDOM要素に渡しますか?
アンディ

2019年、dangerouslySetInnerHTMLを使用できるようですが、それでも私はdangerouslySetInnerHTMLを使用してChromeでシャドウフィルターを機能させることができませんでしたが、Firefoxでは機能しています。
Shnd

31

反応開発者によると、名前空間xmlnsは必要ありません。この属性が必要な場合はxlink:href、react 0.14のxlinkHrefを使用できます。

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

12

ファイルからロードしたい場合は、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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.