ฉันจะอ้างอิงภาพท้องถิ่นใน React ได้อย่างไร


167

ฉันจะโหลดรูปภาพจากไดเรกทอรีภายในเครื่องและรวมไว้ในreactjs img srcแท็กได้อย่างไร

ฉันมีภาพที่เรียกว่าone.jpegภายในโฟลเดอร์เดียวกับองค์ประกอบของฉันและฉันพยายามทั้งสอง<img src="one.jpeg" />และ<img src={"one.jpeg"} />ภายในrenderฟังก์ชั่นของฉันแต่ภาพไม่ปรากฏขึ้น นอกจากนี้ฉันไม่สามารถเข้าถึงwebpack configไฟล์ได้เนื่องจากโครงการถูกสร้างขึ้นด้วยการใช้create-react-appบรรทัดคำสั่งอย่างเป็นทางการ

ปรับปรุง: งานนี้ถ้าครั้งแรกที่ผมนำเข้าภาพที่มีimport img from './one.jpeg'และใช้งานได้ภายในแต่ฉันมีไฟล์ภาพจำนวนมากดังนั้นเพื่อการนำเข้าและดังนั้นฉันต้องการที่จะใช้พวกเขาในรูปแบบimg src={img}img src={'image_name.jpeg'}


2
สำเนาที่เป็นไปได้ของReact จะไม่โหลดภาพในพื้นที่
Vanuan


ฉันมีปัญหาที่คล้ายกันภาพของฉันถูกนำเข้ามาในไฟล์ index.jsx ฉันมีตัวตักใน webpack หน้าคอมไพล์ทำงานได้ดีเนื่องจากสำเนาของรูปภาพถูกสร้างขึ้นในเซิร์ฟเวอร์ / สาธารณะ / js โฟลเดอร์ที่มีหมายเลขสุ่มและเส้นทางที่ถูกต้องอยู่ในตัวรวม แต่ฉันไม่สามารถเห็นภาพ มันแปลกที่มันถูกสร้างขึ้นในเซิร์ฟเวอร์ / สาธารณะ / js และไม่ใช่เซิร์ฟเวอร์ / สาธารณะ / img อย่างที่ฉันเขียนไว้ใน index.js
Carmine Tambascia

คำตอบ:


305

ก่อนอื่นให้ห่อ src เข้า {}

จากนั้นหากใช้ Webpack; แทน: <img src={"./logo.jpeg"} />

คุณอาจจำเป็นต้องใช้ต้องการ:

<img src={require('./logo.jpeg')} />


ตัวเลือกอื่นจะเป็นการนำเข้าภาพก่อนเช่น:

import logo from './logo.jpeg'; // with import

หรือ ...

