React: SVG ํƒœ๊ทธ ๋ฐ ์†์„ฑ ๋ˆ„๋ฝ

์— ๋งŒ๋“  2014๋…„ 06์›” 08์ผ  ยท  107์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/react

๊ด€๋ฆฌ์ž์˜ ์ฐธ๊ณ  ์‚ฌํ•ญ: React 15๋ถ€ํ„ฐ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹ค์ œ๋กœ ๊ตฌํ˜„๋˜๋Š” SVG ์‚ฌ์–‘์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„๋ฝ๋œ ์†์„ฑ์„ ์ฐพ๊ฑฐ๋‚˜ ํƒœ๊ทธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์•„๋ž˜์— ์˜๊ฒฌ์„ ์ž‘์„ฑํ•ด ์ฃผ์„ธ์š”. React.DOM.* ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜๋Š” ๋ชจ๋“  ํƒœ๊ทธ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ˆ„๋ฝ๋œ ํƒœ๊ทธ์— ๋Œ€ํ•ด React.createFactory ๋˜๋Š” React.createElement() ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” React.createElement() ๋ณ€ํ™˜๋˜๊ณ  ๋ณธ์งˆ์ ์œผ๋กœ ๋ชจ๋“  ํƒœ๊ทธ๋ฅผ ์ง€์›ํ•˜๋Š” JSX๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

xlink:href ์†์„ฑ์— ๋Œ€ํ•ด ์ƒ๋‹นํžˆ ๋งŽ์€ ํ˜ผ๋ž€์ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ง€์› _is_ ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<use xlinkHref="#shape" x="50" y="50" />

React๋Š” 0.14.x์—์„œ๋„ ์ด๋ฅผ xlink:href ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด ๋ฐ”์ด์˜ฌ๋ฆฐ ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋ชจ๋“  107 ๋Œ“๊ธ€

์ด ์ž‘์—…์„ ํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? filter ํƒœ๊ทธ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

preserveAspectRatio ๋„ ๋ˆ„๋ฝ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค: http://jsfiddle.net/jonase/kb3gN/3025/

์ด์— ๋Œ€ํ•œ PR์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋ˆ„๋ฝ๋œ ๋ชจ๋“  ์†์„ฑ/ํƒœ๊ทธ๋ฅผ ๋จผ์ € ์ˆ˜์ง‘ํ•˜๊ณ  ๋‚˜์ค‘์— ๋‹จ์ผ ํŒจ์น˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๊นŒ?

[ํŽธ์ง‘] reservedAspectRatio๊ฐ€ ์ปค๋ฐ‹์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/facebook/react/commit/0f0328f0930d7fcf0b92cde40b1d6966cd747054

์•ˆ๋…•.

marker* ์†์„ฑ์€ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ #1738์˜ @cassus ๋•๋ถ„์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ <marker> SVG ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?
https://developer.mozilla.org/en-US/docs/Web/SVG/Element/marker

๋‚˜๋„ ์ด๊ฒŒ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฑธ ์ด์ œ์„œ์•ผ ๊นจ๋‹ฌ์•˜๋‹ค. ์—ฌ๊ธฐ์— ๋Œ€ํ•œ ์ข‹์€ ๊ฐœ์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. http://tutorials.jenkov.com/svg/marker-element.html

์ด "1์ธ์ด ํ•„์š”๋กœ ํ•˜๋Š” ๋Œ€๋กœ ์—ฌ๊ธฐ์ €๊ธฐ์— ์ž„์˜์˜ ์š”์†Œ์™€ ์†์„ฑ์„ ์ถ”๊ฐ€"ํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์ง€์›ํ•˜๊ฑฐ๋‚˜ ์•„์˜ˆ ์ง€์›ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” http://www.w3.org/TR/2003/REC-SVG11-20030114/attindex.html ์„ _๊ฑฐ์˜_ ๋ชจ๋“  ๊ฒƒ(๋„ค์ž„์ŠคํŽ˜์ด์Šค ์†์„ฑ์€ ์ œ์™ธ)์„ ์Šคํฌ๋žฉํ•˜๊ณ  ๋‹ค์Œ์„ ์ƒ๊ฐํ•ด ๋ƒˆ์Šต๋‹ˆ๋‹ค. https://github.com/zpao/ ๋ฐ˜์‘/๋น„๊ต/fuck-svg.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์ถ•์†Œ๋œ ๋นŒ๋“œ์— ~2kb๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ (ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ์ž˜ ๋ถ€์„œ์ง€์ง€๋งŒ) ์ง€๊ธˆ์€ ๊ทธ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆฌ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ณ„๋„์˜ SVG ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์• ๋“œ์˜จ์œผ๋กœ ๋ณ„๋„๋กœ ๋ฐฐ์†กํ•ฉ๋‹ˆ๋‹ค.

