Jalur yang benar untuk img di React.js

135

Saya memiliki beberapa masalah dengan gambar saya di proyek reaksi saya. Memang saya selalu berpikir bahwa path relatif ke atribut src dibangun pada arsitektur file

Di sini arsitektur file saya:

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

Namun saya menyadari bahwa path dibangun di atas url. Di salah satu komponen saya (misalnya ke file1.jsx) saya punya ini:

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

Bagaimana mungkin untuk menyelesaikan masalah ini? Saya ingin bahwa dalam segala bentuk rute yang ditangani oleh react-router, semua gambar dapat ditampilkan dengan jalur yang sama.

onedkr
sumber
1
arahkan saja langsung ke gambar, jangan gunakan ../ apa pun
omarjmh
4
Anda harus menggunakan require. Baca jawaban ini di SO untuk info lebih lanjut.
hari ini
Semoga jawaban ini membantu Anda Bereaksi gambar lokal
mokesh moha

Jawaban:

73

Anda menggunakan url relatif, yang relatif terhadap url saat ini, bukan sistem file. Anda dapat menyelesaikan ini dengan menggunakan url absolut

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

Tapi itu tidak bagus untuk ketika Anda menyebarkan ke www.my-domain.bike, atau situs lain. Lebih baik menggunakan url relatif terhadap direktori root situs

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

prekolna
sumber
1
Terima kasih, saya akan menekankan /yang mendahului details(vs ./details, dll, untuk orang lain yang mungkin mengacaukan keduanya).
user1322092
1
Bahkan bagi saya itu tidak berfungsi. Saya menggunakan reactjsdengan cordovadan menggunakan ES5sebagai eslint
Jimit Patel
Sementara ini dan solusi claireablani bekerja, claireablani adalah apa yang direkomendasikan oleh dokumen app-react-app. Mereka mencantumkan sejumlah manfaat dibandingkan menempatkan sumber daya di facebook.github.io/create-react-app/docs/…
Athir Nuaimi
@ user1322092 benar. Ingat itu /images/popcorn.pngdan tidak ./images/popcorn.png. Bekerja untuk saya dengan semua rute dan barang-barang.
Nuhman
335

Di create-react-appjalur relatif untuk gambar tampaknya tidak berfungsi. Sebagai gantinya, Anda dapat mengimpor gambar:

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

class Nav extends Component { 
    render() { 
        return ( 
            <img src={logo} alt={"logo"}/> 
        )  
    }
}
claireablani
sumber
15
bagaimana dengan gambar dinamis, misalnya, dirujuk dalam file json, di create-react-app?
zok
2
@ zok Saya pikir Anda akan mengekspor variabel dari file JSON, mengimpor variabel ke komponen Anda. Maka Anda bisa merujuknya seperti biasa. mis. ekspor const my_src = variable_here, impor {my_src} dari my_file, dan src = {my_src}.
claireablani
1
import './styles/style.less'; **import logo from './styles/images/deadline.png';**Saya mendapatkan kesalahan pada modul baris ke-2 tidak ditemukan saat gambar ada & path sudah benar.
Hitendra
Metode ini juga dikonfirmasi oleh survi.js jika Anda ingin melihat salah satu metode penulis inti webpack. Dia juga menyebutkan Anda dapat menggunakan babel-plugin-transform-react-jsx-img-import untuk berkeliling harus mengimpor gambar setiap kali Anda mereferensikan gambar.
Andre
2
Bukan ini, itu hanya memecahkan masalah gambar tetapi tidak menyelesaikan masalah jalur .. Jawaban Dima Gershman 'adalah solusi reaksi aktual untuk jalur semua file img atau yang lain
Sami
130

Jika Anda menggunakan buat-reaksi-aplikasi untuk membuat proyek Anda maka folder publik Anda dapat diakses. Jadi, Anda perlu menambahkan imagefolder Anda di dalam folder publik.

publik / gambar /

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

Rubel hasan
sumber
Saya akan mengajukan pertanyaan tetapi jawaban ini memecahkan masalah saya !!! Harus ditandai sebagai jawaban. Terima kasih!!! +1
Si8
Ini berhasil untuk saya. Ingatlah bahwa Anda harus memulai ulang aplikasi jika Anda menambahkan gambar baru ke direktori publik.
awasik
Ini memang cara cepat untuk menangani situasi, tetapi hanya akan berfungsi jika Anda tidak memerlukan URL relatif. Misalnya jika Anda melayani aplikasi di www.example.com/react-app, folder publik akan terbuka di www.example.com, tanpa react-app. Ini bisa merepotkan, jadi jawaban yang diterima adalah yang benar. Sumber: menambah aset dan menggunakan folder publik
Alexandru Pirvu
44

