เส้นทางที่ถูกต้องสำหรับ img บน React.js


135

ฉันมีปัญหากับภาพของฉันในโครงการตอบสนองของฉัน อันที่จริงฉันคิดเสมอว่าพา ธ สัมพัทธ์ไปยังแอตทริบิวต์ src ถูกสร้างขึ้นบนสถาปัตยกรรมไฟล์

นี่คือสถาปัตยกรรมไฟล์ของฉัน:

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

อย่างไรก็ตามฉันตระหนักว่าเส้นทางถูกสร้างขึ้นบน url ในองค์ประกอบหนึ่งของฉัน (ตัวอย่างเช่นใน file1.jsx) ฉันมีสิ่งนี้:

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

เป็นไปได้อย่างไรที่จะแก้ปัญหานี้? ฉันต้องการให้ในรูปแบบของเส้นทางใด ๆ ที่จัดการโดย react-router ภาพทั้งหมดสามารถแสดงด้วยเส้นทางเดียวกัน


1
เพียงชี้ไปที่รูปภาพโดยตรงอย่าใช้ .. / อะไรก็ได้
omarjmh

4
requireคุณจำเป็นต้องใช้ อ่านคำตอบนี้ใน SO สำหรับข้อมูลเพิ่มเติม
วันนี้

หวังว่าคำตอบนี้จะช่วยให้คุณตอบสนองภาพในท้องถิ่นได้
mokesh moha

คำตอบ:


73

คุณกำลังใช้ url สัมพัทธ์ซึ่งสัมพันธ์กับ url ปัจจุบันไม่ใช่ระบบไฟล์ คุณสามารถแก้ไขปัญหานี้ได้โดยใช้ URL ที่สมบูรณ์

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

แต่นั่นไม่ดีสำหรับเมื่อคุณปรับใช้กับ www.my-domain.bike หรือไซต์อื่น ๆ จะเป็นการดีกว่าที่จะใช้ url ที่สัมพันธ์กับไดเรกทอรีรากของไซต์

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


1
ขอบคุณฉันจะเน้นย้ำถึงสิ่ง/ที่นำหน้าdetails(เทียบกับ./detailsฯลฯ สำหรับคนอื่น ๆ ที่อาจทำให้ทั้งสองสับสน)
user1322092

1
แม้สำหรับฉันมันไม่ได้ผล ฉันใช้reactjsกับcordovaและใช้ES5เป็น eslint
Jimit Patel

แม้ว่าโซลูชันนี้และโซลูชันของ claireablani จะใช้ได้ผล แต่ claireablani ก็เป็นสิ่งที่เอกสารสำหรับสร้างปฏิกิริยาแอปแนะนำ พวกเขาแสดงรายการผลประโยชน์มากมายจากการใส่ทรัพยากรในfacebook.github.io/create-react-app/docs/…
Athir Nuaimi

@ user1322092 ถูกแล้ว โปรดจำไว้ว่ามันเป็นและไม่ได้/images/popcorn.png ./images/popcorn.pngทำงานให้ฉันด้วยเส้นทางและสิ่งของทั้งหมด
Nuhman

335

ในcreate-react-appเส้นทางสัมพัทธ์สำหรับรูปภาพดูเหมือนจะไม่ทำงาน คุณสามารถนำเข้ารูปภาพแทนได้:

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

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

16
สิ่งที่เกี่ยวกับภาพไดนามิกตัวอย่างเช่นที่อ้างอิงในไฟล์ json ใน create-react-app?
zok

2
@zok ฉันคิดว่าคุณจะส่งออกตัวแปรจากไฟล์ JSON นำเข้าตัวแปรไปยังส่วนประกอบของคุณ จากนั้นคุณสามารถอ้างอิงได้ตามปกติ เช่นส่งออก const my_src = variable_here นำเข้า {my_src} จาก my_file และ src = {my_src}
claireablani

1
import './styles/style.less'; **import logo from './styles/images/deadline.png';**ฉันได้รับข้อผิดพลาดในโมดูลบรรทัดที่ 2 ไม่พบในขณะที่มีภาพอยู่ & เส้นทางถูกต้อง
Hitendra