@zpao ๋งž์Šต๋‹ˆ๋‹ค. ์™„์ „ํ•œ SVG ์ง€์›์€ ์• ๋“œ์˜จ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ๊ฐ๊ฐ€์ƒ๊ฐ ๊ฒฝ๊ณ ๋ฅผ ์„ค์ •ํ•˜์—ฌ ์˜ˆ๋ฅผ ๋“ค์–ด React.DOM.circle์ด React.SVG.circle์ด ๋˜๋Š” ๊ฒƒ์„ ์•Œ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

React.SVG.circle์˜ ๊ฒฝ์šฐ +1

@zpao
์™„์ „ํ•œ SVG ์• ๋“œ์˜จ์€ ์ข‹์€ ์ ‘๊ทผ ๋ฐฉ์‹์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๋งŽ์€ ํ”„๋กœ์ ํŠธ์—๋Š” SVG๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ฝ”๋“œ์— ๋ฌด๊ฒŒ๋ฅผ ๋‘์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋Š” ์ง€์›์ด ํ•„์š”ํ•˜๋ฉฐ ์ ˆ๋ฐ˜๋งŒ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์ด์น˜์— ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

+1

2069๋Š” ์ด๋ฏธ์ง€ ์ง€์›์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ์ง€์› +1

์ด๋ฏธ์ง€ ์ง€์›๋„ +1

<use> ์ง€์›์— +1. ์šฐ๋ฆฌ๋Š” sv ์•„์ด์ฝ˜ ์„ธํŠธ์— ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์ž‘๋™์‹œํ‚ค๊ธฐ ์œ„ํ•ด dangerouslySetHTML ๋ฅผ ์‹œ๋„ํ•˜๊ณ  ์žˆ์ง€๋งŒ, ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

strokeDashoffset ๋ˆ„๋ฝ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„์— ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. http://codepen.io/JMChristensen/pen/Ablch

strokeDashoffset ๋Œ€ํ•ด +1

๋˜ํ•œ ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„์— ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

<text> ์ž‘์—…ํ•  ๋•Œ alignment-baseline ๊ฐ€) ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ http://www.w3.org/TR/SVG/Overview.html์„ ํ†ตํ•ด ํŠธ๋กค๋งํ•˜์—ฌ ๋ชจ๋“  ์†์„ฑ๊ณผ ์†์„ฑ์„ ์–ป์„ ์˜์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? (์ด ๋ชฉ์ ์„ ์œ„ํ•ด ๋” ๋‚˜์€ URL์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค...)

๋˜ ๋‹ค๋ฅธ ๋„์›€์€ ์†Œ์Šค ์ฝ”๋“œ์™€ ํ…Œ์ŠคํŠธ์—์„œ ์ด๊ฒƒ์„ ๋ณ€๊ฒฝํ•  ์œ„์น˜๋ฅผ ์•„๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์•ผ ๋ฐ˜์‘ํ•  ์ปค๋ฐ‹์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

FWIW, ๋Œ€๋ถ€๋ถ„์˜ ์†์„ฑ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์Šคํƒ€์ผ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<path style={{strokeDashoffset: 100}} />

@syranide ์ œ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค(์ˆ˜๋™์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์€ ๋ฏธ์นœ ์ง“์ด๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„ ์ž๋™ํ™”๋จ) - https://github.com/zpao/react/compare/fuck-svg. ์ด๋ฏธ ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š์€ ์ด์œ ์— ๋Œ€ํ•œ ์ด์ „ ์˜๊ฒฌ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

