SVG kullanım etiketi ve ReactJS


114

Normalde basit stil gerektiren SVG simgelerimin çoğunu dahil etmek için şunları yaparım:

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

Şimdi ReactJS ile oynama olmuştur ı desteklenen etiketler / niteliklerin kendi listesinde fark ne Ancak geç benim yeni ön uç geliştirme yığınında olası bir bileşeni olarak değerlendirilmesinin yanı useveya xlink:hrefdesteklenmektedir.

Svg sprite kullanmak ve ReactJS'de bu şekilde yüklemek mümkün mü?


28
Gelecekteki ziyaretçiler için artık kullanabilirsiniz <use xlinkHref="/svg/svg-sprite#my-icon" />.
David Gilbertson

6
xlink:hrefkullanımdan kaldırıldı, artık sadece href- developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href
Matt Greer

2
@MattGreer 2018 itibariyle, Safari'nin xlink:hrefhala ihtiyacı olduğu için onu kullanmaya devam etmemiz gerekiyor. Gerçek web uygulamalarının ya tarayıcı özelliklerinin ortak paydasını kullanması ya da belirli geçici çözümleri / çoklu dolgular uygulaması gerekir.
Tobia

Bu yorumu, bu hatayı arayan diğerlerine yardımcı olmak için ekliyorum, bu, Jon Surrell'in aşağıdaki cevabı ile çözüldü:Property 'xlink' does not exist on type 'SVGProps<SVGImageElement>
Joe M

Yanıtlar:


50

Eylül 2018 güncellemesi : Bu çözüm kullanımdan kaldırıldı, onun yerine Jon'un cevabını okuyun .

-

React, söylediğiniz gibi tüm SVG etiketlerini desteklemez, burada desteklenen etiketlerin bir listesi vardır . Bu bilette daha geniş destek f.ex üzerinde çalışıyorlar .

Yaygın bir çözüm, desteklenmeyen etiketler yerine HTML enjekte etmektir, f.ex:

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

19
Hayır, kullanma dangerouslySetInnerHTML. xlinkHrefAşağıda belirtildiği gibi kullanabilirsiniz .
Tobia

Yazar muhtemelen bunu kabul edilen cevap olarak kaldırmalı
Aquasar

267

MDN, bunun lehine xlink:href kullanımdan kaldırıldığını söylüyor href. hrefÖzniteliği doğrudan kullanabilmelisiniz . Aşağıdaki örnek her iki sürümü de içerir.

React 0.14 itibariyle ,xlink:href özellik olarak tepki ile kullanılabilir xlinkHref. 0.14 sürüm notlarında "dikkate değer geliştirmelerden" biri olarak bahsedilmektedir .

<!-- 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 Güncellemesi:href vs xlink:hreföznitelikleri hakkında bilgi eklendi ve her ikisini de içerecek şekilde örnek güncellendi. Teşekkürler @devuxer

Güncelleme 3 : Yazım sırasında React ana SVG özellikleri burada bulunabilir .

Güncelleme 2 : Görünüşe göre tüm svg öznitelikleri artık react aracılığıyla kullanılabilir (bkz. Birleştirilmiş svg özniteliği PR ).

Güncelleme 1 : İlave SVG desteği inişi için GitHub'da svg ile ilgili soruna göz atmak isteyebilirsiniz . Eserlerde gelişmeler var.

Demo:

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
> 25 Aralık 2015 Güncellemesi: Görünüşe göre tüm svg öznitelikleri artık react üzerinden kullanılabilir olmalıdır (bkz. Birleştirilmiş svg özniteliği PR). Bu svg özelliklerini kullanmanın standart bir yolu var mı? Xlink: href => xlinkHref durumunda olduğu gibi hepsi deve kasalı mı olacak?
majorBummer

@majorBummer buraya
Jon Surrell

2
bunun gerçekten doğru cevap olması gerekiyor, özellikle de şu anki seçilen cevap dangerouslySetInnerHTML'yi önerdiğinde, ki bu çok tehlikeli
feihcsim

1
MDN'ye göre ( developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href ) xlink:hrefkullanımdan kaldırılmıştır ve öneri hrefad alanı öneki olmadan kullanılmasıdır . (Ancak, TypeScript kullanıyorsanız, yazımların bunu yansıtacak şekilde henüz güncellenmediğini unutmayın.)
devuxer

Yazma sırasında xlink: href Safari'de destekleniyor, ancak href desteklenmiyor.
neoncube

7

Eğer karşılaşırsanız xlink:href, iki noktayı kaldırarak ve eklenen metni deve harflerle çevirerek ReactJS'de eşdeğerini elde edebilirsiniz:xlinkHref .

Muhtemelen sonunda SVG'de xml:space, vb. Diğer ad alanı etiketlerini kullanacaksınız. Aynı kural onlar için de geçerlidir (yani, xml:spaceolur xmlSpace).


6

Jon Surrell'in cevabında daha önce de belirtildiği gibi, kullanım etiketleri artık destekleniyor. JSX kullanmıyorsanız, şu şekilde uygulayabilirsiniz:

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

0

Bu sorunu çözen küçük bir yardımcı oluşturdum: https://www.npmjs.com/package/react-svg-use

önce npm i react-svg-use -Ssonra basitçe

import Icon from 'react-svg-use'

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

ve bu daha sonra aşağıdaki işaretlemeyi oluşturacaktır

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

0

SVG'ler içe aktarılabilir ve doğrudan React kodunuzda bir React bileşeni olarak kullanılabilir.

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

const App = () => {
  return (
    <div className="App">
      <ReactIcon />
    </div>
  );
}
export default App;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.