Atualização 2016-05-27
A partir do React v15, o suporte ao SVG no React é (próximo a?) 100% de paridade com o suporte atual do navegador ao SVG ( origem ). Você só precisa aplicar algumas transformações de sintaxe para torná-lo compatível com JSX, como você já precisa fazer para HTML ( class
→ className
, style="color: purple"
→ style={{color: 'purple'}}
). Para qualquer atributo com espaço para nome (separado por dois pontos), por exemplo xlink:href
, remova :
e coloque em maiúscula a segunda parte do atributo, por exemplo xlinkHref
. Aqui está um exemplo de uma SVG com <defs>
, <use>
e estilos 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>
);
}
Demonstração de código de trabalho
Para obter mais detalhes sobre suporte específico, consulte a lista de documentos de atributos SVG suportados . E aqui está o problema (agora fechado) do GitHub que rastreia o suporte a atributos SVG com espaço para nome.
Resposta anterior
Você pode fazer uma incorporação simples do SVG sem precisar usar dangerouslySetInnerHTML
apenas os atributos de espaço para nome. Por exemplo, isso funciona:
render: function() {
return (
<svg viewBox="0 0 120 120">
<circle cx="60" cy="60" r="50"/>
</svg>
);
}
Nesse ponto, você pode pensar em adicionar adereços como fill
, ou qualquer outra coisa que possa ser útil para configurar.
<svg id="Layer_1">
(ou melhor ainda, sem o ID). Edit: aqui está um exemplo: jsbin.com/nifemuwi/2/edit?js,output