@ThomasDeutsch ์ด์ „ SVG ๊ด€๋ จ pull ์š”์ฒญ ๋Œ€๋ถ€๋ถ„์„ ์ฐธ์กฐํ•˜์„ธ์š”. ์ฆ‰, ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ณ„ํš์„ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค(์ด์ „ ์˜๊ฒฌ๋„ ์•ˆ๋‚ดํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค).

+1 for textPath - ํ˜„์žฌ ์ž‘์—… ์ค‘์ธ ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•˜๋ฉฐ ์ง€๊ธˆ์€ ๋ถˆ์พŒํ•œ ์†”๋ฃจ์…˜์„ ํ•ดํ‚นํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. React SVG ํ”Œ๋Ÿฌ๊ทธ์ธ ํŒฉ ๊ตฌํ˜„์— ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

:+1: ์ „์ฒด SVG ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์˜ ๊ฒฝ์šฐ. ์–ธ์ œ ๋ฐฐ์†ก๋  ์ง€์— ๋Œ€ํ•œ ๊ฒฌ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์™ธ๋ž˜ ๊ฐœ์ฒด์— ๋Œ€ํ•ด +1

์™ธ๋ž˜ ๊ฐœ์ฒด์— ๋Œ€ํ•ด +1

svg ์Šคํ”„๋ผ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์†์„ฑ xlink:href .

<use> ์ง€์› +1

ํ˜„์žฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด https://www.npmjs.org/package/react-inlinesvg ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์†์„ฑ: maskUnits ๋ฐ maskContentUnits(# 2056)

๋งˆ์Šคํฌ ์†์„ฑ #2535

patternTransform

ํ…์ŠคํŠธ ์†์„ฑ text-anchor

textPath์˜ ๊ฒฝ์šฐ +1

svg ์•„์ด์ฝ˜ ์ฒ˜๋ฆฌ์˜ ๊ฒฝ์šฐ <use> ์— +1์ž…๋‹ˆ๋‹ค.

SVG ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์˜ ๊ฒฝ์šฐ +1์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์— <clipPath> ๋งŒ ํ•„์š”ํ•˜์ง€๋งŒ ๋ฏธ๋ž˜์— ๋ฌด์—‡์ด ํ•„์š”ํ• ์ง€ ๋ˆ„๊ฐ€ ์•Œ๊ฒ ์Šต๋‹ˆ๊นŒ? ํฌ๊ด„์ ์ธ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์€ ๋งค์šฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๊ธฐ๋Šฅ์˜ ๊ฒฝ์šฐ +1์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” SVG๋ฅผ React์™€ ํ•จ๊ป˜ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ๊ณ„ํš์ด๋ฏ€๋กœ ์šฐ๋ฆฌ์™€ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์™„์ „ํ•œ SVG ์• ๋“œ์˜จ์€ ์ข‹์€ ์ƒ๊ฐ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ textPath ๋ฐ ๋ณด๋‹ค ์™„์ „ํ•œ svg ์ง€์›์— ๋Œ€ํ•ด +1์ž…๋‹ˆ๋‹ค.

SVG๊ฐ€ ์™„์ „ํžˆ ์ง€์›๋  ๋•Œ๊นŒ์ง€ ์ ์ ˆํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ํ•„์š”ํ•œ ์š”์†Œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜๊ณ  ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•ด ํ†ต๊ณผํ•ด์•ผ ํ•˜๋Š” svg ์†์„ฑ์„ React์— ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด <use> ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var DOMProperty = require('react/lib/DOMProperty');

// xlink:href is not a standardly-supported svg attribute, but you can tell
// React that it is ok.
DOMProperty.injection.injectDOMPropertyConfig({
  isCustomAttribute: function (attributeName) {
    return (attributeName === 'xlink:href');
  }
});

var SvgButton = React.createClass({
  render: function render() {
    var use = React.createElement('use', {
      'xlink:href': '#' + this.props.icon
    });
    return (
      <button>
        <svg>
          { use }
        </svg>
        <div>{ this.props.label }</div>
      </button>
    );
 });

@jeffkole ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ฃผ์˜ํ•˜์‹ญ์‹œ์˜ค. ์†์„ฑ์ด ๋ณ€๊ฒฝ๋˜๋ฉด React๋Š” ์—ฌ์ „ํžˆ setAttribute(setAttributeNS๊ฐ€ ์•„๋‹˜)๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์—…๋ฐ์ดํŠธ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@spicyj React์—์„œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ง€์›์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ฆ‰, ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ setAttributeNS ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ด ์—†์Œ). ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ์†์„ฑ์„ ์„ค์ •ํ•˜๋Š” ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋„ค์ž„์ŠคํŽ˜์ด์Šค ์†์„ฑ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ–ˆ๊ณ  ํ˜„์žฌ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

