Aktualizacja 2016-05-27
Począwszy od React v15, obsługa SVG w Reakcie jest (bliska?) 100% parzystości z obecną obsługą SVG przez przeglądarkę ( źródło ). Wystarczy zastosować pewne przekształcenia składni, aby był kompatybilny z JSX, tak jak już musisz to zrobić dla HTML ( class
→ className
, style="color: purple"
→ style={{color: 'purple'}}
). W przypadku dowolnego atrybutu z przestrzenią nazw (rozdzielanego dwukropkami), np. xlink:href
Usuń :
i zamień drugą część atrybutu wielką literą, np xlinkHref
. Oto przykład z SVG <defs>
, <use>
i stylów inline:
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>
);
}
Działające demo codepen
Aby uzyskać więcej informacji na temat określonej obsługi, sprawdź listę obsługiwanych atrybutów SVG w dokumentacji . A oto (teraz zamknięty) problem z GitHub, który śledził obsługę atrybutów SVG w przestrzeni nazw.
Poprzednia odpowiedź
Możesz wykonać proste osadzenie SVG bez konieczności używania, dangerouslySetInnerHTML
po prostu usuwając atrybuty przestrzeni nazw. Na przykład to działa:
render: function() {
return (
<svg viewBox="0 0 120 120">
<circle cx="60" cy="60" r="50"/>
</svg>
);
}
W którym momencie możesz pomyśleć o dodaniu rekwizytów, takich jak fill
lub cokolwiek innego, co może być przydatne do skonfigurowania.
<svg id="Layer_1">
(lub nawet lepiej, bez identyfikatora). Edycja: oto przykład: jsbin.com/nifemuwi/2/edit?js,output