Percorso corretto per img su React.js


135

Ho qualche problema con le mie immagini sul mio progetto di reazione. In effetti ho sempre pensato che il percorso relativo nell'attributo src fosse costruito sull'architettura dei file

Ecco la mia architettura di file:

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

Tuttavia mi sono reso conto che il percorso è costruito sull'URL. In uno dei miei componenti (ad esempio in file1.jsx) ho questo:

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

Come è possibile risolvere questo problema? Voglio che in qualsiasi forma di percorsi gestiti da reazioni-router, tutte le immagini possano essere visualizzate con lo stesso percorso.


1
basta puntare direttamente sull'immagine, non usare ../ qualunque cosa
omarjmh

4
È necessario utilizzare require. Leggi questa risposta su SO per maggiori informazioni.
oggi

Spero che questa risposta ti aiuti a
reagire

Risposte:


73

Stai utilizzando un URL relativo, che è relativo all'URL corrente, non al file system. È possibile risolvere questo problema utilizzando URL assoluti

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

Ma non è eccezionale quando si esegue la distribuzione su www.my-domain.bike o su qualsiasi altro sito. Meglio sarebbe usare un url relativo alla directory principale del sito

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


1
Grazie, vorrei sottolineare /quanto precede details(vs ./details, ecc., Per gli altri che possono confondere i due).
user1322092

1
Anche per me non funziona. Sto usando reactjscon cordovaed usando ES5come eslint
Jimit Patel

Mentre sia questa che la soluzione di claireablani funzionano, quella di claireablani è ciò che raccomandano i documenti di create-reagire-app. Elencano una serie di vantaggi oltre a rendere pubbliche le risorse facebook.github.io/create-react-app/docs/…
Athir Nuaimi

@ user1322092 ha ragione. Ricorda che lo è /images/popcorn.pnge non ./images/popcorn.png. Ha funzionato per me con tutti i percorsi e le cose.
Nuhman,

335

In create-react-apppercorsi relativi per le immagini non sembrano funzionare. Invece, puoi importare un'immagine:

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

class Nav extends Component { 
    render() { 
        return ( 
            <img src={logo} alt={"logo"}/> 
        )  
    }
}

15
che dire delle immagini dinamiche, ad esempio, a cui fa riferimento un file json, in create -eagire-app?
zok,

2
@zok Penso che dovresti esportare la variabile dal file JSON, importare la variabile nel tuo componente. Quindi puoi fare riferimento come al solito. es. export const my_src = variabile_qui, importazione {my_src} da my_file e src = {my_src}.
Claireablani,

1
import './styles/style.less'; **import logo from './styles/images/deadline.png';**Ricevo un errore sul modulo di seconda linea non trovato mentre l'immagine esiste e il percorso è corretto.
Hitendra,

Questo metodo è confermato anche da survive.js se si desidera dare un'occhiata a uno dei metodi principali dell'autore del webpack. Cita anche che puoi usare babel-plugin-transform-reagire-jsx-img-import per aggirare dover importare l'immagine ogni volta che fai riferimento a un'immagine.
Andre

2
Non questo, risolve solo il problema dell'immagine ma non risolve il problema del percorso. La risposta di Dima Gershman è la soluzione di reazione effettiva per il percorso di qualsiasi file img oppure
Sami

130

Se hai utilizzato create -eagire-app per creare il tuo progetto, la tua cartella pubblica è accessibile. Quindi è necessario aggiungere la imagecartella all'interno della cartella pubblica.

pubblico / images /

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


Stavo per fare una domanda, ma QUESTA risposta ha risolto il mio problema !!! Dovrebbe essere contrassegnato come risposta. Grazie!!! +1
Si8,

Ha funzionato per me. Ricorda solo che devi riavviare l'app se hai aggiunto una nuova immagine alla directory pubblica.
Awasik,

È davvero un modo rapido per trattare le situazioni, ma funzionerà solo se non hai bisogno di URL relativi. Ad esempio, se www.example.com/react-apppubblichi la tua app su , la cartella pubblica verrà esposta su www.example.com, senza react-app. Questo può essere problematico, quindi la risposta accettata è quella corretta. Fonti: aggiunta di risorse e utilizzo della cartella pubblica
Alexandru Pirvu,

44

