动态添加图像React Webpack

pan*_*orz 69 urlloader image-loading reactjs webpack

我一直在试图弄清楚如何通过React和Webpack动态添加图像.我在src/images下有一个图像文件夹, 在src/components/index下有一个组件.我正在使用url-loader和webpack的以下配置

    {
      test: /\.(png|jpg|)$/,
      loader: 'url-loader?limit=200000'
    }
Run Code Online (Sandbox Code Playgroud)

在我知道的组件中,我可以在创建组件之前为文件顶部的特定图像添加require(image_path),但是我想让组件成为通用的,并让它获取一个属性,其中包含从中传递的图像的路径父组件.

我试过的是:

<img src={require(this.props.img)} />
Run Code Online (Sandbox Code Playgroud)

对于实际属性,我已经尝试了几乎所有我能想到的项目根目录,反应应用程序根目录和组件本身的路径.

文件系统

|-- src
|   ` app.js
|   `--images
|      ` image.jpg
|      ` image.jpg
|   `-- components
|      `parent_component.js
|      `child_component.js
Run Code Online (Sandbox Code Playgroud)

父组件基本上只是一个容纳孩子倍数的容器,所以......

<ChildComponent img=data.img1 />
<ChildComponent img=data.img2 />
etc....
Run Code Online (Sandbox Code Playgroud)

是否有任何方法可以使用react和webpack与url-loader进行此操作,或者我只是走错路来接近这个?

mlo*_*ber 90

使用url-loader,在这里描述https://christianalfoni.github.io/react-webpack-cookbook/Inlining-images.html,然后你可以在你的代码中使用:

import LogoImg from 'YOUR_PATH/logo.png';
Run Code Online (Sandbox Code Playgroud)

<img src={LogoImg}/>
Run Code Online (Sandbox Code Playgroud)

  • 我不确定如果你想要用户浏览器从API加载图像,它与webpack无关.只需使用一个变量(可能在调用API之后定义)作为<img> src.这里的想法是将图像包含在您的源和webpack存档中.(见http://stackoverflow.com/questions/32612912/dynamically-add-images-react-webpack/35454832?noredirect=1#comment56021739_32613874) (2认同)

Jam*_*wuh 18

如果您在服务器端捆绑代码,那么没有什么能阻止您直接从jsx请求资产:

<div>
  <h1>Image</h1>
  <img src={require('./assets/image.png')} />
</div>
Run Code Online (Sandbox Code Playgroud)

  • 如果这不起作用,请在 require() 之后添加 .default。例如:我正在使用 `const src = require(`assets/images/${name}`).default;` (11认同)
  • 这是我需要使用的情况,在构建组件之前我不知道图像文件.我传入`imageFilename`道具,然后使用`<img rel="nofollow noreferrer" src = {require(\`./images/$ {imageFilename} \`)} />`.谢谢发帖. (2认同)

小智 10

如果您正在寻找一种从图像导入所有图像的方法

// Import all images in image folder
function importAll(r) {
    let images = {};
    r.keys().map((item, index) => { images[item.replace('./', '')] = r(item); });
    return images;
}

const images = importAll(require.context('../images', false, /\.(gif|jpe?g|svg)$/));
Run Code Online (Sandbox Code Playgroud)

然后:

<img src={images['image-01.jpg']}/>
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到原始线程:使用 webpack 从目录中动态导入图像


Mar*_*lsi 7

更新:这只测试了服务器端渲染(通用Javascript)这里是我的样板.

只有文件加载器,您可以动态加载图像 - 技巧是使用ES6模板字符串,以便Webpack可以选择它:

这将工作.:

const myImg = './cute.jpg'
<img src={require(myImg)} />
Run Code Online (Sandbox Code Playgroud)

要解决此问题,只需使用模板字符串:

const myImg = './cute.jpg'
<img src={require(`${myImg}`)} />
Run Code Online (Sandbox Code Playgroud)

webpack.config.js:

var HtmlWebpackPlugin =  require('html-webpack-plugin')
var ExtractTextWebpackPlugin = require('extract-text-webpack-plugin')

module.exports = {
  entry : './src/app.js',
  output : {
    path : './dist',
    filename : 'app.bundle.js'
  },
  plugins : [
  new ExtractTextWebpackPlugin('app.bundle.css')],
  module : {
    rules : [{
      test : /\.css$/,
      use : ExtractTextWebpackPlugin.extract({
        fallback : 'style-loader',
        use: 'css-loader'
      })
    },{
      test: /\.js$/,
      exclude: /(node_modules)/,
      loader: 'babel-loader',
      query: {
        presets: ['react','es2015']
      }
    },{
      test : /\.jpg$/,
      exclude: /(node_modules)/,
      loader : 'file-loader'
    }]
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,缺少的是webpack配置中的测试。谢谢。 (2认同)

小智 6

因此,您必须在父组件上添加import语句:

class ParentClass extends Component {
  render() {
    const img = require('../images/img.png');
    return (
      <div>
        <ChildClass
          img={img}
        />
      </div>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

在儿童班:

class ChildClass extends Component {
  render() {
    return (
      <div>
          <img
            src={this.props.img}
          />
      </div>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)