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 dangerouslySetInnerHTMLapenas 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