2014-11-08 10 views
61

Also normalerweise die meisten meiner SVG-Symbole enthalten, die einfache Styling erfordern, das tue ich:SVG Verwendung Tag und ReactJS

<svg> 
    <use xlink:href="/svg/svg-sprite#my-icon" /> 
</svg> 

Jetzt habe ich mit ReactJS gespielt als in der letzten Zeit als eine mögliche Komponente Auswertung in meiner neuer Front-End-Entwicklungsstack Ich habe jedoch festgestellt, dass in der Liste der unterstützten Tags/Attribute weder use noch xlink:href unterstützt werden.

Ist es möglich, Svg Sprites zu verwenden und sie auf diese Weise in ReactJS zu laden?

+8

Für zukünftige Besucher können Sie jetzt '' verwenden. –

+3

'xlink: href' ist veraltet, jetzt sollte nur' href' verwendet werden - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href –

+0

@MattGreer Ab 2018 , Safari benötigt immer noch 'xlink: href', also müssen wir es trotzdem benutzen. Aktuelle Webanwendungen müssen entweder den gemeinsamen Nenner der Browserfunktionen verwenden oder spezifische Workarounds/Polyfills implementieren. – Tobia

Antwort

37

React unterstützt nicht alle SVG-Tags, wie Sie sagen, es gibt eine Liste der unterstützten Tags here. Sie arbeiten an einer breiteren Unterstützung, zB in this ticket.

Eine gemeinsame Abhilfe ist, HTML zu injizieren, anstatt für nicht unterstützte Tags, f.ex: Reagieren Sie als Eigentum xlinkHref

render: function() { 
    var useTag = '<use xlink:href="/svg/svg-sprite#my-icon" />'; 
    return <svg dangerouslySetInnerHTML={{__html: useTag }} />; 
} 
+0

Nein, nicht 'dangerousSetInnerHTML' verwenden. Sie können 'xlinkHref' wie unten erwähnt verwenden. – Tobia

158

Ab 0,14 Reagieren, xlink:href verfügbar über ist. Es wird als eine der "bemerkenswerten Verbesserungen" in der release notes für 0,14 erwähnt.

<!-- REACT JSX: --> 
<svg> 
    <use xlinkHref='/svg/svg-sprite#my-icon' /> 
</svg> 

<!-- RENDERS AS: --> 
<svg> 
    <use xlink:href="/svg/svg-sprite#my-icon"></use> 
</svg> 

Update 3: Zum Zeitpunkt des Schreibens, Reaktion SVG Master Eigenschaften here gefunden werden kann.

Update 2: Es scheint, dass alle svg Attribute jetzt verfügbar sein sollten über reagieren (svg attribute PR verschmolzen sehen).

Update 1: Sie wollen für zusätzliche SVG-Unterstützung Landung ein Auge auf die svg related issue auf GitHub halten. Es gibt Entwicklungen in den Werken.

Demo:

const svgReactElement = (
 
    <svg 
 
    viewBox="0 0 667 667" 
 
    width="100" 
 
    height="100" 
 
    > 
 
    <image width="667" height="667" xlinkHref="https://i.imgur.com/w7GCRPb.png"/> 
 
    </svg> 
 
) 
 

 
var resultHtml = ReactDOMServer.renderToStaticMarkup(svgReactElement) 
 
document.getElementById('render-result-html').innerHTML = escapeHtml(resultHtml) 
 

 
ReactDOM.render(svgReactElement, document.getElementById('render-result')) 
 

 
function escapeHtml(unsafe) { return unsafe.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;"); }
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.0.0/umd/react.development.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.0.0/umd/react-dom.development.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.0.0/umd/react-dom-server.browser.development.js"></script> 
 

 
<h2>Render result of rendering:</h2> 
 
<pre>&lt;svg 
 
    viewBox="0 0 667 667" 
 
    width="100" 
 
    height="100" 
 
&gt; 
 
    &lt;image width="667" height="667" xlinkHref=&quot;https://i.imgur.com/w7GCRPb.png&quot; /&gt; 
 
&lt;/svg&gt;</pre> 
 

 
<h2><code>ReactDOMServer.renderToStaticMarkup()</code> output:</h2> 
 
<pre id="render-result-html"></pre> 
 
<h2><code>ReactDOM.render()</code> output:</h2> 
 
<div id="render-result"></div>

+1

> Update 25.12.2015: Es scheint, dass alle SVG-Attribute jetzt über react verfügbar sein sollten (siehe fusioniertes SVG-Attribut PR). Gibt es eine Standardmethode zur Verwendung dieser SVG-Attribute? Werden alle wie bei xlink camel cased sein: href => xlinkHref? – majorBummer

+0

@majorBummer werfen Sie einen Blick [hier] (https://github.com/facebook/react/blob/dff05beeff9562647950461830ce42d484ca55fa/src/renderers/dom/shared/SVGDOMPropertyConfig.js#L58-L83) –

+1

das muss wirklich die richtige sein Antwort, vor allem, wenn die aktuell gewählte Antwort dangerouslySetInnerHTML empfiehlt, was, na ja, gefährlich ist – feihcsim

0

ich einen kleinen Helfer geschaffen, um dieses Problem funktioniert: https://www.npmjs.com/package/react-svg-use

erste npm i react-svg-use -S dann einfach

import Icon from 'react-svg-use' 

React.createClass({ 
    render() { 
    return (
     <Icon id='car' color='#D71421' /> 
    ) 
    } 
}) 

, und dies wird das folgende Markup

<svg> 
    <use xlink:href="#car" style="fill:#D71421;"></use> 
</svg> 
+0

Wie ich die SVG Sprite Datei einfüge? – Kartz

2

dann erzeugen, wie bereits gesagt, in Jon Surrell Antwort Verwenden-Tags werden jetzt unterstützt. Wenn Sie sich nicht mit JSX sind, können Sie es wie folgt implementieren:

React.DOM.svg({ className: 'my-svg' }, 
    React.createElement('use', { xlinkHref: '/svg/svg-sprite#my-icon' }, '') 
) 
2

Wenn Sie xlink:href auftreten, dann können Sie das Äquivalent in ReactJS erhalten durch den Darm entfernen und camelcase den zusätzlichen Text: xlinkHref.

Sie werden wahrscheinlich andere Namespace-Tags in SVG verwenden, wie xml:space, etc ..Die gleiche Regel gilt für sie (d. H. xml:space wird xmlSpace).