SVG menggunakan tag dan ReactJS


114

Jadi biasanya untuk menyertakan sebagian besar ikon SVG saya yang memerlukan gaya sederhana, saya melakukan:

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

Sekarang saya telah bermain dengan ReactJS akhir-akhir ini mengevaluasinya sebagai komponen yang mungkin dalam tumpukan pengembangan front-end baru saya, namun saya perhatikan bahwa dalam daftar tag / atribut yang didukung , tidak ada useatau xlink:hreftidak didukung.

Apakah mungkin untuk menggunakan sprite svg dan memuatnya dengan cara ini di ReactJS?


28
Untuk pengunjung selanjutnya, sekarang Anda dapat menggunakan <use xlinkHref="/svg/svg-sprite#my-icon" />.
David Gilbertson

6
xlink:hreftidak digunakan lagi, sekarang seharusnya hanya digunakan href- developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href
Matt Greer

2
@MattGreer Pada 2018, Safari masih membutuhkan xlink:hrefjadi kami masih perlu menggunakannya. Aplikasi web yang sebenarnya perlu menggunakan penyebut umum fitur browser, atau menerapkan solusi / polyfill tertentu.
Tobia

Saya hanya menambahkan komentar ini untuk membantu orang lain yang mencari kesalahan ini, yang diselesaikan oleh jawaban Jon Surrell di bawah ini:Property 'xlink' does not exist on type 'SVGProps<SVGImageElement>
Joe M

Jawaban:


50

Perbarui september 2018 : solusi ini tidak digunakan lagi, baca jawaban Jon sebagai gantinya.

-

React tidak mendukung semua tag SVG seperti yang Anda katakan, ada daftar tag yang didukung di sini . Mereka sedang mengerjakan dukungan yang lebih luas, f.ex dalam tiket ini .

Solusi umum adalah menyuntikkan HTML sebagai gantinya untuk tag yang tidak didukung, f.ex:

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

19
Tidak, jangan gunakan dangerouslySetInnerHTML. Anda dapat menggunakan xlinkHrefseperti yang disebutkan di bawah ini.
Tobia

Penulis mungkin harus menghapus ini sebagai jawaban yang diterima
Aquasar

267

MDN mengatakan bahwa xlink:href sudah ditinggalkan mendukung href. Anda harus dapat menggunakan hrefatribut secara langsung. Contoh di bawah ini mencakup kedua versi.

Mulai React 0.14 , xlink:hreftersedia melalui React sebagai properti xlinkHref. Ini disebutkan sebagai salah satu "perangkat tambahan penting" dalam catatan rilis untuk 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>

Perbarui 2018-06-09: Menambahkan info tentang atribut hrefvs xlink:hrefdan contoh yang diperbarui untuk menyertakan keduanya. Terima kasih @devuxer

Pembaruan 3 : Pada saat penulisan, properti SVG master React dapat ditemukan di sini .

Pembaruan 2 : Tampaknya semua atribut svg sekarang harus tersedia melalui react (lihat atribut svg gabungan PR ).

Pembaruan 1 : Anda mungkin ingin mengawasi masalah terkait svg di GitHub untuk pendaratan dukungan SVG tambahan. Ada perkembangan dalam pengerjaan.

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
> Perbarui 25 Des 2015: Tampaknya semua atribut svg sekarang harus tersedia melalui react (lihat gabungan atribut svg PR). Apakah ada cara standar untuk menggunakan atribut svg ini? Akankah mereka semua menjadi unta seperti dalam kasus xlink: href => xlinkHref?
MajorBummer

@majorBummer lihat di sini
Jon Surrell

2
ini benar-benar harus menjadi jawaban yang benar, terutama ketika jawaban yang dipilih saat ini merekomendasikan berbahaya
SetInnerHTML

1
Menurut MDN ( developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href ), xlink:hrefsudah tidak digunakan lagi, dan rekomendasinya adalah untuk digunakan hreftanpa awalan namespace. (Namun, perhatikan, jika Anda menggunakan TypeScript, pengetikan belum diperbarui untuk mencerminkan hal ini.)
devuxer

Pada saat penulisan, xlink: href didukung di Safari, tetapi href tidak didukung.
neoncube

7

Jika Anda menemukan xlink:href, maka Anda bisa mendapatkan setara dalam ReactJS dengan menghapus usus besar dan camelcasing teks menambahkan: xlinkHref.

Pada akhirnya Anda mungkin akan menggunakan tag namespace lain di SVG, seperti xml:space, dll. Aturan yang sama berlaku untuk mereka (yaitu, xml:spacemenjadi xmlSpace).


6

Seperti yang sudah dikatakan dalam jawaban Jon Surrell, tag penggunaan didukung sekarang. Jika Anda tidak menggunakan JSX, Anda dapat menerapkannya seperti ini:

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

0

Saya membuat bantuan kecil yang mengatasi masalah ini: https://www.npmjs.com/package/react-svg-use

pertama npm i react-svg-use -Slalu sederhana

import Icon from 'react-svg-use'

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

dan ini akan menghasilkan markup berikut

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

0

SVG dapat diimpor dan digunakan langsung sebagai komponen React dalam kode React Anda.

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

const App = () => {
  return (
    <div className="App">
      <ReactIcon />
    </div>
  );
}
export default App;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.