React.js'de img için doğru yol


135

React projemdeki resimlerimle ilgili bazı problemlerim var. Aslında, src özniteliğine giden göreceli yolun dosya mimarisi üzerine inşa edildiğini düşünmüşümdür hep

İşte benim dosya mimarim:

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

Ancak yolun url üzerine kurulduğunu fark ettim. Bileşenimden birinde (örneğin file1.jsx'e) şuna sahibim:

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

Bu sorunu nasıl çözmek mümkün? React-router tarafından işlenen her türlü rotada, tüm görüntülerin aynı yolla görüntülenmesini istiyorum.


1
sadece doğrudan resmi göster, kullanma ../ ne olursa olsun
omarjmh

4
Kullanmanız gerekiyor require. Daha fazla bilgi için SO'daki bu cevabı okuyun .
bugün

Yanıtlar:


73

Dosya sistemine değil, mevcut url'ye göre göreli bir url kullanıyorsunuz. Bunu mutlak URL'ler kullanarak çözebilirsiniz

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

Ancak, www.my-domain.bike veya başka bir siteye dağıtım yaptığınızda bu pek iyi değil. Sitenin kök dizinine göre bir url kullanmak daha iyidir

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


1
Teşekkürler, /öncekileri vurgulamak isterim details( ./detailsikisini birleştirebilecek diğerleri için vs vs ).
user1322092

1
Benim için bile çalışmıyor. Ben kullanıyorum reactjsile cordovave kullanma ES5eslint olarak
Jimit Patel

Hem bu hem de claireablani'nin çözümü işe yararken, claireablani, uygulama oluşturma-tepki verme dokümanlarının önerdiği şeydir. Kaynakları herkese açık facebook.github.io/create-react-app/docs/…
Athir Nuaimi

@ user1322092 haklı. Unutma, /images/popcorn.pngdeğil ./images/popcorn.png. Tüm rotalar ve diğer şeyler için benim için çalıştı.
Nuhman

335

Gelen create-react-appgörüntüler için göreli yollar işe görünmüyor. Bunun yerine bir görüntüyü içe aktarabilirsiniz:

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

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

16
Örneğin, create-react-app'de bir json dosyasında referans verilen dinamik görüntüler ne olacak?
zok

2
@zok Değişkeni JSON dosyasından dışa aktaracağınızı, değişkeni bileşeninize içe aktaracağınızı düşünüyorum. O zaman her zamanki gibi referans verebilirsiniz. ör. const my_src = variable_here dışa aktar, {my_src} dosyasını my_file ve src = {my_src} içe aktar.
claireablani

1
import './styles/style.less'; **import logo from './styles/images/deadline.png';**Görüntü varken ve yol doğruyken 2. satır modülünde hata alıyorum.
Hitendra

Çekirdek web paketi yazarının yöntemlerinden birine göz atmak istiyorsanız , bu yöntem, survive.js tarafından da onaylanır . Ayrıca , bir görüntüye her başvurduğunuzda görüntüyü içe aktarmak zorunda kalmamak için babel-plugin-transform-react-jsx-img-import kullanabileceğinizden bahsediyor .
Andre

2
Bu değil, yalnızca görüntü sorununu çözer, ancak yol sorununu çözmez .. Dima Gershman'ın yanıtı, herhangi bir dosya img veya başka bir yol için gerçek tepki çözümüdür
Sami

130

Projenizi oluşturmak için create-react-app kullandıysanız, ortak klasörünüze erişilebilir. Bu nedenle imageklasörünüzü ortak klasörün içine eklemeniz gerekir .

kamu / images /

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


Soru sormak üzereydim ama BU cevap sorunumu çözdü !!! Cevap olarak işaretlenmelidir. Teşekkürler!!! +1
Si8

Benim için çalıştı. Genel dizine yeni görüntü eklediyseniz uygulamayı yeniden başlatmanız gerektiğini unutmayın.
awasik

Gerçekten de durumları tedavi etmenin hızlı bir yoludur, ancak yalnızca göreli URL'lere ihtiyacınız yoksa işe yarar. Örneğin, uygulamanızı adresinde www.example.com/react-appsunuyorsanız, ortak klasör www.example.com'da gösterilmeden gösterilecektir react-app. Bu zahmetli olabilir, bu yüzden kabul edilen cevap doğrudur. Kaynaklar: varlıklar ekleme ve ortak klasörü kullanma
Alexandru Pirvu

44

İle create-react-apporada kamu klasörü (ile index.html ...). "MyImage.png" dosyanızı oraya yerleştirirseniz, diyelim ki img alt klasörünün altına, sonra bunlara şu şekilde erişebilirsiniz:

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

4
Bu doğru cevap olarak işaretlenmelidir, çünkü aslında herhangi bir dosyanın her türlü yolu için reactjs çözümüdür
Sami

Neden bunun doğru cevap olduğunu düşündüğünü anlamıyorum. Sadece bu cevabı denedim ve Claireblani'nin cevabı ve Claire'in cevabı işe yararken bu işe yaramadı. Bu yanıt yalnızca görüntü ortak klasördeyse işe yarar. Resimlerim ortak klasöre gitmeli mi? @Sami
Maderas

Evet @Maderas ilk şey, bu cevap kabul edilenle aynıdır => sadece kaldırarak {} ve basitçe src = '/ göreli görüntünün yolu' veya src = 'mutlak görüntü yolu' kullanabileceğiniz temel url'yi kullanabilirsiniz. yanıt, herhangi bir görüntü için değişken yolu barındırmasıdır
Sami

Şimdiye kadar benim için bir cazibe gibi çalışıyor. Başka hiçbir şey yapmadı! Ve hemen hemen her şeyi denedim. Teşekkürler!
Maria Campbell

32
  1. Src (/ src / images) içinde bir resim klasörü oluşturun ve resminizi içinde tutun. Ardından bu görüntüyü bileşeninize aktarın (göreceli yolunuzu kullanın). Aşağıdaki gibi-

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

    Ve sonra bileşeninizde.

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

  2. Diğer bir yol da görüntüleri ortak klasörde tutmak ve göreli yol kullanarak içe aktarmaktır. Bunun için ortak klasörde bir görüntü klasörü oluşturun ve görüntünüzü içinde saklayın. Ve sonra bileşeninizde aşağıdaki gibi kullanın.

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

    Her iki yöntem de işe yarar, ancak ilki önerilir çünkü daha temiz yolu ve görüntüleri, derleme sırasında web paketi tarafından işlenir.


2
bu bana yardımcı oldu :)
Raphael