vector-effect ์ด๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ๋™์•ˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ์ • ๋„ˆ๋น„ ์ŠคํŠธ๋กœํฌ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์™ธ๋ž˜ ๊ฐœ์ฒด์— ๋Œ€ํ•ด +1

ํ…์ŠคํŠธ ๊ธฐ์ค€ ์†์„ฑ์— ๋Œ€ํ•œ ๋‚ด PR ์ฐธ์กฐ: #2697

์˜ค ์  ์žฅ use ํƒœ๊ทธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค :์‹ค๋ง:

๋‚˜๋Š”

<svg dangerouslySetInnerHTML={{ __html: '<use xlink:href="#' + this.props.icon + '"/>' }} />

์ถ”์•…ํ•˜์ง€๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

:+1: ์ด๊ฒƒ์— ๋Œ€ํ•ด

์• ๋“œ์˜จ์—์„œ ์™„์ „ํ•œ svg ์ง€์›์„ ์œ„ํ•ด +1

:+1:

@zpao @spicyj ReactDOM ๋ฐ SVGDOMPropertyConfig ์›์ˆญ์ด ํŒจ์น˜ ์—†์ด ์ด๋Ÿฌํ•œ ๊ฐœ๋ณ„ SVG ์š”์†Œ๋ฅผ React์— ์ถ”๊ฐ€ํ•˜๋Š” ์ง€์› ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ๋ฐ foreignObject์— ๋Œ€ํ•ด +1

์™ธ๋ž˜ ๊ฐœ์ฒด์— ๋Œ€ํ•ด +1

animate ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ผ๋ถ€ ์†์„ฑ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://developer.mozilla.org/en-US/docs/Web/SVG/Element/animate

์• ๋“œ์˜จ์—์„œ SVG๋ฅผ ์ง€์›ํ•˜๋Š” ์ƒํƒœ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์˜ค๋Š˜ ๋ฐฉ๊ธˆ ์ด๊ฒƒ์— ๋ถ€๋”ช์ณค์Šต๋‹ˆ๋‹ค :-(

cc @xymostech @MichelleTodd

๋„ค์ž„์ŠคํŽ˜์ด์Šค ์†์„ฑ์˜ ๊ฒฝ์šฐ +1.

์• ๋“œ์˜จ์—์„œ ์™„์ „ํ•œ svg ์ง€์›์„ ์œ„ํ•ด +1

SVG ์†์„ฑ ์ง€์›์„ ์œ„ํ•ด +1000 :-)

์ง€์›์„ ์œ„ํ•ด +1์†์„ฑ

"fill-rule" ์†์„ฑ ์ถ”๊ฐ€ ์š”์ฒญ(์•„๋งˆ๋„ "fillRule")

SVG ์• ๋“œ์˜จ๋„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค :+1:

React ํ•ต์‹ฌํŒ€, ์ด์— ๋Œ€ํ•œ ๋น„ํ•˜์ธ๋“œ ์Šคํ† ๋ฆฌ/ํ† ๋ก ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

ํŠน๋ณ„ํžˆ ์ด๊ฒƒ์— ๋Œ€ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ #3718, #3763์€ ๋ชจ๋‘ SVG ์ž‘์—… ์ค‘์ด๋ฉฐ #3067๋„ ์ด ์†์„ฑ ๋ณ€๊ฒฝ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์™„์ „ํ•œ SVG ์ง€์›์„ ์œ„ํ•ด +1. ๊ทธ๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉ์ž ์ •์˜ ํƒœ๊ทธ์™€ ์†์„ฑ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ์ €๋ฅผ ๋„์™€ ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋งˆ์ปค ์š”์†Œ๋„ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(https://developer.mozilla.org/en/docs/Web/SVG/Element/marker).

