Caminho correto para img em React.js

135

Tenho algum problema com minhas imagens no meu projeto de reação. Na verdade, eu sempre pensei que o caminho relativo no atributo src era construído na arquitetura de arquivos

Aqui minha arquitetura de arquivos:

components
    file1.jsx
    file2.jsx
    file3.jsx
container
img
js 
... 

No entanto, percebi que o caminho é construído no URL. Em um dos meus componentes (por exemplo, em file1.jsx), tenho o seguinte:

localhost/details/2
<img src="../img/myImage.png" /> -> works

localhost/details/2/id
<img src="../img/myImage.png" /> -> doesn't work, images are not displayed

Como é possível resolver este problema? Quero que, em qualquer forma de rotas manipuladas pelo react-router, todas as imagens possam ser exibidas com o mesmo caminho.

onedkr
fonte
1
basta apontar diretamente para a imagem, o uso não faça ../ qualquer que seja
omarjmh
4
Você precisa usar require. Leia esta resposta no SO para obter mais informações.
hoje
Espero que esta resposta ajude você a Reagir imagens locais
mokesh moha

Respostas:

73

Você está usando um URL relativo, que é relativo ao URL atual, não ao sistema de arquivos. Você pode resolver isso usando URLs absolutos

<img src ="http://localhost:3000/details/img/myImage.png" />

Mas isso não é ótimo para quando você implanta no www.my-domain.bike ou em qualquer outro site. Melhor seria usar um URL em relação ao diretório raiz do site

<img src="/details/img/myImage.png" />

prekolna
fonte
1
Obrigado, eu enfatizaria o /que precede details(vs ./details, etc, para outros que podem confundir os dois).
user1322092
1
Mesmo para mim, não está funcionando. Eu estou usando reactjscom cordovae usando ES5como eslint
Jimit Patel
Enquanto isso e a solução de claireablani funcionam, a de claireablani é o que os documentos do create-react-app recomendam. Eles listam uma série de benefícios ao longo de colocar os recursos em público facebook.github.io/create-react-app/docs/...
Athir Nuaimi
@ user1322092 está certo. Lembre-se que é /images/popcorn.pnge não./images/popcorn.png . Trabalhou para mim com todas as rotas e outras coisas.
Nuhman
335

Em create-react-appcaminhos relativos, as imagens parecem não funcionar. Em vez disso, você pode importar uma imagem:

import logo from './logo.png' // relative path to image 

class Nav extends Component { 
    render() { 
        return ( 
            <img src={logo} alt={"logo"}/> 
        )  
    }
}
claireablani
fonte
15
e as imagens dinâmicas, por exemplo, referenciadas em um arquivo json, em create-react-app?
zok
2
@ zok Eu acho que você exportaria a variável do arquivo JSON, importaria a variável para o seu componente. Então você pode referenciá-lo como de costume. por exemplo, exporte const my_src = variable_here, importe {my_src} do meu_arquivo e src = {my_src}.
Claireablani
1
import './styles/style.less'; **import logo from './styles/images/deadline.png';**Estou recebendo erro no módulo de segunda linha não encontrado enquanto a imagem existe e o caminho está correto.
precisa
Esse método também é confirmado pelo surv.js se você quiser dar uma olhada em um dos métodos principais do autor do webpack. Ele também menciona que você pode usar o babel-plugin-transform-react-jsx-img-import para evitar a importação da imagem toda vez que você fizer referência a uma imagem.
21418 Andre Andre
2
Não isso, ele resolve única questão de imagem, mas não resolve o problema de caminho .. resposta Dima Gershman' é a real solução reagir durante caminho de qualquer img arquivo ou outra coisa
Sami
130

Se você usou create-react-app para criar seu projeto, sua pasta pública está acessível. Então você precisa adicionar sua imagepasta dentro da pasta pública.

public / images /

<img src="/images/logo.png" />

Rubel hasan
fonte
Eu estava prestes a fazer uma pergunta, mas ESTA resposta resolveu meu problema !!! Deve ser marcado como resposta. Obrigado!!! 1
Si8
Funcionou para mim. Lembre-se de que você precisa reiniciar o aplicativo se tiver adicionado uma nova imagem ao diretório público.
awasik
É realmente uma maneira rápida de tratar as situações, mas funcionará apenas se você não precisar de URLs relativos. Por exemplo, se você servir seu aplicativo em www.example.com/react-app, a pasta pública será exposta em www.example.com, sem react-app. Isso pode ser problemático, portanto a resposta aceita é a correta. Fontes: adicionando ativos e usando pasta pública
Alexandru Pirvu
44

Com create-react-appexiste uma pasta pública (com index.html ...). Se você colocar seu "myImage.png" lá, digamos, na subpasta img , poderá acessá-los através de:

