SVG 사용 태그 및 ReactJS


114

따라서 일반적으로 간단한 스타일링이 필요한 대부분의 SVG 아이콘을 포함하려면 다음을 수행합니다.

<svg>
    <use xlink:href="/svg/svg-sprite#my-icon" />
</svg>

이제 새로운 프런트 엔드 개발 스택의 가능한 구성 요소로 나중에 ReactJS를 평가하고 있지만 지원되는 태그 / 속성 목록에서 둘 다 지원 되지 use않거나 xlink:href지원 되지 않는다는 것을 알았습니다 .

svg 스프라이트를 사용하고 ReactJS에서 이런 방식으로로드 할 수 있습니까?


28
향후 방문자를 위해 이제 <use xlinkHref="/svg/svg-sprite#my-icon" />.
David Gilbertson

6
xlink:href더 이상 사용되지 않습니다. 이제는 다음을 사용해야합니다. href- developer.mozilla.org
Matt Greer

2
@MattGreer 2018 년 현재 Safari는 여전히 필요 xlink:href하므로 계속 사용해야합니다. 실제 웹 애플리케이션은 브라우저 기능의 공통 분모를 사용하거나 특정 해결 방법 / 폴리 필을 구현해야합니다.
Tobia

이 오류를 검색하는 다른 사용자를 돕기 위해이 설명을 추가하고 있습니다.이 오류는 아래 Jon Surrell의 답변으로 해결되었습니다.Property 'xlink' does not exist on type 'SVGProps<SVGImageElement>
Joe M

답변:


50

2018 년 9 월 업데이트 :이 솔루션은 더 이상 사용되지 않습니다 . 대신 Jon의 답변을 읽으십시오 .

-

React는 모든 SVG 태그를 지원하지 않습니다 . 여기 에 지원되는 태그 목록이 있습니다 . 그들은 더 넓은 지원, f.ex에서 작업 이 티켓 .

일반적인 해결 방법은 지원되지 않는 태그 (f.ex) 대신 HTML을 삽입하는 것입니다.

render: function() {
    var useTag = '<use xlink:href="https://stackoverflow.com/svg/svg-sprite#my-icon" />';
    return <svg dangerouslySetInnerHTML={{__html: useTag }} />;
}

19
아니요, dangerouslySetInnerHTML. xlinkHref아래와 같이 사용할 수 있습니다 .
Tobia

저자는 아마도 이것을 수락 된 답변으로 제거해야합니다
Aquasar

267

MDN은 말한다 xlink:href 되지 않습니다 찬성 href. href속성을 직접 사용할 수 있어야합니다 . 아래 예에는 두 버전이 모두 포함되어 있습니다.

현재 0.14 반응 , xlink:href재산 반작용 통해 가능 xlinkHref. 0.14 릴리스 노트 에서 "주목할만한 개선 사항"중 하나로 언급됩니다 .

<!-- REACT JSX: -->
<svg>
  <use xlinkHref='/svg/svg-sprite#my-icon' />
</svg>

<!-- RENDERS AS: -->
<svg>
  <use xlink:href="/svg/svg-sprite#my-icon"></use>
</svg>

업데이트 2018-06-09 :href vs xlink:href속성 에 대한 정보를 추가 하고 두 가지를 모두 포함하도록 예제를 업데이트했습니다. 감사합니다 @devuxer

업데이트 3 : 작성 시점에서 React 마스터 SVG 속성은 여기 에서 찾을 수 있습니다 .

업데이트 2 : 이제 반응을 통해 모든 svg 속성을 사용할 수 있습니다 (병합 된 svg 속성 PR 참조 ).

업데이트 1 : 추가 SVG 지원 랜딩을 위해 GitHub 의 svg 관련 문제 를 주시하고 싶을 수 있습니다 . 작품의 발전이 있습니다.

데모:

const svgReactElement = (
  <svg
    viewBox="0 0 1340 667"
    width="100"
    height="100"
  >
    <image width="667" height="667" href="https://i.imgur.com/w7GCRPb.png"/>
    { /* Deprecated xlink:href usage */ }
    <image width="667" height="667" x="673" xlinkHref="https://i.imgur.com/w7GCRPb.png"/>
  </svg>
);

