Como faço para referenciar uma imagem local no React?

166

Como posso carregar uma imagem do diretório local e incluí-la na reactjs img srctag?

Eu tenho uma imagem chamada one.jpegdentro da mesma pasta do meu componente e tentei ambas <img src="one.jpeg" />e <img src={"one.jpeg"} />dentro da minha renderfunção, mas a imagem não aparece. Além disso, não tenho acesso ao webpack configarquivo, pois o projeto foi criado com o create-react-apputilitário de linha de comando oficial .

Atualização: Isso funciona se eu importar a imagem pela primeira vez import img from './one.jpeg'e usá-la dentro img src={img}, mas tenho muitos arquivos de imagem para importar e, portanto, quero usá-los no formulário img src={'image_name.jpeg'}.

Fecho eclair
fonte
2
Possível duplicado de Reagir não irá carregar as imagens do local
Vanuan
Veja também stackoverflow.com/questions/37644265/…
Vanuan 12/16
Na verdade, tenho um problema semelhante, minha imagem foi importada no arquivo index.jsx, tenho os carregadores no webpack, o rosto de compilação está funcionando bem, pois, de fato, uma cópia da imagem foi criada no meu servidor / público / js pasta com um número aleatório e o caminho correto para ele está no empacotador, mas não consigo visualizar a imagem. Também é estranho que tenha sido produzido no servidor / public / js e não no server / public / img como escrevi no index.js
Carmine Tambascia

Respostas:

302

Primeiro, envolva o src em {}

Então, se estiver usando o Webpack; Ao invés de: <img src={"./logo.jpeg"} />

Você pode precisar usar exigir:

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


Outra opção seria importar primeiro a imagem como tal:

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

ou ...

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

depois conecte-o ...

<img src={logo} />

Eu recomendaria esta opção, especialmente se você estiver reutilizando a fonte da imagem.

Apswak
fonte
13
Tome cuidado para não esquecer .o início do URL relativo. Deve ser<img src={require('./one.jpeg')} />
Nuhman
1
Algum desses métodos afeta o desempenho, como o tempo de carregamento da imagem? Em caso afirmativo, qual é o melhor desempenho?
Inaam ur Rehman
1
@ انعامالرحمٰن - Alguns comentários aqui stackoverflow.com/questions/31354559/… mas o TL; DR não é, não há diferença de desempenho.
Apswak
Aqui está faltando o fato de que, pelo menos com o webpack 4, o carregador a ser usado é o url-loader, em vez do arquivo um ou o anterior
Carmine Tambascia
64

A melhor maneira é importar a imagem primeiro e depois usá-la.

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
fonte
1
Por que é o melhor caminho?
Jason Leach
8
É a melhor maneira, se você precisar reutilizar no mesmo componente, poderá usá-lo sem referência de caminho. É uma boa prática @JasonLeach
Arslan shakoor
Jason Leach é maneira mais limpa
Arslan Shakoor
8

Você precisa agrupar seu caminho de origem da imagem dentro {}

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

Você precisa usar requirese estiver usandowebpack

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

Dentro da pasta pública, crie uma pasta de ativos e coloque o caminho da imagem de acordo.

<img className="img-fluid" 
     src={`${process.env.PUBLIC_URL}/assets/images/uc-white.png`} 
     alt="logo"/>
Harshvardhan Singh Baghel
fonte
Obrigado, isso me foi útil em uma situação em que as imagens podem ou não existir na pasta porque são importadas dinamicamente com base no recurso mostrado.
Sébastien De Varennes
4

a melhor maneira de importar imagens é ...

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
fonte
1
As importações relativas fora de src / não são suportadas. Para fazer isso, você deverá manter suas imagens em src /, o que não é recomendado
toing_toing 03/07/19
@toing_toing Por que você não recomenda manter imagens no src? A documentação oficial tem exemplos onde este é o caso: facebook.github.io/create-react-app/docs/...
Roob
aumenta o tamanho do pacote da Webpack e o tempo de compilação, é necessário recompilar toda vez que você altera um ativo e aumenta o tempo de carregamento. Prefiro colocá-lo na pasta pública e vincular por URL.
2191919
4
@toing_toing Você diz que prefere ... mas não diz como fazer isso.
Thomas Jay Corrida
1

Minha resposta é basicamente muito semelhante à de Rubzen. Eu uso a imagem como o valor do objeto, btw. Duas versões funcionam para mim:

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

ou

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

Sem invólucros - mas essa também é uma aplicação diferente.

Eu verifiquei também a solução "import" e, em alguns casos, funciona (o que não é surpreendente, aplicado no padrão App.js no React), mas não no caso como o meu acima.

Kiszuriwalilibori
fonte
1

Você tem duas maneiras de fazer isso.

Primeiro

Importe a imagem na parte superior da classe e faça referência a ela no seu <img/>elemento como este

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

Segundo

Você pode especificar diretamente o caminho da imagem usando require('../pathToImh/img')no <img/>elemento como este

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
fonte
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
fonte
0

Eu usei dessa maneira, e funciona ... Espero que seja útil.

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

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

exportar imagem padrão

LOVENEET SINGH
fonte
0

Como alguns mencionados nos comentários, você pode colocar as imagens na pasta pública. Isso também é explicado nos documentos do Create-React-App: https://create-react-app.dev/docs/using-the-public-folder/

limpador de parabrisa
fonte
Na verdade, não é necessário mais código do que a única linha na documentação<img src={process.env.PUBLIC_URL + '/img/logo.png'} />
dyedwiper
0

Eu encontrei outra maneira de implementar isso (este é um componente funcional):

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

Espero que ajude!

Kai Sheng Tung
fonte