<img src={window.location.origin + '/img/myImage.png'} />
Dima G
fonte
4
Este deve ser marcado como a resposta correta, porque é uma solução realmente reactjs para todos os tipos de caminhos de todos os arquivos
Sami
Não entendo por que você acha que esta é a resposta correta. Eu apenas tentei essa resposta e a resposta de Claireblani e a de Claire funcionaram enquanto isso não funcionou. Esta resposta só funciona se a imagem estiver na pasta pública. Minhas imagens devem estar na pasta pública? @Sami
Maderas
Sim, o @Maderas é que esta resposta é a mesma que a aceita = = apenas removendo {} e o URL base, você pode usar simplesmente src = '/ caminho relativo da imagem' ou src = 'caminho absoluto da imagem' resposta é que ele acomoda caminho variável para qualquer imagem
Sami
Até agora funciona para mim como um encanto. Nada mais fez! E eu tentei quase tudo. Obrigado!
Maria Campbell
32
  1. Crie uma pasta de imagens dentro de src (/ src / images) e mantenha sua imagem nela. Em seguida, importe esta imagem em seu componente (use seu caminho relativo). Como abaixo-

    import imageSrc from './images/image-name.jpg';

    E então no seu componente.

    <img title="my-img" src={imageSrc} alt="my-img" />

  2. Outra maneira é manter as imagens na pasta pública e importá-las usando o caminho relativo. Para isso, crie uma pasta de imagem em pasta pública e mantenha sua imagem nela. E então no seu componente use-o como abaixo.

    <img title="my-img" src='/images/my-image.jpg' alt="my-img" />

    O método funciona, mas o primeiro é recomendado, porque sua maneira mais limpa e as imagens são manipuladas pelo webpack durante o tempo de compilação.

Mustkeem K
fonte
2
Isso me ajudou :)
Raphael
Isso não vai funcionar, uma barra (/) é necessária no início para indicar o caminho relativo, da seguinte forma: "/images/pitbull-mark.png"
Jeremy Rea
você já tentou o mencionado na resposta? Isso deve funcionar também.
precisa saber é o seguinte
26

no meu caso, o código a seguir também funciona.

<img src={require('../logo.png')} alt="logo" className="brand-logo"/>
Sodhi saab
fonte
1
Isso funcionou para mim. Isso funciona no caso de você NÃO desejar armazenar imagens na pasta pública
Mr_LinDowsMac
13

Algumas respostas antigas não funcionam, outras são boas, mas não explicam o tema, em resumo:

Se a imagem estiver no diretório 'public'

Exemplo: \public\charts\a.png

Em html:

<img id="imglogo" src="/charts/logo.svg" />

Em JavaScript:

Crie uma imagem para o novo img dinamicamente:

var img1 = document.createElement("img");  
img1.src = 'charts/a.png';  

Defina a imagem como img existente com o ID como 'img1', dinamicamente:

document.getElementById('img1').src = 'charts/a.png';

Se a imagem estiver no diretório 'src':

Exemplo: \src\logo.svg

Em JavaScript:

import logo from './logo.svg';  
img1.src = logo;  

Em jsx:

<img src={logo} /> 
Manohar Reddy Poreddy
fonte
3

Incluindo o carregador de arquivos npm no webpack.config.js de acordo com as instruções de uso oficiais, da seguinte maneira:

config.module.rules.push(
    {
        test: /\.(png|jpg|gif)$/,
        use: [
            {
                loader: 'file-loader',
                options: {}
            }
        ]
    }
);

trabalhou para mim.

Treefish Zhang
fonte
3

Importar imagens no seu componente

import RecentProjectImage_3 from '../../asset/image/recent-projects/latest_news_3.jpg'

E chame o nome da imagem na imagem src = {RecentProjectImage_3} como um objeto

 <Img src={RecentProjectImage_3} alt="" />
Md. Rana
fonte
2

Um amigo me mostrou como fazer isso da seguinte maneira:

"./" funciona quando o arquivo que está solicitando a imagem (por exemplo, "example.js") está no mesmo nível na estrutura da árvore de pastas que a pasta "images".

AdamJSim
fonte
1

Coloque o logotipo na sua pasta pública em, por exemplo, public / img / logo.png e, em seguida, consulte a pasta pública como% PUBLIC_URL%:

<img src="%PUBLIC_URL%/img/logo.png"/>

O uso de% PUBLIC_URL% acima será substituído pelo URL da publicpasta durante a compilação. Somente arquivos dentro da publicpasta podem ser referenciados no HTML.

Diferentemente de "/img/logo.png" ou "logo.png", "% PUBLIC_URL% / img / logo.png" funcionará corretamente tanto com o roteamento do lado do cliente quanto com um URL público não raiz. Aprenda a configurar um URL público não raiz executando npm run build.

Sami Start
fonte