Con create-react-appc'è la cartella pubblica (con index.html ...). Se inserisci "myImage.png" lì, ad esempio nella sottocartella img , puoi accedervi tramite:

<img src={window.location.origin + '/img/myImage.png'} />

4
Questa dovrebbe essere contrassegnata come la risposta corretta, perché in realtà è una soluzione di reazione per tutti i tipi di percorsi di qualsiasi file
Sami

Non capisco perché pensi che questa sia la risposta corretta. Ho appena provato questa risposta e la risposta di Claireblani e la risposta di Claire hanno funzionato mentre ciò non ha funzionato. Questa risposta funziona solo se l'immagine è nella cartella pubblica. Le mie immagini dovrebbero andare nella cartella pubblica? @Sami
Maderas,

Sì, le prime cose di @Maderas è che questa risposta è uguale a quella accettata => basta rimuovere {} e l'URL di base che puoi usare semplicemente src = '/ relativo percorso dell'immagine' o src = 'percorso assoluto dell'immagine' Cosa c'è di più in questo la risposta è che ospita un percorso variabile per qualsiasi immagine
Sami

Finora funziona per me come un fascino. Nient'altro ha fatto! E ho provato praticamente tutto. Grazie!
Maria Campbell,

32
  1. Crea una cartella di immagini all'interno di src (/ src / images) e mantieni la tua immagine al suo interno. Quindi importa questa immagine nel tuo componente (usa il tuo percorso relativo). Come sotto

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

    E poi nel tuo componente.

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

  2. Un altro modo è quello di mantenere le immagini nella cartella pubblica e importarle usando il percorso relativo. Per questo crea una cartella di immagini in una cartella pubblica e tieni l'immagine in essa. E poi nel tuo componente usalo come di seguito.

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

    Entrambi i metodi funzionano, ma il primo è raccomandato perché il suo modo più pulito e le immagini sono gestite dal webpack durante il tempo di costruzione.


2
questo mi ha aiutato :)
Raphael,

Questo non funzionerà, all'inizio è necessaria una barra (/) per indicare il percorso relativo, in questo modo: "/images/pitbull-mark.png"
Jeremy Rea

hai provato quello menzionato nella risposta? Anche questo dovrebbe funzionare.
Mustkeem K,

26

nel mio caso funziona anche il seguente codice.

<img src={require('../logo.png')} alt="logo" className="brand-logo"/>

1
Questo ha funzionato per me. Funziona nel caso in cui NON desideri archiviare immagini nella cartella pubblica
Mr_LinDowsMac

13

Alcune risposte più vecchie non funzionano, altre sono buone ma non spiegano il tema, in sintesi:

Se l'immagine è nella directory "pubblica"

Esempio: \public\charts\a.png

In html:

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

In JavaScript:

Crea un'immagine in new img, in modo dinamico:

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

Imposta l'immagine su img esistente con id come 'img1', in modo dinamico:

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

Se l'immagine è nella directory 'src':

Esempio: \src\logo.svg

In JavaScript:

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

In jsx:

<img src={logo} /> 

3

Aggiunta di npm del caricatore di file a webpack.config.js secondo le sue istruzioni di utilizzo ufficiali in questo modo:

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

ha funzionato per me.


3

Importa immagini nel tuo componente

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

E chiama il nome dell'immagine su image src = {RecentProjectImage_3} come oggetto

 <Img src={RecentProjectImage_3} alt="" />

2

Un amico mi ha mostrato come fare come segue:

"./" funziona quando il file che richiede l'immagine (ad es. "esempio.js") si trova sullo stesso livello all'interno della struttura ad albero della cartella della cartella "immagini".


1

Posiziona il logo nella tua cartella pubblica sotto ad esempio public / img / logo.png e quindi fai riferimento alla cartella pubblica come% PUBLIC_URL%:

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

L'uso di% PUBLIC_URL% in precedenza verrà sostituito con l'URL della publiccartella durante la compilazione. Solo i file all'interno della publiccartella possono essere referenziati dall'HTML.

A differenza di "/img/logo.png" o "logo.png", "% PUBLIC_URL% / img / logo.png" funzionerà correttamente sia con il routing lato client che con un URL pubblico non root. Scopri come configurare un URL pubblico non root eseguendolo npm run build.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.