Динамическое Добавление Изображений React Webpack



Я пытался выяснить, как динамически добавлять изображения с помощью React и Webpack. У меня есть папка с изображением под src / images и компонент под src / components / index. Я использую url-loader со следующей конфигурацией для webpack



    {
test: /.(png|jpg|)$/,
loader: 'url-loader?limit=200000'
}


в компоненте я знаю, что могу добавить require(image_path) для конкретного изображения в верхней части файла, прежде чем я создам компонент, но я хочу сделать компонент универсальным и иметь его возьмите свойство с путем к изображению, которое передается из родительского компонента.



то, что я пробовал:



<img src={require(this.props.img)} />


для фактического свойства я пробовал почти каждый путь, который я могу придумать для изображения из корня проекта, из корня приложения react и из самого компонента.



файловой системы



|-- src
| ` app.js
| `--images
| ` image.jpg
| ` image.jpg
| `-- components
| `parent_component.js
| `child_component.js


родительский компонент в основном просто контейнер для хранения кратных дочернего так...



<ChildComponent img=data.img1 />
<ChildComponent img=data.img2 />
etc....


Is есть ли способ сделать это с помощью react и webpack с url-loader или я просто иду по неправильному пути, чтобы подойти к этому?

1059   7  

7 ответов:

используя url-загрузчик, описанный здесь https://christianalfoni.github.io/react-webpack-cookbook/Inlining-images.html, Затем вы можете использовать в своем коде:

import LogoImg from 'YOUR_PATH/logo.png';

и

<img src={LogoImg}/>

Если вы связываете свой код на стороне сервера, то ничто не мешает вам требовать активы непосредственно из jsx:

<div>
  <h1>Image</h1>
  <img src={require('./assets/image.png')} />
</div>

поэтому вам нужно добавить оператор импорта в родительский компонент:

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

и в дочернем классе:

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

вы не вставляете изображения в пакет. Они вызываются через браузер. Так его;

var imgSrc = './image/image1.jpg';

return <img src={imgSrc} />

обновление: это только проверено с рендерингом на стороне сервера (универсальный Javascript ) вот мой шаблон.

С помощью только file-loader вы можете загружать изображения динамически -хитрость заключается в использовании строк шаблона ES6 так что Webpack может забрать его:

Это не работа. :

const myImg = './cute.jpg'
<img src={require(myImg)} />

чтобы исправить это, просто используйте строки шаблона вместо :

const myImg = './cute.jpg'
<img src={require(`${myImg}`)} />

webpack.конфиг.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'
    }]
  }
}

здесь код

    import React, { Component } from 'react';
    import logo from './logo.svg';
    import './image.css';
    import Dropdown from 'react-dropdown';
    import axios from 'axios';

    let obj = {};

    class App extends Component {
      constructor(){
        super();
        this.state = {
          selectedFiles: []
        }
        this.fileUploadHandler = this.fileUploadHandler.bind(this);
      }

      fileUploadHandler(file){
        let selectedFiles_ = this.state.selectedFiles;
        selectedFiles_.push(file);
        this.setState({selectedFiles: selectedFiles_});
      }

      render() {
        let Images = this.state.selectedFiles.map(image => {
          <div className = "image_parent">

              <img src={require(image.src)}
              />
          </div>
        });

        return (
            <div className="image-upload images_main">

            <input type="file" onClick={this.fileUploadHandler}/>
            {Images}

            </div>
        );
      }
    }

    export default App;

Если вы ищете способ импортировать все ваши изображения из изображения

// 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)$/));

затем:

<img src={images['image-01.jpg']}/>

вы можете найти исходный поток здесь:динамический импорт изображений из каталога с помощью webpack

Comments

    Ничего не найдено.