我想NextButton使用webpack 在我的组件中直接渲染材质设计图标。这是我的代码的相关部分:
NextButton
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,但我不能找到正确的方式来做到这一点。
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文件时自动为您执行此操作。
危险地SetInnerHTML.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/, }, ],
先前的代码段将变为: