Динамически добавлять изображения 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)} />
Для фактического свойства я пробовал практически все пути, которые я могу представить себе из образа проекта, из корня приложения-приложения и из самого компонента.
Файловая система
|-- src
| ` app.js
| `--images
| ` image.jpg
| ` image.jpg
| `-- components
| `parent_component.js
| `child_component.js
Родительский компонент в основном представляет собой контейнер для хранения кратных дочерних элементов, поэтому...
<ChildComponent img=data.img1 />
<ChildComponent img=data.img2 />
etc....
Есть ли способ сделать это, используя реакцию и webpack с url-loader, или я просто иду по неправильному пути, чтобы приблизиться к этому?
Ответы
Ответ 1
Используя url-загрузчик, описанный здесь (SurviveJS - Загрузка изображений), вы можете использовать его в своем коде:
import LogoImg from 'YOUR_PATH/logo.png';
и
<img src={LogoImg}/>
Редактировать: точность, изображения встроены в JS-архив с помощью этой техники. Это может быть достойно для небольших изображений, но используйте технику с умом.
Ответ 2
Если вы связываете свой код со стороны сервера, то нет ничего, что помешало бы вам требовать активы непосредственно от jsx:
<div>
<h1>Image</h1>
<img src={require('./assets/image.png')} />
</div>
Ответ 3
Итак, вам нужно добавить оператор import на свой родительский компонент:
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>
);
}
}
Ответ 4
ОБНОВЛЕНИЕ: это проверено только при рендеринге на стороне сервера (универсальный Javascript), вот мой пример.
Только с загрузчиком файлов вы можете загружать изображения динамически - хитрость заключается в том, чтобы использовать строки шаблона ES6, чтобы веб-пакет мог его забрать:
Это НЕ сработает. :
const myImg = './cute.jpg'
<img src={require(myImg)} />
Чтобы это исправить, просто используйте строки шаблона:
const myImg = './cute.jpg'
<img src={require('${myImg}')} />
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'
}]
}
}
Ответ 5
Вы не вставляете изображения в комплект. Они вызывают через браузер. Итак, его:
var imgSrc = './image/image1.jpg';
return <img src={imgSrc} />
Ответ 6
Если вы ищете способ импортировать все ваши изображения из изображения
// 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']}/>
Вы можете найти исходную ветку здесь: Динамический импорт изображений из каталога с помощью веб-пакета.
Ответ 7
вот код
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;