const logo = require('./logo.jpeg); // with require

จากนั้นเสียบเข้า ...

<img src={logo} />

ฉันขอแนะนำตัวเลือกนี้โดยเฉพาะถ้าคุณใช้แหล่งรูปภาพซ้ำ


13
ระวังอย่าลืม.จุดเริ่มต้นของ URL ที่สัมพันธ์กัน ควรเป็น<img src={require('./one.jpeg')} />
Nuhman

1
วิธีการใด ๆ เหล่านี้มีผลต่อประสิทธิภาพเช่นเวลาในการโหลดภาพหรือไม่ ถ้าเป็นเช่นนั้นประสิทธิภาพการทำงานใดที่ฉลาดดีกว่า
Inaam ur Rehman

1
@ انعامالرحمٰن - ความคิดเห็นบางส่วนเกี่ยวกับที่นี่stackoverflow.com/questions/31354559/…แต่ TL; DR ไม่ใช่, ไม่มีประสิทธิภาพแตกต่างกัน
Apswak

นี่คือความจริงที่ว่าอย่างน้อยกับ webpack 4 ตัวโหลดที่ใช้คือ url-loader แทนที่จะเป็นไฟล์หนึ่งหรือก่อนหน้า
Carmine Tambascia

64

วิธีที่ดีที่สุดคือนำเข้ารูปภาพก่อนแล้วจึงใช้งาน

import React, { Component } from 'react';
import logo from '../logo.svg';
export default class Header extends Component {
  render() {
    return (
      <div className="row">
        <div className="logo">
          <img src={logo} width="100" height="50" />
        </div>
      </div>
    );
  }
} 

1
ทำไมจึงเป็นวิธีที่ดีที่สุด
Jason Leach

8
มันเป็นวิธีที่ดีที่สุดถ้าคุณต้องการนำมาใช้ใหม่ในองค์ประกอบเดียวกันคุณสามารถใช้มันได้โดยไม่ต้องอ้างอิงเส้นทาง เป็นวิธีปฏิบัติที่ดี @JasonLeach
Arslan shakoor

Jason Leach เป็นวิธีที่สะอาดกว่า
Arslan shakoor

8

คุณต้องล้อมเส้นทางแหล่งที่มาของภาพไว้ภายใน {}

<img src={'path/to/one.jpeg'} />

คุณต้องใช้requireถ้าใช้webpack

<img src={require('path/to/one.jpeg')} />

8

ภายในโฟลเดอร์สาธารณะสร้างโฟลเดอร์ทรัพย์สินและวางเส้นทางภาพตามนั้น

<img className="img-fluid" 
     src={`${process.env.PUBLIC_URL}/assets/images/uc-white.png`} 
     alt="logo"/>

ขอขอบคุณสิ่งนี้ได้รับการพิสูจน์แล้วว่ามีประโยชน์สำหรับฉันในสถานการณ์ที่รูปภาพอาจมีหรือไม่มีอยู่ในโฟลเดอร์เพราะมันจะถูกนำเข้าแบบไดนามิกตามทรัพยากรที่แสดง
Sébastien De Varennes

4

วิธีที่ดีที่สุดสำหรับการนำเข้าภาพคือ ...

import React, { Component } from 'react';

// image import
import CartIcon from '../images/CartIcon.png';

 class App extends Component {
  render() {
    return (
     <div>
         //Call image in source like this
          <img src={CartIcon}/>
     </div>
    );
  }
}

1
ไม่รองรับการนำเข้าญาตินอก src / ในการทำเช่นนี้คุณจะต้องเก็บภาพไว้ใน src / ซึ่งไม่แนะนำ
toing_toing

@toing_toing ทำไมคุณไม่แนะนำให้เก็บรูปภาพด้วย src เอกสารอย่างเป็นทางการมีตัวอย่างที่เป็นกรณีนี้: facebook.github.io/create-react-app/docs/…
roob

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

4
@toing_toing คุณบอกว่าคุณจะ 'ค่อนข้าง .... ' แต่คุณไม่พูดว่าจะทำอย่างไร
Thomas Jay Rush

2

คุณมีสองวิธีที่จะทำ

เป็นครั้งแรก

นำเข้ารูปภาพด้านบนของชั้นเรียนแล้วอ้างอิงใน<img/>องค์ประกอบของคุณเช่นนี้

import React, { Component } from 'react';
import myImg from '../path/myImg.svg';

export default class HelloImage extends Component {
  render() {
    return <img src={myImg} width="100" height="50" /> 
  }
} 

ที่สอง

คุณสามารถระบุเส้นทางของภาพโดยตรงrequire('../pathToImh/img')ใน<img/>องค์ประกอบเช่นนี้

import React, { Component } from 'react'; 

export default class HelloImage extends Component {
  render() {
    return <img src={require(../path/myImg.svg)} width="100" height="50" /> 
  }
}


1

คำตอบของฉันนั้นคล้ายกับ Rubzen มาก ฉันใช้ภาพเป็นค่าวัตถุ btw สองรุ่นทำงานให้ฉัน:

{
"name": "Silver Card",
"logo": require('./golden-card.png'),

หรือ

const goldenCard = require('./golden-card.png');
{ "name": "Silver Card",
"logo": goldenCard,

โดยไม่ต้องห่อหุ้ม

ฉันได้ตรวจสอบโซลูชัน "นำเข้า" แล้วและในบางกรณีก็ใช้งานได้ (สิ่งที่ไม่น่าแปลกใจคือใช้ในรูปแบบ App.js ใน React) แต่ไม่ใช่ในกรณีที่เป็นของฉันข้างต้น


1

ฉันพบวิธีอื่นในการนำเครื่องมือนี้ไปใช้ (นี่เป็นองค์ประกอบที่ใช้งานได้):

const Image = ({icon}) => {
   const Img = require(`./path_to_your_file/${icon}.svg`).ReactComponent;
   return <Img />
}

หวังว่ามันจะช่วย!


0
import image from './img/one.jpg';

class Icons extends React.Component{
    render(){
      return(
        <img className='profile-image' alt='icon' src={image}/>
    );
    }
}
export default Icons;

0

ฉันใช้วิธีนี้และได้ผล ... ฉันหวังว่าคุณจะมีประโยชน์

const logofooter = require('../../project-files/images/logo.png');

 return(
 <div className="blockquote text-center">
            <img src={logofooter} width="100" height="80" />
 <div/>
);

0
import React from "react";   
import image from './img/one.jpg';

class Image extends React.Component{
  render(){
    return(
      <img className='profile-image' alt='icon' src={image}/>
   );
  }
}

ส่งออกภาพเริ่มต้น


0

ตามที่บางคนกล่าวถึงในความคิดเห็นคุณสามารถใส่ภาพในโฟลเดอร์สาธารณะ นอกจากนี้ยังอธิบายไว้ในเอกสารของ Create-React-App: https://create-react-app.dev/docs/using-the-public-folder/


มีจริงไม่จำเป็นต้องใช้รหัสมากกว่าหนึ่งบรรทัดในเอกสาร<img src={process.env.PUBLIC_URL + '/img/logo.png'} />
dyedwiper
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.