Nice programing

동적으로 이미지 추가 React Webpack

nicepro 2020. 11. 14. 11:04
반응형

동적으로 이미지 추가 React Webpack


React와 Webpack을 통해 이미지를 동적으로 추가하는 방법을 알아 내려고했습니다. src / images 아래에 이미지 폴더가 있고 src / components / index 아래에 구성 요소가 있습니다. webpack에 대해 다음 구성으로 url-loader를 사용하고 있습니다.

    {
      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....

url-loader와 함께 react 및 webpack을 사용하여 이것을 수행하는 방법이 있습니까? 아니면 잘못된 경로로 가고 있습니까?


여기에 설명 된 url-loader ( SurviveJS-Loading Images )를 사용하면 코드에서 사용할 수 있습니다.

import LogoImg from 'YOUR_PATH/logo.png';

<img src={LogoImg}/>

편집 : 정밀도, 이미지는이 기술을 사용하여 js 아카이브에 인라인됩니다. 작은 이미지에 적합 할 수 있지만 기술을 현명하게 사용하십시오.


서버 측에서 코드를 번들링하는 경우 jsx에서 직접 자산을 요구하는 것을 막을 수는 없습니다.

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

따라서 부모 구성 요소에 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>
    );
  }
}

업데이트 : 이것은 서버 측 렌더링 (범용 자바 스크립트)으로 만 테스트되었습니다 . 여기에 내 상용구가 있습니다.

파일 로더 만 있으면 이미지를 동적으로로드 할 수 있습니다 . 트릭은 Webpack이 선택할 수 있도록 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'
    }]
  }
}

번들에 이미지를 포함하지 않습니다. 브라우저를 통해 호출됩니다. 그래서 그것;

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

return <img src={imgSrc} />

이미지에서 모든 이미지를 가져 오는 방법을 찾고 있다면

// 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을 사용하여 디렉토리에서 동적으로 이미지 가져 오기


여기에 코드가 있습니다

    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;

참고 URL : https://stackoverflow.com/questions/32612912/dynamically-add-images-react-webpack

반응형