Jak odwołać się do lokalnego obrazu w React?

167

Jak mogę załadować obraz z lokalnego katalogu i dołączyć go do reactjs img srctagu?

Mam obraz o nazwie one.jpegw tym samym folderze co mój komponent i próbowałem obu <img src="one.jpeg" />i <img src={"one.jpeg"} />wewnątrz mojej renderfunkcji, ale obraz się nie pojawia. Nie mam również dostępu do webpack configpliku, ponieważ projekt jest tworzony za pomocą oficjalnego narzędzia create-react-appwiersza poleceń.

Aktualizacja: to działa, jeśli najpierw zaimportować obraz z import img from './one.jpeg'i użyć go do środka img src={img}, ale mam tak wiele plików graficznych do importu i dlatego chcę je wykorzystać w formie img src={'image_name.jpeg'}.

Zamek błyskawiczny
źródło
2
Ewentualny duplikat
Reacta
Właściwie mam podobny problem, mój obraz został zaimportowany do pliku index.jsx, mam loadery w webpacku, kompilacja działa dobrze, ponieważ rzeczywiście kopia obrazu została utworzona na moim serwerze / public / js folder o losowej liczbie, a prawidłowa ścieżka do niego znajduje się w pakiecie, ale nie mogę wizualizować obrazu. Dziwne jest również to, że został utworzony na serwerze / public / js, a nie na serwerze / public / img, jak napisałem w index.js
Carmine Tambascia

Odpowiedzi:

305

Przede wszystkim zawiń src {}

Następnie, jeśli używasz Webpack; Zamiast: <img src={"./logo.jpeg"} />

Może być konieczne użycie require:

<img src={require('./logo.jpeg')} />


Inną opcją byłoby najpierw zaimportowanie obrazu jako takiego:

import logo from './logo.jpeg'; // with import

lub ...

