如何使用webpack直接在我的React组件中加载SVG?

ddu*_*upp 10 icons svg loader reactjs webpack

我想NextButton使用webpack 直接在我的组件中渲染一个材质设计图标.这是我的代码的相关部分:

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>
    )
  }
});
Run Code Online (Sandbox Code Playgroud)

但这不符合我的想法.它似乎将svg输出为字符串,而不是元素.

我已经尝试使用raw-loader,img-loader,url-loader,file-loadersvg-loader,但我不能找到正确的方式来做到这一点.

Ale*_*erg 16

由于您的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>
    )
  }
});
Run Code Online (Sandbox Code Playgroud)

您可以通过创建一个webpack加载器来解决这个问题,该加载器会在您需要SVG文件时自动为您执行此操作.

dangerouslySetInnerHTML.loader.js

module.exports = function(content) {
    return (
        'module.exports = require("react").createElement("span", {' +
            'dangerouslySetInnerHTML: {' +
                '__html: ' + JSON.stringify(content) +
            '}' +
        '});'
    );
};
Run Code Online (Sandbox Code Playgroud)

webpack.config.js

loaders: [
  {
    test: /\.svg$/,
    loader: require.resolve('./dangerouslySetInnerHTML.loader'),
    exclude: /node_modules/,
  },
],
Run Code Online (Sandbox Code Playgroud)

之前的代码段将变为:

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>
    )
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 快速说明 - 它应该是 `__html` 而不是 `_html` (2认同)