@ersagunkuruca ๊ทธ ๋™์•ˆ https://gist.github.com/akre54/80eaa63762ea499029f0 ์‹œ๋„

3945 ๋‹ค์Œ ํƒœ๊ทธ๋Š” ๋งˆ์ปค์šฉ React SVG์—์„œ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค: refx, refy,orient

:+1: ๋งˆ์ปค์šฉ!

SVG์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฒƒ +1.

:+1

animateTransform ์†์„ฑ์— ๋Œ€ํ•œ ์ง€์›์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

<path
    d="M120 60c0-31.13-26.86-60-60-60">
    <animateTransform
          attributeName="transform"
          type="rotate"
          from="0 60 60"
          to="360 60 60"
          dur="1.5s"
          repeatCount="indefinite" />
</path>

ํ˜„์žฌ๋Š” ๋‹ค์Œ์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค.

<path d="M120 60c0-31.13-26.86-60-60-60" data-reactid=".0.0.0.1.6.0.0.$0.0.0.2">
    <animateTransform type="rotate" data-reactid=".0.0.0.1.6.0.0.$0.0.0.2.0"></animateTransform>
</path>

์ด๋ฏธ์ง€์˜ ๊ฒฝ์šฐ +1

+๋ชจ๋“  SVG ์ง€์›

ํ•„ํ„ฐ์— +1

์‚ฌ์šฉ ์ง€์›์— +1!

๋„ค์ž„์ŠคํŽ˜์ด์Šค ์†์„ฑ์˜ ๊ฒฝ์šฐ +1

use ๋ฐ filter ์†์„ฑ ์ง€์›์— ๋Œ€ํ•œ +1

<image> ์ง€์›์— +1. ํด๋ฆฌํ•‘ ๊ฒฝ๋กœ ์•ˆ์— ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๋Š” ์ธ๋ผ์ธ SVG๋ฅผ ๋ Œ๋”๋งํ•˜๋ ค๋ฉด React๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ <svg> ํƒœ๊ทธ์˜ xmlns:xlink="http://www.w3.org/1999/xlink" ์†์„ฑ์— ๊ฑธ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

filter ๋Œ€ํ•ด +1

@zpao ์˜ ์˜๊ฒฌ์„ ๊ณ ๋ คํ•  ๋•Œ ์ด ๋ฌธ์ œ๋ฅผ ์ž ๊ฐ€์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ตœ์†Œํ•œ ํ•ด๋‹น ์ •๋ณด๋กœ OP๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด ์Šค๋ ˆ๋“œ๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ์ง€๋งŒ @zpao ์˜ ์˜๊ฒฌ์€ ๋ฌปํ˜”๊ณ (์ž‘์—…์ด ์ด๋ฏธ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค๊ณผ ํ•จ๊ป˜) ์ „์ฒด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์ง€ ์•Š์€ ์‚ฌ๋žŒ์—๊ฒŒ๋Š” ๋‹ค์†Œ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

@zpao ์˜ ์˜๊ฒฌ์€ ํ˜„์žฌ ๋ฐ˜์‘์— ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€ ์•Š์€ ์ด์œ ์— ๋Œ€ํ•œ ๊ฒฐ์ •์„ ์„ค๋ช…ํ•˜์ง€๋งŒ ์• ๋“œ์˜จ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ด์œ ์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ์„ค๋ช…์ด ์žˆ์Šต๋‹ˆ๊นŒ?
์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํƒ๊ตฌ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ?

๋งˆ์ปค์˜ ๊ฒฝ์šฐ +1: refx, refy, orient

ํ…์ŠคํŠธ ์†์„ฑ์˜ ๊ฒฝ์šฐ +1: ํšŒ์ „, ์ง€๋ฐฐ์  ๊ธฐ์ค€์„ 

http://www.w3.org/TR/SVG/text.html#TextElementRotate์†์„ฑ

+1 ์• ๋“œ์˜จ

+1 ์• ๋“œ์˜จ

์‹ค์ œ๋กœ React๋Š” core 'react'์™€ dom 'react-dom'์œผ๋กœ ๋ถ„๋ฆฌ๋˜๋Š” ๊ณผ์ • ์— ์žˆ๋Š”๋ฐ, ๋“œ๋””์–ด 'react-svg'๊ฐ€ ๋“ค์–ด๊ฐˆ ๊ณณ์ด ์•„๋‹๊นŒ ์‹ถ์Šต๋‹ˆ๋‹ค.