var resultHtml = ReactDOMServer.renderToStaticMarkup(svgReactElement);
document.getElementById('render-result-html').innerHTML = escapeHtml(resultHtml);

ReactDOM.render(svgReactElement, document.getElementById('render-result') );

function escapeHtml(unsafe) { return unsafe.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;"); }
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.4.1/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.4.1/umd/react-dom.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.4.1/umd/react-dom-server.browser.development.js"></script>

<h2>Render result of rendering:</h2>
<pre>&lt;svg
  viewBox=&quot;0 0 1340 667&quot;
  width=&quot;100&quot;
  height=&quot;100&quot;
&gt;
  &lt;image width=&quot;667&quot; height=&quot;667&quot; href=&quot;https://i.imgur.com/w7GCRPb.png&quot;/&gt;
  { /* Deprecated xlink:href usage */ }
  &lt;image width=&quot;667&quot; height=&quot;667&quot; x=&quot;673&quot; xlinkHref=&quot;https://i.imgur.com/w7GCRPb.png&quot;/&gt;
&lt;/svg&gt;</pre>

<h2><code>ReactDOMServer.renderToStaticMarkup()</code> output:</h2>
<pre id="render-result-html"></pre>
<h2><code>ReactDOM.render()</code> output:</h2>
<div id="render-result"></div>


2
> 2015 년 12 월 25 일 업데이트 : 이제 반응을 통해 모든 svg 속성을 사용할 수 있습니다 (병합 된 svg 속성 PR 참조). 이러한 svg 속성을 사용하는 표준 방법이 있습니까? xlink : href => xlinkHref의 경우와 같이 모두 낙타 케이스입니까?
majorBummer

살펴 @majorBummer 여기
존 Surrell에게

2
특히 현재 선택한 답변이 dangerouslySetInnerHTML을 권장 할 때 정말 정답이되어야합니다. 이것은 위험합니다
feihcsim

1
MDN ( developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href ) 에 따르면 xlink:href더 이상 사용되지 않으며 href네임 스페이스 접두사없이 사용하는 것이 좋습니다 . (그러나 TypeScript를 사용하는 경우 입력이 아직이를 반영하도록 업데이트되지 않았습니다.)
devuxer

작성 당시 xlink : href는 Safari에서 지원되지만 href는 지원되지 않습니다.
neoncube

7

를 만나면 xlink:href콜론을 제거하고 추가 된 텍스트를 카멜 케이싱하여 ReactJS에서 동등한 것을 얻을 수 있습니다 xlinkHref.

결국 SVG에서, 등과 같은 다른 네임 스페이스 태그를 사용하게 될 것입니다 xml:space. 동일한 규칙이 적용됩니다 (즉, xml:space가됩니다 xmlSpace).


6

Jon Surrell의 답변에서 이미 언급했듯이 사용 태그가 이제 지원됩니다. JSX를 사용하지 않는 경우 다음과 같이 구현할 수 있습니다.

React.DOM.svg( { className: 'my-svg' },
    React.createElement( 'use', { xlinkHref: '/svg/svg-sprite#my-icon' }, '' )
)

0

이 문제를 해결하는 작은 도우미를 만들었습니다 : https://www.npmjs.com/package/react-svg-use

먼저 npm i react-svg-use -S간단히

import Icon from 'react-svg-use'

React.createClass({
  render() {
    return (
      <Icon id='car' color='#D71421' />
    )
  }
})

그러면 다음 마크 업이 생성됩니다.

<svg>
  <use xlink:href="#car" style="fill:#D71421;"></use>
</svg>

0

SVG는 React 코드에서 React 구성 요소로 직접 가져 와서 사용할 수 있습니다.

import React from 'react';
import {ReactComponent as ReactIcon} from './icon.svg';

const App = () => {
  return (
    <div className="App">
      <ReactIcon />
    </div>
  );
}
export default App;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.