const logo = require('./logo.jpeg); // with require

następnie podłącz go ...

<img src={logo} />

Polecam tę opcję, zwłaszcza jeśli ponownie używasz źródła obrazu.

Apswak
źródło
13
Uważaj, aby nie zapomnieć .o początku względnego adresu URL. Powinno być<img src={require('./one.jpeg')} />
Nuhman
1
Czy którakolwiek z tych metod wpływa na wydajność, na przykład na czas ładowania obrazu? Jeśli tak, który z nich jest lepszy pod względem wydajności?
Inaam ur Rehman
1
@ انعامالرحمٰن - Kilka komentarzy na ten temat stackoverflow.com/questions/31354559/ ... ale TL; DR to nie, brak różnicy w wydajności.
Apswak
Tutaj brakuje faktu, że przynajmniej z webpackiem 4, program ładujący do użycia to program ładujący url zamiast jednego lub poprzedniego pliku
Carmine Tambascia
64

Najlepszym sposobem jest najpierw zaimportowanie obrazu, a następnie użycie go.

import React, { Component } from 'react';
import logo from '../logo.svg';
export default class Header extends Component {
  render() {
    return (
      <div className="row">
        <div className="logo">
          <img src={logo} width="100" height="50" />
        </div>
      </div>
    );
  }
} 
Arslan shakoor
źródło
1
Dlaczego to najlepszy sposób?
Jason Leach
8
Jest to najlepszy sposób, jeśli chcesz ponownie użyć tego samego komponentu, możesz go użyć bez odniesienia do ścieżki. To dobra praktyka @JasonLeach
Arslan shakoor
Jason Leach to czystszy sposób
Arslan shakoor
8

Musisz zawinąć ścieżkę źródła obrazu w {}

<img src={'path/to/one.jpeg'} />

Musisz użyć, requirejeśli używaszwebpack

<img src={require('path/to/one.jpeg')} />
Shubham Khatri
źródło
8

W folderze publicznym utwórz folder zasobów i odpowiednio umieść ścieżkę obrazu.

<img className="img-fluid" 
     src={`${process.env.PUBLIC_URL}/assets/images/uc-white.png`} 
     alt="logo"/>
Harshvardhan Singh Baghel
źródło
Dziękuję, okazało się to przydatne w sytuacji, gdy obrazy mogą, ale nie muszą istnieć w folderze, ponieważ są dynamicznie importowane na podstawie pokazanego zasobu.
Sébastien De Varennes
4

najlepszym sposobem na zaimportowanie obrazu jest ...

import React, { Component } from 'react';

// image import
import CartIcon from '../images/CartIcon.png';

 class App extends Component {
  render() {
    return (
     <div>
         //Call image in source like this
          <img src={CartIcon}/>
     </div>
    );
  }
}
Abdul Moiz
źródło
1
Względne importowanie poza src / nie jest obsługiwane. Aby to zrobić, musisz przechowywać swoje obrazy w src /, co nie jest zalecane
toing_toing,
@toing_toing Dlaczego nie zalecamy przechowywania obrazów w źródle? Oficjalna dokumentacja zawiera przykłady takich przypadków: facebook.github.io/create-react-app/docs/…
roob
zwiększa rozmiar pakietu webpacka i czas kompilacji, konieczność ponownej kompilacji za każdym razem, gdy zmieniasz zasób i wydłuża czas ładowania. Wolałbym umieścić go w folderze publicznym i linkować według adresu URL.
toing_toing
4
@toing_toing Mówisz, że wolisz… ”, ale nie mówisz, jak to zrobić.
Thomas Jay Rush
2

Masz na to dwa sposoby.

Pierwszy

Zaimportuj obraz na górze klasy, a następnie odwołaj się do niego w swoim <img/>elemencie w ten sposób

import React, { Component } from 'react';
import myImg from '../path/myImg.svg';

export default class HelloImage extends Component {
  render() {
    return <img src={myImg} width="100" height="50" /> 
  }
} 

druga

Można bezpośrednio określić ścieżkę obrazu z wykorzystaniem require('../pathToImh/img')w <img/>elemencie jak ta

import React, { Component } from 'react'; 

export default class HelloImage extends Component {
  render() {
    return <img src={require(../path/myImg.svg)} width="100" height="50" /> 
  }
}

Hadi Mir
źródło
1

Moja odpowiedź jest w zasadzie bardzo podobna do odpowiedzi Rubzena. Używam obrazu jako wartości obiektu, przy okazji. U mnie działają dwie wersje:

{
"name": "Silver Card",
"logo": require('./golden-card.png'),

lub

const goldenCard = require('./golden-card.png');
{ "name": "Silver Card",
"logo": goldenCard,

Bez opakowań - ale to też inna aplikacja.

Sprawdziłem też rozwiązanie "import" i w kilku przypadkach działa (co nie jest zaskakujące, to jest stosowane we wzorcu App.js w Reakcie), ale nie w przypadku jak mój powyżej.

Kiszuriwalilibori
źródło
1

Znalazłem inny sposób na zaimplementowanie tego (jest to element funkcjonalny):

const Image = ({icon}) => {
   const Img = require(`./path_to_your_file/${icon}.svg`).ReactComponent;
   return <Img />
}

Mam nadzieję, że to pomoże!

Kai Sheng Tung
źródło
0
import image from './img/one.jpg';

class Icons extends React.Component{
    render(){
      return(
        <img className='profile-image' alt='icon' src={image}/>
    );
    }
}
export default Icons;
Emyboy
źródło
0

Użyłem tego sposobu i działa ... Mam nadzieję, że będziesz przydatny.

const logofooter = require('../../project-files/images/logo.png');

 return(
 <div className="blockquote text-center">
            <img src={logofooter} width="100" height="80" />
 <div/>
);
Rubzen
źródło
0
import React from "react";   
import image from './img/one.jpg';

class Image extends React.Component{
  render(){
    return(
      <img className='profile-image' alt='icon' src={image}/>
   );
  }
}

eksportuj domyślny obraz

LOVENEET SINGH
źródło
0

Jak niektórzy wspomnieli w komentarzach, możesz umieścić obrazy w folderze publicznym. Jest to również wyjaśnione w dokumentacji Create-React-App: https://create-react-app.dev/docs/using-the-public-folder/

barwiona wycieraczka
źródło
Właściwie nie potrzeba więcej kodu niż jeden wiersz w dokumentacji<img src={process.env.PUBLIC_URL + '/img/logo.png'} />
dyedwiper