ํ•„ํ„ฐ์˜ ๊ฒฝ์šฐ +1์ž…๋‹ˆ๋‹ค.

vector-effect ์†์„ฑ์„ ์ž…๋ ฅํ•˜์„ธ์š”.

SVG ํƒœ๊ทธ/์†์„ฑ์ด ํ•„์š”ํ•  ๋•Œ ์š”์ฒญํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ React์—์„œ ๋งค์šฐ ์—ด์•…ํ•œ ๋ชจ๋ธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€์—์„œ ์ž‘๋™ํ•˜๋Š” SVG๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด dangerouslySetInnerHTML ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์–ด๋ฆฌ์„์€ ์ผ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค์Œ์€ ๋ˆ„๋ฝ๋œ ํ•ญ๋ชฉ ์ค‘ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

_ํƒœ๊ทธ:_

  • feMorphology
  • feOffset
  • feColorMatrix
  • feMerge
  • feMergeNode

_์†์„ฑ:_

  • filterUnits
  • stdDeviation
  • values
  • in
  • operator

๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ๋‘ ๋ฒ”์ฃผ ๋ชจ๋‘์—์„œ ํ›จ์”ฌ ๋” ๋งŽ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ๋‚ด๊ฐ€ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋Š” ํŠน์ • SVG ์ฝ”๋“œ์˜ ์ผ๋ถ€์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

vector-effect ๋Œ€ํ•ด +1

stdDeviation ๋Œ€ํ•ด +1

๋ณ„๋„์˜ ์™„์ „ํ•œ React.SVG์˜ ๊ฒฝ์šฐ +1์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ง€๊ธˆ๊นŒ์ง€ React์—์„œ SVG๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€๋งŒ ์ง€์›์ด ๋ถˆ์™„์ „ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ์ค€๋ณต์žกํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@spicyj ๋Š” ๊ณ„์† ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ๋ณ„๋„์˜ ๊ตฌ์„ฑ์„ ์ œ๊ฑฐํ•  ๊ณ„ํš์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณง ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋™์•ˆ ๊ฝ‰ ์žก์•„์ฃผ์„ธ์š”.

animateTransform์˜ ๊ฒฝ์šฐ +1

