SVG 使用标签和 ReactJS

标签 svg sprite reactjs

因此,通常要包含大多数需要简单样式的 SVG 图标,我会这样做:

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

现在,我最近一直在使用 ReactJS,评估它作为我的新前端开发堆栈中的可能组件,但是我注意到在其支持的标签/属性列表中,既没有 use 也没有支持xlink:href

是否可以使用 svg sprites 并在 ReactJS 中以这种方式加载它们?

最佳答案

MDN 表示 xlink:href is deprecated支持href。您应该能够直接使用 href 属性。下面的示例包括两个版本。

React 0.14 开始,xlink:href 可通过 React 作为属性 xlinkHref 使用。 release notes 中将其称为“显着增强”之一。为 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:添加了有关 hrefxlink:href 属性的信息,并更新了示例以包含这两者。 Thanks @devuxer

更新 3:在撰写本文时,可以找到 React master SVG 属性 here .

更新 2:看来所有 svg 属性现在都应该可以通过 React 使用(请参阅合并的 svg attribute PR )。

更新 1:您可能需要关注 svg related issue在 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>

关于SVG 使用标签和 ReactJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26815738/

相关文章:

css - 使用 Fontello SVG 作为背景图像

swift - 使用静态方法和属性创建 SKSpriteNode

google-maps - 谷歌地图占据了整个屏幕

javascript - 在 div onclick 之后更新 Redux prop/state

reactjs - 如何在 webpack 配置文件中启用 babel stage-0

javascript - 将文档内 SVG 栅格化为 Canvas

javascript - Leaflet:有效淡入/淡出图层组

java - 如何将多个矩形合并为一个多边形

java - 为什么当我尝试更改我的马里奥克隆游戏 Sprite 时,它会被切断?

swift - 我的 SKTexture 的尺寸对于我的 SKSpriteNode 来说是错误的