Обновление 2016-05-27
Начиная с React v15, поддержка SVG в React является (близкой к?) 100% паритетом с текущей поддержкой SVG в браузере ( источник ). Вам просто нужно применить некоторые синтаксические преобразования, чтобы сделать его JSX-совместимым, как вы уже сделали для HTML ( class
→ className
, style="color: purple"
→ style={{color: 'purple'}}
). Для любого атрибута с пространством имен (разделенных двоеточиями), например xlink:href
, удалите :
и используйте вторую часть атрибута с заглавной буквы, например xlinkHref
. Вот пример СВГ с <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 в документации . И вот (теперь закрытая) проблема GitHub, которая отслеживала поддержку атрибутов SVG с пространством имен.
Предыдущий ответ
Вы можете выполнить простую вставку SVG без необходимости dangerouslySetInnerHTML
, просто удалив атрибуты пространства имен. Например, это работает:
render: function() {
return (
<svg viewBox="0 0 120 120">
<circle cx="60" cy="60" r="50"/>
</svg>
);
}
В этот момент вы можете подумать о добавлении таких свойств fill
или о том, что еще может быть полезно настроить.
<svg id="Layer_1">
(или даже лучше без идентификатора). Изменить: вот пример: jsbin.com/nifemuwi/2/edit?js,output