Thẻ sử dụng SVG và ReactJS


114

Vì vậy, thông thường để bao gồm hầu hết các biểu tượng SVG của tôi yêu cầu tạo kiểu đơn giản, tôi thực hiện:

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

Bây giờ tôi đã chơi với ReactJS vì đánh giá muộn nó là một thành phần có thể có trong ngăn xếp phát triển front-end mới của tôi, tuy nhiên tôi nhận thấy rằng trong danh sách các thẻ / thuộc tính được hỗ trợ của nó, không usehoặc không xlink:hrefđược hỗ trợ.

Có thể sử dụng svg sprites và tải chúng theo cách này trong ReactJS không?


28
Đối với khách truy cập trong tương lai, bây giờ bạn có thể sử dụng <use xlinkHref="/svg/svg-sprite#my-icon" />.
David Gilbertson

6
xlink:hrefkhông được dùng nữa, bây giờ được cho là chỉ sử dụng href- developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href
Matt Greer

2
@MattGreer Tính đến năm 2018, Safari vẫn cần xlink:hrefvì vậy chúng tôi vẫn cần sử dụng nó. Các ứng dụng web thực tế cần phải sử dụng mẫu số chung của các tính năng của trình duyệt hoặc triển khai các giải pháp thay thế / polyfills cụ thể.
Tobia

Tôi chỉ thêm nhận xét này để giúp những người khác tìm kiếm lỗi này, đã được giải quyết bằng câu trả lời của Jon Surrell bên dưới:Property 'xlink' does not exist on type 'SVGProps<SVGImageElement>
Joe M.

Câu trả lời:


50

Cập nhật tháng 9 năm 2018 : giải pháp này không được dùng nữa, thay vào đó hãy đọc câu trả lời của Jon .

-

React không hỗ trợ tất cả các thẻ SVG như bạn nói, có một danh sách các thẻ được hỗ trợ ở đây . Họ đang làm việc để hỗ trợ rộng rãi hơn, f.ex trong vé này .

Một giải pháp phổ biến là chèn HTML thay thế cho các thẻ không được hỗ trợ, f.ex:

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

19
Không, không sử dụng dangerouslySetInnerHTML. Bạn có thể sử dụng xlinkHrefnhư được đề cập bên dưới.
Tobia

Tác giả có lẽ nên xóa điều này vì câu trả lời được chấp nhận
Aquasar

267

MDN nói rằng điều đó xlink:href không được chấp nhận để ủng hộ href. Bạn sẽ có thể sử dụng hrefthuộc tính trực tiếp. Ví dụ dưới đây bao gồm cả hai phiên bản.

Kể từ React 0.14 , xlink:hrefcó sẵn thông qua React dưới dạng thuộc tính xlinkHref. Nó được đề cập như một trong những "cải tiến đáng chú ý" trong các ghi chú phát hành cho 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>

Cập nhật 2018-06-09: Đã thêm thông tin về thuộc tính hrefvs xlink:hrefvà ví dụ cập nhật để bao gồm cả hai. Cảm ơn @devuxer

Cập nhật 3 : Tại thời điểm viết bài, bạn có thể tìm thấy các thuộc tính SVG của React master tại đây .

Cập nhật 2 : Có vẻ như tất cả các thuộc tính svg bây giờ sẽ có sẵn thông qua phản ứng (xem PR thuộc tính svg đã hợp nhất ).

Cập nhật 1 : Bạn có thể muốn theo dõi vấn đề liên quan đến svg trên GitHub để biết thêm về hỗ trợ SVG. Có những phát triển trong các tác phẩm.

Bản giới thiệu:

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
> Cập nhật ngày 25 tháng 12 năm 2015: Có vẻ như tất cả các thuộc tính svg bây giờ sẽ có sẵn thông qua phản ứng (xem PR thuộc tính svg đã hợp nhất). Có cách tiêu chuẩn nào để sử dụng các thuộc tính svg này không? Tất cả chúng sẽ được đóng vỏ lạc đà như trong trường hợp của xlink: href => xlinkHref?
majorBummer

@majorBummer hãy xem ở đây
Jon Surrell

2
điều này thực sự cần phải được câu trả lời đúng, đặc biệt là khi các câu trả lời lựa chọn hiện nay khuyến cáo dangerouslySetInnerHTML, đó là, tốt, nguy hiểm
feihcsim

1
Theo MDN ( developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href ), xlink:hrefđã không được dùng nữa và khuyến nghị là sử dụng hrefmà không có tiền tố vùng tên. (Lưu ý, tuy nhiên, nếu bạn đang sử dụng nguyên cảo, các typings chưa được cập nhật để phản ánh điều này.)
devuxer

Tại thời điểm viết bài, xlink: href được hỗ trợ trong Safari, nhưng href không.
neoncube

7

Nếu bạn gặp phải xlink:href, sau đó bạn có thể nhận được tương đương trong ReactJS bằng cách loại bỏ các thư ruột kết và camelcasing các văn bản bổ sung: xlinkHref.

Cuối cùng có thể bạn sẽ sử dụng các thẻ không gian tên khác trong SVG, chẳng hạn như xml:space, v.v. Quy tắc tương tự cũng áp dụng cho chúng (tức là xml:spacetrở thành xmlSpace).


6

Như đã nói trong câu trả lời của Jon Surrell, thẻ sử dụng hiện được hỗ trợ. Nếu bạn không sử dụng JSX, bạn có thể triển khai nó như sau:

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

0

Tôi đã tạo một trình trợ giúp nhỏ để giải quyết vấn đề này: https://www.npmjs.com/package/react-svg-use

đầu tiên npm i react-svg-use -Ssau đó đơn giản

import Icon from 'react-svg-use'

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

và điều này sau đó sẽ tạo ra đánh dấu sau

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

0

SVG có thể được nhập và sử dụng trực tiếp như một thành phần React trong mã React của bạn.

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

const App = () => {
  return (
    <div className="App">
      <ReactIcon />
    </div>
  );
}
export default App;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.