ปรับปรุง 2016-05-27
สำหรับ React v15 การสนับสนุน SVG ใน React นั้น (ใกล้เคียงกับ?) 100% เทียบเท่ากับเบราว์เซอร์ปัจจุบันที่รองรับ SVG ( แหล่งที่มา ) คุณเพียงแค่ต้องใช้การแปลงรูปแบบไวยากรณ์เพื่อให้เข้ากันได้กับ JSX เช่นเดียวกับที่คุณต้องทำกับ HTML ( class
→ className
, style="color: purple"
→ style={{color: 'purple'}}
) สำหรับแอตทริบิวต์ใด ๆ namespaced (ลำไส้ใหญ่แยก) เช่นxlink:href
เอาและใช้ประโยชน์จากส่วนที่สองของแอตทริบิวต์เช่น:
xlinkHref
นี่คือตัวอย่างของ SVG กับ<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