2015-06-15 13 views
10

Chciałbym renderować ikonę projektowania materiałów bezpośrednio w moim komponencie NextButton przy użyciu pakietu internetowego. Oto odpowiednia część mojego kodu:Jak załadować pliki SVG bezpośrednio w moim komponencie React za pomocą pakietu internetowego?

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> 
    ) 
    } 
}); 

Ale to nie działa tak jak myślałem. Wydaje się, że wypisuje svg jako ciąg, a nie element.

Próbowałem za pomocą raw-loader, img-loader, url-loader, file-loader i svg-loader ale nie mogę znaleźć właściwą drogę, aby to zrobić.

Odpowiedz

16

Ponieważ treść SVG jest zapisana jako ciąg, a nie jako element React, należy użyć 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> 
    ) 
    } 
}); 

Być może można sobie z tym poradzić, tworząc ładowarkę sieciową, która automatycznie zrobi to za każdym razem, gdy będzie potrzebny plik 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/, 
    }, 
], 

Kod poprzedni fragment by następnie stać:

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> 
    ) 
    } 
}); 
+0

To pomogło , dzięki! – dduupp

+1

Szybka uwaga - powinno to być "__html", a nie "_html" – Chris

+0

Dzięki, naprawiłem to. –

Powiązane problemy