Comment référencer une image locale dans React?

167

Comment puis-je charger une image à partir du répertoire local et l'inclure dans la reactjs img srcbalise?

J'ai une image appelée one.jpegdans le même dossier que mon composant et j'ai essayé à la fois <img src="one.jpeg" />et à l' <img src={"one.jpeg"} />intérieur de ma renderfonction, mais l'image ne s'affiche pas. De plus, je n'ai pas accès au webpack configfichier car le projet est créé avec l' create-react-apputilitaire de ligne de commande officiel .

Mise à jour: Cela fonctionne si j'importe d'abord l'image avec import img from './one.jpeg'et l'utilise à l'intérieur img src={img}, mais j'ai tellement de fichiers image à importer et par conséquent, je veux les utiliser sous la forme img src={'image_name.jpeg'},.

Zip *: français
la source
2
Une duplication possible de React ne chargera pas les images locales
Vanuan
J'ai en fait un problème similaire, mon image a été importée dans le fichier index.jsx, j'ai les chargeurs dans webpack, la face de compilation fonctionne bien, car en effet une copie de l'image a été créée dans mon serveur / public / js dossier avec un nombre aléatoire, et le chemin d'accès correct se trouve dans le bundler, mais je ne peux pas visualiser l'image. C'est aussi étrange qu'il ait été produit dans le serveur / public / js et non dans le serveur / public / img comme je l'ai écrit dans index.js
Carmine Tambascia

Réponses:

306

Tout d'abord envelopper le src {}

Ensuite, si vous utilisez Webpack; Au lieu de: <img src={"./logo.jpeg"} />

Vous devrez peut-être utiliser require:

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


Une autre option serait d'importer d'abord l'image en tant que telle:

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

ou ...

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

puis branchez-le ...

<img src={logo} />

Je recommanderais cette option surtout si vous réutilisez la source d'image.

Apswak
la source
13
Veillez à ne pas oublier .le début de l'url relative. Devrait être<img src={require('./one.jpeg')} />
Nuhman
1
L'une de ces méthodes affecte-t-elle les performances telles que le temps de chargement de l'image? Si oui, lequel est le meilleur en termes de performances?
Inaam ur Rehman
1
@ انعامالرحمٰن - Quelques commentaires sur stackoverflow.com/questions/31354559/… mais le TL; DR est non, pas de différence de performances.
Apswak
Il manque ici le fait qu'au moins avec webpack 4, le chargeur à utiliser est url-loader au lieu du fichier un ou le précédent
Carmine Tambascia
64

Le meilleur moyen est d'importer d'abord l'image, puis de l'utiliser.

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
la source
1
Pourquoi est-ce le meilleur moyen?
Jason Leach
8
C'est le meilleur moyen si vous devez réutiliser dans le même composant, vous pouvez l'utiliser sans référence de chemin. C'est une bonne pratique @JasonLeach
Arslan shakoor
Jason Leach c'est plus propre
Arslan shakoor
8

Vous devez envelopper le chemin source de l'image dans {}

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

Vous devez utiliser requiresi vous utilisezwebpack

<img src={require('path/to/one.jpeg')} />
Shubham Khatri
la source
8

Dans le dossier public , créez un dossier d' actifs et placez le chemin de l'image en conséquence.

<img className="img-fluid" 
     src={`${process.env.PUBLIC_URL}/assets/images/uc-white.png`} 
     alt="logo"/>
Harshvardhan Singh Baghel
la source
Merci, cela s'est avéré utile pour moi dans une situation où des images peuvent ou non exister dans le dossier car elles sont importées dynamiquement en fonction de la ressource affichée.
Sébastien De Varennes
4

la meilleure façon d'importer une image est ...

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
la source
1
Les importations relatives en dehors de src / ne sont pas prises en charge. Pour ce faire, vous devrez conserver vos images dans src /, ce qui n'est pas recommandé
toing_toing
@toing_toing Pourquoi ne recommandez-vous pas de conserver les images dans src? La documentation officielle a des exemples où c'est le cas: facebook.github.io/create-react-app/docs/…
roob
augmente la taille du bundle webpack et le temps de compilation, le besoin de recompiler chaque fois que vous modifiez un actif et augmente le temps de chargement. Je préfère le mettre dans le dossier public et le lier par URL.
toing_toing
4
@toing_toing Vous dites que vous «préféreriez…» mais vous ne dites pas comment faire cela.
Thomas Jay Rush
2

Vous pouvez procéder par deux voies.

Première

Importez l'image au-dessus de la classe, puis référencez-la dans votre <img/>élément comme ceci

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" /> 
  }
} 

Seconde

Vous pouvez directement spécifier le chemin d'image à l' aide require('../pathToImh/img')dans l' <img/>élément comme celui - ci

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
la source
1

Ma réponse est fondamentalement très similaire à celle de Rubzen. J'utilise l'image comme valeur d'objet, btw. Deux versions fonctionnent pour moi:

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

ou

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

Sans wrappers - mais c'est aussi une application différente.

J'ai vérifié aussi la solution "import" et dans quelques cas cela fonctionne (ce qui n'est pas surprenant, c'est appliqué dans le pattern App.js dans React), mais pas dans le cas comme le mien ci-dessus.

Kiszuriwalilibori
la source
1

J'ai trouvé un autre moyen de mettre en œuvre cela (il s'agit d'un composant fonctionnel):

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

J'espère que ça aide!

Kai Sheng Tung
la source
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
la source
0

Je l'ai utilisé de cette façon, et cela fonctionne ... J'espère que vous utile.

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

 return(
 <div className="blockquote text-center">
            <img src={logofooter} width="100" height="80" />
 <div/>
);
Rubzen
la source
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}/>
   );
  }
}

exporter l'image par défaut

LOVENEET SINGH
la source
0

Comme certains l'ont mentionné dans les commentaires, vous pouvez placer les images dans le dossier public. Ceci est également expliqué dans la documentation de Create-React-App: https://create-react-app.dev/docs/using-the-public-folder/

essuie-glace teinté
la source
Il n'y a en fait pas plus de code nécessaire que la seule ligne de la documentation<img src={process.env.PUBLIC_URL + '/img/logo.png'} />
dyedwiper