์ง€๋ฐฐ ๊ธฐ์ค€์„ ์˜ ๊ฒฝ์šฐ +1(#3199.)

@zpao๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ๋ชจ๋“  ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด ๋ฌธ์ œ๋ฅผ ๊ณง ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋•Œ๊นŒ์ง€ ์ด ๋ฌธ์ œ๋ฅผ ์ž ๊ธ‰๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ https://github.com/facebook/react/pull/5714 ์—์„œ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค

5714๋Š” #6243์—์„œ ๋˜๋Œ๋ ค์กŒ์œผ๋ฏ€๋กœ ์—ฌ์ „ํžˆ ์†์„ฑ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ข‹์€ ์†Œ์‹์€ #6243์— MDN์— ๋Œ€ํ•ด ์Šคํฌ๋žฉ๋œ ์†์„ฑ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ 95%๋ฅผ ๋‹ค๋ฃฐ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋œ๋‹ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์ด ์ „์ฒด ๋ฌธ์ œ์™€ ์—ฐ๊ฒฐ๋œ ๋ฌธ์ œ ๋ฐ PR์„ ์ฝ๊ณ  #6267์— ๋‘ ๊ฐœ์˜ ๋ˆ„๋ฝ๋œ ์†์„ฑ( focusable ๋ฐ vector-effect )์„ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด v15์— ์ ์šฉ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ _tag_ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋” ์ด์ƒ ๊ด€๋ จ์„ฑ์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ <marker> , <textPath> , <feGaussianBlur> ๋ฐ ์ด ํ˜ธ์™€ ์—ฐ๊ฒฐ๋œ PR์—์„œ ์š”์ฒญ๋œ ๊ธฐํƒ€ ํƒœ๊ทธ๋ฅผ ๋งˆ์Šคํ„ฐ์— ๋ฌธ์ œ ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. fbjs ์—ฌ์ „ํžˆ SVG ํƒœ๊ทธ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žˆ๊ณ  ํƒœ๊ทธ๊ฐ€ ๋ˆ„๋ฝ๋œ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•  ๋งŒํผ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์ž˜ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ @zpao ๋˜๋Š” @spicyj ๊ฐ€ ์ด๋ฅผ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. #6243์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋ˆ„๋ฝ๋œ ํƒœ๊ทธ๋„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๊ฐ€ ์—ฌ์ „ํžˆ ๊ด€๋ จ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ์žˆ์ง€๋งŒ ์‚ฌ์–‘์— ์žˆ๊ณ  ๋ธŒ๋ผ์šฐ์ €์— ์˜ํ•ด ๊ตฌํ˜„๋˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์†์„ฑ์ด ์ง€์›๋˜๋ฏ€๋กœ ์ด์ œ ์š”์ฒญ์ด ํ›จ์”ฌ ์ค„์–ด๋“ค๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ตœ์ข… v15์—์„œ ์—ฌ์ „ํžˆ ์ง€์›๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์—ฌ๊ธฐ์—์„œ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

์ด ์ฐธ๊ณ  ์‚ฌํ•ญ์€ ๋ชจ๋“  SVG ์†์„ฑ์„ ํ†ต๊ณผํ•˜๋Š” v15 RC1์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

xlink:href ์†์„ฑ์— ๋Œ€ํ•ด ์ƒ๋‹นํžˆ ๋งŽ์€ ํ˜ผ๋ž€์ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ง€์› _is_ ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<use xlinkHref="#shape" x="50" y="50" />

React๋Š” 0.14.x์—์„œ๋„ ์ด๋ฅผ xlink:href ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด ๋ฐ”์ด์˜ฌ๋ฆฐ ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ feFuncR , ํŠนํžˆ ์†์„ฑ( slope , intercept ๋“ฑ)๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ํ•„ํ„ฐ ์š”์†Œ๋ฅผ ์ธ์‹ํ•˜๊ธฐ ์œ„ํ•ด React๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. 15.0-rc2์—์„œ๋Š” ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์ง€๋งŒ 0.14.x์˜ ๊ฒฝ์šฐ react / react-dom ๋ฅผ ๋จผ์ € ๊ฐ€์ ธ์˜ค๊ธฐ ์ „์— react/lib/SVGDOMPropertyConfig ๋‚ด๋ณด๋‚ธ ์‚ฌ์ „์— ์ด๋Ÿฌํ•œ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ž์ฒด. ์˜ˆ:

// Needed to set correct xmlns on <svg> and to preserve attributes on feFunc*.
// Required for 0.14.x. May become unnecessary with 15.x

var SVGDOMPropertyConfig = require("react/lib/SVGDOMPropertyConfig");

var DOMProperty = require("react/lib/DOMProperty");
var MUST_USE_ATTRIBUTE = DOMProperty.injection.MUST_USE_ATTRIBUTE;

SVGDOMPropertyConfig.Properties.in = MUST_USE_ATTRIBUTE;
SVGDOMPropertyConfig.Properties.intercept = MUST_USE_ATTRIBUTE;
SVGDOMPropertyConfig.Properties.slope = MUST_USE_ATTRIBUTE;
SVGDOMPropertyConfig.Properties.xmlns = MUST_USE_ATTRIBUTE;

var React = require("react");
var render = require("react-dom").render;

์ด๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ํ•ดํ‚น์ด์ง€๋งŒ dangerouslySetInnerHTML

์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๋Š” ๋™์•ˆ ๊ณต์‹์ ์œผ๋กœ ๋…ธ์ถœ๋œ API๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๋ถ€ ๋˜๋Š” ํŒจ์น˜ ๋ฆด๋ฆฌ์Šค์—์„œ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ž์‹ ์˜ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ๋ˆ„๋ฝ๋œ ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ €ํฌ์™€ ํ˜‘๋ ฅํ•˜์‹ญ์‹œ์˜ค. 15 RC2์— ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋Š” ์†Œ์‹์„ ๋“ค์œผ๋‹ˆ ๊ธฐ์ฉ๋‹ˆ๋‹ค.

๋„ค, ์ ˆ๋Œ€์ ์œผ๋กœ. ๋‚˜๋Š” 15๊ฐ€ RC ์ƒํƒœ์—์„œ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€๋งŒ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

v15.0 ์˜ (๊ฑฐ์˜) ์™„์ „ํ•œ SVG ์ง€์›์— xmlns ๋ฐ xmlnsXlink ์™€ ๊ฐ™์€ ์ผ๋ถ€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์†์„ฑ์€ ๋ Œ๋”๋งํ•  ๋•Œ ์ ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ํ‘œ์‹œํ•  ๋•Œ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ svg .

.svg ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ํ•ด๋‹น ์†์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ReactDOMServer.renderToStaticMarkup(<MyCustomSVG />)

๋”ฐ๋ผ์„œ ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์‹ค๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

... document.createElement ์‚ฌ์šฉ ๋•๋ถ„์— ๋” ์ด์ƒ SVG ํƒœ๊ทธ ๋ชฉ๋ก์„ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ด์ „์— ์ง€์›๋˜์ง€ ์•Š์•˜๋˜ SVG ํƒœ๊ทธ๋Š” React 15์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

document.createElementNS ์•„๋‹™๋‹ˆ๋‹ค.

document.createElementNS๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์€ ๋„ˆ๋ฌด ๋‹จ์ˆœํ•˜์ง€๋งŒ <svg> ํƒœ๊ทธ ์•„๋ž˜์— ์žˆ์„ ๋•Œ createElementNS ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋Š” JSFiddle๊ณผ ํ•จ๊ป˜ ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ ํ•ด์š”!

@gaearon ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ReactDOM ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €์—์„œ svg ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด ๋ฌธ์ œ๋Š” ReactDOMServer ์™€ ๊ด€๋ จ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋ Œ๋”๋ง๋œ SVG ์™€ xmlNS ๋ฐ xmlnsXlink ์†์„ฑ์ด ๋ˆ„๋ฝ๋œ renderToStaticMarkup() ํ†ตํ•ด ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ํ‘œ์‹œ ํ•˜๋Š” ํŽœ ์ž…๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ๋ณ„๋„๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, xmlns ๋ฐ xmlns:Xlink ์ด(๊ฐ€) ์—†์Šต๋‹ˆ๋‹ค. https://github.com/facebook/react/pull/6471 ์— ์ถ”๊ฐ€ ์ž‘์—…์ด ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

์ง€์›๋˜๋Š” ํƒœ๊ทธ ๋ชฉ๋ก์— ์—ฌ์ „ํžˆ <animate> ๋ฐ <animateTransform> ๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ๋กœ ํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@์‹คํŒ

์ด์ œ ๋ชจ๋“  ํƒœ๊ทธ๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ๋ชฉ๋ก ์€ React.DOM.* ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜๋กœ ์ง€์›๋˜๋Š” ํƒœ๊ทธ๋งŒ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

๋‹ค์Œ SVG ์š”์†Œ๋Š” React.DOM.*์—์„œ ์ง€์›

(๊ฐ•์กฐ ๋‚ด)

JSX๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด์— ๋Œ€ํ•ด ์ „ํ˜€ ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. JSX๋Š” React.DOM.* ํŒฉํ† ๋ฆฌ์— ์˜์กดํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— <animate> ๋ฐ <animateTransform> ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

JSX๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ž˜ ์ž‘๋™ํ•˜๋Š” React.createElement('animate', ...) ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ž์ฒด ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: var animate = React.createFactory('animate") .

xmlns ๋Œ€ํ•œ ์ง€์› ์ถ”๊ฐ€๋ฅผ ์œ„ํ•ด +1 .... ๊ทธ ๋™์•ˆ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด(IE9-11์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค) ์ด๊ฒƒ์ด ์ œ๊ฐ€ ์ƒ๊ฐํ•ด๋‚ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

// explicitly build the SVG to be rendered here so we don't lose the NS
const stringifiedSvg = `<svg xmlns="http://www.w3.org/2000/svg" class="svgClass">
                               <use xlink:href="#linkToSymbolId"></use>
                        <svg/>`

return <div dangerouslySetInnerHTML={{__html: stringifiedSvg}}/>
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