Bu işe yaramaz, göreceli yolu belirtmek için başlangıçta bir eğik çizgi (/) gerekir, şöyle ki: "/images/pitbull-mark.png"
Jeremy Rea

cevapta bahsedileni denedin mi? Bu da çalışmalıdır.
Mustkeem K

26

benim durumumda aşağıdaki kod da çalışıyor.

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

1
Bu benim için çalıştı. Bu, görüntüleri ortak klasörde saklamak istemediğinizde
işe yarar

13

Bazı eski cevaplar işe yaramıyor, diğerleri iyi ama özetle temayı açıklamıyor:

Görüntü 'genel' dizindeyse

Misal: \public\charts\a.png

Html olarak:

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

JavaScript'te:

Dinamik olarak yeni img için görüntü oluşturun:

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

Resmi dinamik olarak "img1" kimliğine sahip mevcut img'ye ayarlayın:

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

Görüntü 'src' dizinindeyse:

Misal: \src\logo.svg

JavaScript'te:

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

Jsx olarak:

<img src={logo} /> 

4

Ekleme dosya yükleyici UÖM'sini şöyle resmi kullanım talimatı başına webpack.config.js için:

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

benim için çalıştı.


3

Bileşeninizdeki Görüntüleri İçe Aktarın

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

Ve resim src = {RecentProjectImage_3} üzerindeki resim adını bir nesne olarak çağırın

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

2

Bir arkadaşım bunu nasıl yapacağımı şu şekilde gösterdi:

"./", görüntüyü isteyen dosya (örneğin, "example.js") klasör ağacı yapısı içinde "görüntüler" klasörüyle aynı seviyede olduğunda çalışır.


1

Logoyu ortak klasörünüze örneğin public / img / logo.png altına yerleştirin ve ardından ortak klasöre% PUBLIC_URL% olarak bakın:

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

Yukarıdaki% PUBLIC_URL% kullanımı public, oluşturma sırasında klasörün URL'si ile değiştirilecektir . publicHTML'den yalnızca klasör içindeki dosyalara başvurulabilir.

"/İmg/logo.png" veya "logo.png" nin aksine, "% PUBLIC_URL% / img / logo.png" hem istemci tarafı yönlendirmesi hem de kök olmayan genel URL ile doğru şekilde çalışacaktır. Kök olmayan bir genel URL'yi çalıştırarak nasıl yapılandıracağınızı öğrenin npm run build.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.