2016-05-23 10 views
4

画像をコンポーネントの背景として設定したバナーのようなコンポーネントを作成していますが、動作させることができません。私は別の提案をオンラインで不運に掲載しようとしましたが、現時点で私のミスが反応コード内にあるのか、ファイルを正しくロードしないのかどうかはわかりません。ここでReact&Webpack:画像を背景画像として読み込んで表示する

は、私のファイル構造です:

AppFolder 
- client/ 
-- components/ 
-- data/ 
-- images/ 
----- banners/ 
------- frontPageBanner2.png 
    ------- 
-- styles/ 
-- myApp.js 
-- store.js 
    --------- 
- index.html 
- package.json 
- webpack.config.dev.js 

は、ここに私のWebPACKの構成です:

var path = require('path'); 
var webpack = require('webpack'); 

module.exports = { 
    devtool: 'source-map', 
    entry: [ 
    'webpack-hot-middleware/client', 
    './client/myApp' 
    ], 
    output: { 
path: path.join(__dirname, 'dist'), 
filename: 'bundle.js', 
publicPath: '/static/' 
    }, 
    plugins: [ 
    new webpack.HotModuleReplacementPlugin(), 
    new webpack.NoErrorsPlugin() 
    ], 
    module: { 
    loaders: [ 
    // js 
    { 
     test: /\.js$/, 
     exclude: /node_modules/, 
     loaders: ['babel'], 
     presets: ['es2015', 'react'], 
     include: path.join(__dirname, 'client') 
    }, 
    // CSS 
    { 
     test: /\.scss$/, 
     include: path.join(__dirname, 'client'), 
     loader: 'style-loader!css-loader!sass-loader' 
    }, 

    // PNG 
    { 
     test: /\.(jpg|png)$/, 
     loader: "url-loader?limit=25000", 
     //loader: 'file?name=[path][name].[ext]', 
     include: path.join(__dirname, 'client') 
    }, 

    // FontAwesome 
    { test: /\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/, loader: "url-loader?limit=10000&mimetype=application/font-woff" }, 
    { test: /\.(ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/, 
     exclude: path.join(__dirname, 'client/images'), 
     loader: "file-loader" }, 

    // other SVG 
    { test: /\.svg$/, 
     loader: 'url-loader', 
     query: { mimetype: "image/svg+xml" }, 
     include: path.join(__dirname, 'client/images') 
    }, 

    ] 
    } 
}; 

そして、ここでは、私はアプリでそれを使用している方法は次のとおりです。ここで

export class Banner extends React.Component { 
    render() { 
     console.log(this.props.banners); 
     // = '../images/banners/frontPageBanner.png' 
     const bannerImg = this.props.image.backgroundImage; 

     var bannerStyle = { 
      background: 'url(' + bannerImg + ')', 
      backgroundSize: this.props.image.backgroundSize, 
      backgroundPosition: this.props.image.backgroundPosition, 
     } 

     return (
      <section key={this.props.key} className="container hero" style={bannerStyle}> 
       <div className="textbox"> 
        <h2>{this.props.title}</h2> 
       </div> 
      </section> 
     ) 
    } 
} 

は、HTMLの結果です:

<section class="container hero" style="background: url('../images/banners/frontPageBanner2.png') 100% 100%/contain;"> 
    ... 
</section> 

画像は表示されません。また、画像srcリンクを開くと空白の画面しか表示されません。どうして?そして私はそれをどのように修正できますか?

答えて

10

イメージを必要とする結果であるvarを渡す必要があります。webpackを使用する必要がある場合、相対パスではなく、base64インラインイメージが生成されます。

var DuckImage = require('./Duck.jpg'); 

var bannerStyle = { 
    backgroundImage: 'url(' + DuckImage + ')', 
    backgroundSize: this.props.image.backgroundSize, 
    backgroundPosition: this.props.image.backgroundPosition, 
} 
+0

私は手動でパスを 'require()'に手動で挿入するとうまくいきました。ただし、コンポーネントは動的であり、URLは小道具から読み取られる必要があります。 'require(this.props.image.backgroundImage)'は動作しません... – spik3s

+1

いつでも画像を読み込んで小道具に渡すことができますが、URLが本当に動的でアプリケーションにバンドルされていない場合は、間違いなく絶対パス、例えば 'http://localhost/myapp/public/img/myimage.jpg'を渡す必要があります。そうすれば、requireを使う必要はなくなり、あなたのアプリは小さくなるでしょう。 –

+0

これは私がやったことですが、私は絶対パスを使ってURLを使ってJSONデータと同じサーバーから写真を提供します。助けてくれてありがとう! – spik3s

関連する問題