วิธีนี้ยังได้รับการยืนยันโดยsurvival.jsหากคุณต้องการดูหนึ่งในวิธีของผู้เขียน webpack หลัก นอกจากนี้เขายังกล่าวถึงคุณสามารถใช้babel-plugin-transform-react-jsx-img-importเพื่อหลีกเลี่ยงการนำเข้ารูปภาพทุกครั้งที่คุณอ้างอิงรูปภาพ
Andre

2
ไม่ใช่สิ่งนี้มันแก้ปัญหาภาพเท่านั้น แต่ไม่สามารถแก้ปัญหาเส้นทางได้ .. คำตอบของ Dima Gershman คือวิธีตอบสนองที่แท้จริงสำหรับเส้นทางของไฟล์ใด ๆ img หรืออื่น ๆ
Sami

130

หากคุณใช้ create-react-app เพื่อสร้างโครงการของคุณโฟลเดอร์สาธารณะของคุณจะสามารถเข้าถึงได้ ดังนั้นคุณต้องเพิ่มimageโฟลเดอร์ของคุณในโฟลเดอร์สาธารณะ

ประชาชน / images /

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


ฉันกำลังจะถามคำถาม แต่คำตอบนี้ช่วยแก้ปัญหาของฉันได้ !!! ควรทำเครื่องหมายเป็นคำตอบ ขอบคุณ !!! +1
Si8

มันได้ผลสำหรับฉัน เพียงจำไว้ว่าคุณต้องรีสตาร์ทแอปหากคุณเพิ่มรูปภาพใหม่ในไดเรกทอรีสาธารณะ
วาสิก

เป็นวิธีที่รวดเร็วในการจัดการกับสถานการณ์ แต่จะใช้ได้ผลก็ต่อเมื่อคุณไม่ต้องการ URL แบบสัมพัทธ์ เช่นถ้าคุณให้บริการของแอปที่www.example.com/react-appโฟลเดอร์สาธารณะจะได้สัมผัสบน www.example.com react-appโดยไม่ต้อง อาจเป็นเรื่องยุ่งยากดังนั้นคำตอบที่ยอมรับคือคำตอบที่ถูกต้อง ที่มา: การเพิ่มเนื้อหาและการใช้โฟลเดอร์สาธารณะ
Alexandru Pirvu

44

ด้วยcreate-react-appมีประชาชนโฟลเดอร์ (กับindex.html ... ) หากคุณวาง "myImage.png" ไว้ที่นั่นให้พูดใต้โฟลเดอร์ย่อยimgจากนั้นคุณสามารถเข้าถึงได้ผ่าน:

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

4
ควรทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้องเนื่องจากเป็นโซลูชัน reactjs สำหรับเส้นทางทุกประเภทของไฟล์ใด ๆ
Sami

ฉันไม่เข้าใจว่าทำไมคุณถึงคิดว่านี่เป็นคำตอบที่ถูกต้อง ฉันเพิ่งลองใช้คำตอบนี้และคำตอบของแคลร์บลานีและคำตอบของแคลร์ได้ผลในขณะที่ไม่ได้ผล คำตอบนี้ใช้ได้เฉพาะเมื่อรูปภาพอยู่ในโฟลเดอร์สาธารณะ รูปภาพของฉันควรอยู่ในโฟลเดอร์สาธารณะหรือไม่ @Sami
Maderas

ใช่ @Maderas สิ่งแรกคือคำตอบนี้เหมือนกับคำตอบที่ยอมรับ => เพียงแค่ลบ {} และ URL พื้นฐานคุณสามารถใช้เพียงแค่ src = '/ เส้นทางสัมพัทธ์ของรูปภาพ' หรือ src = 'พา ธ ที่สมบูรณ์ของรูปภาพ' มีอะไรเพิ่มเติมในนี้ คำตอบคือมันรองรับเส้นทางตัวแปรสำหรับรูปภาพใด ๆ
Sami

จนถึงตอนนี้ได้ผลสำหรับฉันเหมือนมีเสน่ห์ ไม่มีอะไรทำ! และฉันพยายามทุกอย่าง ขอบคุณ!
Maria Campbell