Dengan create-react-appada folder publik (dengan index.html ...). Jika Anda menempatkan "myImage.png" di sana, katakan di bawah sub-folder img , maka Anda dapat mengaksesnya melalui:

<img src={window.location.origin + '/img/myImage.png'} />
Dima G
sumber
4
Ini harus ditandai sebagai jawaban yang benar, karena itu sebenarnya adalah solusi untuk semua jenis path dari semua file
Sami
Saya tidak mengerti mengapa Anda berpikir ini adalah jawaban yang benar. Saya hanya mencoba jawaban ini dan jawaban Claireblani dan jawaban claire berhasil sementara ini tidak. Jawaban ini hanya berfungsi jika gambar ada di folder publik. Haruskah gambar saya masuk ke folder publik? @Sami
Maderas
Ya @Maderas hal pertama adalah apakah jawaban ini sama dengan yang diterima => hanya menghapus {} dan url dasar Anda dapat menggunakan cukup src = '/ path relatif gambar' atau src = 'path absolut gambar' Apa lagi di ini jawabannya adalah bahwa itu mengakomodasi jalur variabel untuk gambar apa pun
Sami
Sejauh ini bekerja untuk saya seperti pesona. Tidak ada yang berhasil! Dan saya mencoba hampir semuanya. Terima kasih!
Maria Campbell
32
  1. Buat folder gambar di dalam src (/ src / images) dan simpan gambar Anda di dalamnya. Kemudian impor gambar ini di komponen Anda (gunakan jalur relatif Anda). Seperti di bawah ini-

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

    Dan kemudian di komponen Anda.

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

  2. Cara lain adalah menyimpan gambar di folder publik dan mengimpornya menggunakan jalur relatif. Untuk ini, buat folder gambar di folder publik dan simpan gambar Anda di dalamnya. Dan kemudian di komponen Anda gunakan seperti di bawah ini.

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

    Kedua metode ini berfungsi tetapi yang pertama direkomendasikan karena cara yang lebih bersih dan gambar ditangani oleh webpack selama waktu pembuatan.

Mustkeem K
sumber
2
ini membantu saya :)
Raphael
Ini tidak akan berfungsi, garis miring (/) diperlukan di awal untuk menunjukkan jalur relatif, seperti: "/images/pitbull-mark.png"
Jeremy Rea
Sudahkah Anda mencoba yang disebutkan dalam jawaban? Ini harus bekerja juga.
Mustkeem K
26

dalam kasus saya kode berikut juga berfungsi.

<img src={require('../logo.png')} alt="logo" className="brand-logo"/>
Sodhi saab
sumber
1
Itu berhasil bagi saya. Ini berfungsi jika Anda TIDAK ingin menyimpan gambar di folder publik
Mr_LinDowsMac
13

Beberapa jawaban yang lebih tua tidak berfungsi, yang lain baik tetapi tidak akan menjelaskan tema, secara ringkas:

Jika gambar ada di direktori 'publik'

Contoh: \public\charts\a.png

Dalam html:

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

Dalam JavaScript:

Buat gambar ke img baru, secara dinamis:

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

Setel gambar ke img yang ada dengan id sebagai 'img1', secara dinamis:

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

Jika gambar ada di direktori 'src':

Contoh: \src\logo.svg

Dalam JavaScript:

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

Dalam JSX:

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

Menambahkan file-loader npm ke webpack.config.js per instruksi penggunaan resminya seperti:

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

bekerja untukku.

Zhang Treefish
sumber
3

Impor Gambar di komponen Anda

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

Dan panggil nama gambar pada gambar src = {RecentProjectImage_3} sebagai objek

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

Seorang teman menunjukkan kepada saya bagaimana melakukan ini sebagai berikut:

"./" berfungsi ketika file yang meminta gambar (misalnya, "example.js") berada pada level yang sama dalam struktur struktur folder dengan folder "gambar".

AdamJSim
sumber
1

Tempatkan logo di folder publik Anda di bawah mis. Publik / img / logo.png dan kemudian merujuk ke folder publik sebagai% PUBLIC_URL%:

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

Penggunaan% PUBLIC_URL% di atas akan diganti dengan URL publicfolder selama pembuatan. Hanya file di dalampublic folder yang dapat dirujuk dari HTML.

Tidak seperti "/img/logo.png" atau "logo.png", "% PUBLIC_URL% / img / logo.png" akan berfungsi dengan benar baik dengan perutean sisi klien dan URL publik non-root. Pelajari cara mengonfigurasi URL publik non-root dengan menjalankan npm run build.

Sami Mulai
sumber