如何使用 webpack 直接在我的 React 组件中加载 SVG?
How do I load SVGs directly in my React component using webpack?
我想使用 webpack 直接在我的 NextButton
组件中渲染一个 material 设计图标。这是我的代码的相关部分:
var NextIcon = require('material-design-icons/navigation/svg/production/ic_chevron_right_18px.svg');
var NextButton = React.createClass({
render: function() {
return (
<Link to={this.props.target} className='button--next'>
{this.props.label} {NextIcon}
</Link>
)
}
});
但这并不像我想象的那样有效。它似乎将 svg 输出为字符串,而不是元素。
我试过使用 raw-loader
、img-loader
、url-loader
、file-loader
和 svg-loader
,但找不到正确的方法这个。
由于您的 SVG 内容存储为字符串而不是 React 元素,因此您需要使用 Dangerously Set innerHTML.
var NextIcon = require('material-design-icons/navigation/svg/production/ic_chevron_right_18px.svg');
var NextButton = React.createClass({
render: function() {
return (
<Link to={this.props.target} className='button--next'>
{this.props.label} <span dangerouslySetInnerHTML={{ __html: NextIcon }} />
</Link>
)
}
});
您或许可以通过创建一个 webpack 加载器来解决这个问题,该加载器会在您需要 SVG 文件时自动为您执行此操作。
dangerouslySetInnerHTML.loader.js
module.exports = function(content) {
return (
'module.exports = require("react").createElement("span", {' +
'dangerouslySetInnerHTML: {' +
'__html: ' + JSON.stringify(content) +
'}' +
'});'
);
};
webpack.config.js
loaders: [
{
test: /\.svg$/,
loader: require.resolve('./dangerouslySetInnerHTML.loader'),
exclude: /node_modules/,
},
],
之前的代码片段将变为:
var NextIcon = require('material-design-icons/navigation/svg/production/ic_chevron_right_18px.svg');
var NextButton = React.createClass({
render: function() {
return (
<Link to={this.props.target} className='button--next'>
{this.props.label} {NextIcon}
</Link>
)
}
});
我想使用 webpack 直接在我的 NextButton
组件中渲染一个 material 设计图标。这是我的代码的相关部分:
var NextIcon = require('material-design-icons/navigation/svg/production/ic_chevron_right_18px.svg');
var NextButton = React.createClass({
render: function() {
return (
<Link to={this.props.target} className='button--next'>
{this.props.label} {NextIcon}
</Link>
)
}
});
但这并不像我想象的那样有效。它似乎将 svg 输出为字符串,而不是元素。
我试过使用 raw-loader
、img-loader
、url-loader
、file-loader
和 svg-loader
,但找不到正确的方法这个。
由于您的 SVG 内容存储为字符串而不是 React 元素,因此您需要使用 Dangerously Set innerHTML.
var NextIcon = require('material-design-icons/navigation/svg/production/ic_chevron_right_18px.svg');
var NextButton = React.createClass({
render: function() {
return (
<Link to={this.props.target} className='button--next'>
{this.props.label} <span dangerouslySetInnerHTML={{ __html: NextIcon }} />
</Link>
)
}
});
您或许可以通过创建一个 webpack 加载器来解决这个问题,该加载器会在您需要 SVG 文件时自动为您执行此操作。
dangerouslySetInnerHTML.loader.js
module.exports = function(content) {
return (
'module.exports = require("react").createElement("span", {' +
'dangerouslySetInnerHTML: {' +
'__html: ' + JSON.stringify(content) +
'}' +
'});'
);
};
webpack.config.js
loaders: [
{
test: /\.svg$/,
loader: require.resolve('./dangerouslySetInnerHTML.loader'),
exclude: /node_modules/,
},
],
之前的代码片段将变为:
var NextIcon = require('material-design-icons/navigation/svg/production/ic_chevron_right_18px.svg');
var NextButton = React.createClass({
render: function() {
return (
<Link to={this.props.target} className='button--next'>
{this.props.label} {NextIcon}
</Link>
)
}
});