32
  1. สร้างโฟลเดอร์รูปภาพภายใน src (/ src / images) และเก็บภาพของคุณไว้ในนั้น จากนั้นนำเข้าภาพนี้ในส่วนประกอบของคุณ (ใช้เส้นทางสัมพัทธ์ของคุณ) ชอบด้านล่าง -

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

    แล้วในส่วนประกอบของคุณ

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

  2. อีกวิธีหนึ่งคือเก็บภาพไว้ในโฟลเดอร์สาธารณะและนำเข้าโดยใช้เส้นทางสัมพัทธ์ สำหรับสิ่งนี้ให้สร้างโฟลเดอร์รูปภาพในโฟลเดอร์สาธารณะและเก็บภาพของคุณไว้ในนั้น จากนั้นในส่วนประกอบของคุณให้ใช้ดังต่อไปนี้

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

    ทั้งสองวิธีใช้งานได้ แต่ขอแนะนำวิธีแรกเนื่องจากวิธีที่สะอาดกว่าและรูปภาพจะถูกจัดการโดย webpack ในช่วงเวลาสร้าง


2
สิ่งนี้ช่วยฉันได้ :)
Raphael

วิธีนี้ใช้ไม่ได้ผลต้องใช้เครื่องหมายทับ (/) ในตอนเริ่มต้นเพื่อระบุเส้นทางสัมพัทธ์ดังนี้: "/images/pitbull-mark.png"
Jeremy Rea

คุณได้ลองสิ่งที่กล่าวถึงในคำตอบหรือไม่? สิ่งนี้ควรใช้งานได้เช่นกัน
Mustkeem K

26

ในกรณีของฉันรหัสต่อไปนี้ก็ใช้ได้เช่นกัน

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

1
ที่ได้ผลสำหรับฉัน ใช้งานได้ในกรณีที่คุณไม่ต้องการเก็บภาพในโฟลเดอร์สาธารณะ
Mr_LinDowsMac

13

คำตอบเก่า ๆ บางคำใช้ไม่ได้ผลคำตอบอื่นดี แต่จะไม่อธิบายธีมโดยสรุป:

หากรูปภาพอยู่ในไดเรกทอรี "สาธารณะ"

ตัวอย่าง: \public\charts\a.png

ใน html:

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

ใน JavaScript:

สร้างภาพเป็น img ใหม่แบบไดนามิก:

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

ตั้งค่ารูปภาพเป็น img ที่มีอยู่โดยใช้ id เป็น 'img1' แบบไดนามิก:

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

หากรูปภาพอยู่ในไดเร็กทอรี 'src':

ตัวอย่าง: \src\logo.svg

ใน JavaScript:

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

ใน jsx:

<img src={logo} /> 

4

การเพิ่มfile-loader npmไปที่ webpack.config.js ตามคำแนะนำการใช้งานอย่างเป็นทางการดังนี้:

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

ทำงานให้ฉัน


3

นำเข้ารูปภาพในส่วนประกอบของคุณ

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

และเรียกชื่อภาพบน image src = {RecentProjectImage_3}เป็นวัตถุ

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

2

เพื่อนคนหนึ่งแสดงวิธีการทำดังนี้:

"./" จะทำงานเมื่อไฟล์ที่ร้องขอรูปภาพ (เช่น "example.js") อยู่ในระดับเดียวกันภายในโครงสร้างแผนผังโฟลเดอร์กับโฟลเดอร์ "images"


1

วางโลโก้ในโฟลเดอร์สาธารณะของคุณภายใต้เช่น public / img / logo.png จากนั้นอ้างถึงโฟลเดอร์สาธารณะเป็น% PUBLIC_URL%:

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

การใช้% PUBLIC_URL% ในข้างต้นจะถูกแทนที่ด้วย URL ของpublicโฟลเดอร์ในระหว่างการสร้าง เฉพาะไฟล์ภายในไฟล์publicโฟลเดอร์เท่านั้นที่สามารถอ้างอิงได้จาก HTML

ไม่เหมือนกับ "/img/logo.png" หรือ "logo.png" "% PUBLIC_URL% / img / logo.png" จะทำงานได้อย่างถูกต้องทั้งกับการกำหนดเส้นทางฝั่งไคลเอ็นต์และ URL สาธารณะที่ไม่ใช่รูท เรียนรู้วิธีการกำหนดค่าที่ไม่ใช่ราก URL npm run buildสาธารณะโดยการเรียกใช้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.