通常情况下,为了包含大部分需要简单样式的SVG图标,我会这样做:
<svg>
<use xlink:href="/svg/svg-sprite#my-icon" />
</svg>
最近我一直在尝试使用ReactJS,将其作为我的新前端开发堆栈中的一个可能的组件。然而,我注意到在它支持的标签/属性列表中,既没有use
也没有xlink:href
。
在ReactJS中是否可能使用SVG sprites并以这种方式加载它们?
MDN说xlink:href
已经被弃用,应该使用href
属性。你可以直接使用href
属性。下面的示例包括两个版本。
从React 0.14开始,xlink:href
通过React作为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
与xlink:href
属性的信息,并更新示例以包含两者。 感谢 @devuxer
更新3:在撰写本文时,可以在React主SVG属性中找到此处。
更新2:似乎现在所有svg属性都应该可以通过react使用(请参见合并的svg属性PR)。
更新1:您可能想要关注GitHub上的与SVG相关的问题,以获取更多支持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, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'"); }
<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><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></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>
href
。(但是请注意,如果您正在使用 TypeScript,则尚未更新类型定义以反映这一点。) - devuxerdangerouslySetInnerHTML
,你可以使用下面提到的xlinkHref
。 - Tobia如果你遇到了 xlink:href
,那么在 ReactJS 中,你可以通过删除冒号并将添加的文本转为驼峰式来获得等效的内容: xlinkHref
。
你可能最终会在 SVG 中使用其他名称空间标签,比如 xml:space
等。 同样的规则也适用于它们(即 xml:space
变成了 xmlSpace
)。
如Jon Surrell的回答中所述,现在已经支持使用use标签。如果您不使用JSX,可以按照以下方式实现:
React.DOM.svg( { className: 'my-svg' },
React.createElement( 'use', { xlinkHref: '/svg/svg-sprite#my-icon' }, '' )
)
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>
这是 SVG 组件。
const SvgComponent = () => {
return <svg width="0" height="0">
<defs>
<symbol id="test" viewBox="0 0 100 100">
<line x1='0' y1='50' x2='100' y2='50' strokeWidth='8' stroke="#000" />
</symbol>
</defs>
</svg>
}
export default SvgComponent
使用组件
import SvgComponent from './SvgComponent';
export default function App() {
return (
<>
<SvgComponent/>
<svg>
<use xlinkHref="#test"></use>
</svg>
</>
);
}
我在 Gutenberg 块中显示 SVG 时遇到了问题,通过引用 xlink:href
来解决。我们在 React 中使用了 xlinkHref
属性,但编译后,它被渲染为 xlinkhref
而不是 xlink:href
,因此 SVG 没有显示出来。经过多次检查,我发现 xlink:href
已经被弃用了(尽管如果我们在 HTML 中或直接在 Chrome 开发工具中添加它,它仍然有效),应该使用 href
替代。所以将其更改为 href
后,它就可以正常工作了。
"SVG 2 取消了 xlink 命名空间的需要,因此您应该使用 href 而不是 xlink:href。" https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href
这是我使用的代码
SVG 文件
<svg id="svg-source" style="display: none;" aria-hidden="true" xmlns="http://www.w3.org/2000/svg">
<symbol id="svg-arrow-accordion" viewBox="0 0 15 24" fill="none">
<path id="Path_1662" data-name="Path 1662" d="M15.642,14.142h-3V1.5H0v-3H15.642Z" transform="translate(2 2) rotate(45)" fill="currentColor"></path>
</symbol>
</svg>
React文件
<svg xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" width="15" height="24">
<use href="#svg-arrow-accordion"></use>
</svg>
<use xlinkHref="/svg/svg-sprite#my-icon" />
。 - David Gilbertsonxlink:href
已经过时,现在应该只使用href
-- https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href - Matt Greerxlink:href
,因此我们仍然需要使用它。实际的Web应用程序需要使用浏览器功能的共同点,或者实现特定的解决方案/填充。 - Tobia属性“xlink”在类型“SVGImageElement的SVGProps”上不存在
。 - Joe M