Đường dẫn chính xác cho img trên React.js


135

Tôi có một số vấn đề với hình ảnh của tôi trong dự án phản ứng của tôi. Quả thực tôi luôn nghĩ rằng đường dẫn tương đối vào thuộc tính src được xây dựng trên kiến ​​trúc tệp

Đây là kiến ​​trúc tập tin của tôi:

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

Tuy nhiên tôi nhận ra rằng đường dẫn được xây dựng trên url. Trong một trong các thành phần của tôi (ví dụ vào file1.jsx) tôi có điều này:

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

Làm thế nào có thể giải quyết vấn đề này? Tôi muốn rằng trong bất kỳ dạng tuyến đường nào được xử lý bởi bộ định tuyến phản ứng, tất cả các hình ảnh có thể được hiển thị với cùng một đường dẫn.


1
chỉ trỏ trực tiếp vào hình ảnh, không sử dụng ../ bất cứ điều gì
omarjmh

4
Bạn cần sử dụng require. Đọc câu trả lời này trên SO để biết thêm.
hôm nay

Hy vọng câu trả lời này sẽ giúp bạn hiểu được React hình ảnh địa phương
mokesh moha

Câu trả lời:


73

Bạn đang sử dụng một url tương đối, liên quan đến url hiện tại, không phải hệ thống tệp. Bạn có thể giải quyết điều này bằng cách sử dụng các url tuyệt đối

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

Nhưng điều đó không tuyệt vời khi bạn triển khai lên www.my-domain.bike hoặc bất kỳ trang web nào khác. Tốt hơn là sử dụng một url liên quan đến thư mục gốc của trang web

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


1
Cảm ơn, tôi sẽ nhấn mạnh những /điều đi trước details(vs ./details, v.v., cho những người khác có thể kết luận cả hai).
dùng1322092

1
Ngay cả đối với tôi nó không hoạt động. Tôi đang sử dụng reactjsvới cordovavà sử dụng ES5như eslint
Jimit Patel

Trong khi cả giải pháp này và giải pháp của claireablani đều hoạt động, thì claireablani là những gì mà các tài liệu ứng dụng tạo phản ứng khuyến nghị. Họ liệt kê một số lợi ích so với việc đưa tài nguyên vào facebook.github.io/create-react-app/docs/
ám

@ user1322092 là đúng. Hãy nhớ nó /images/popcorn.pngvà không ./images/popcorn.png. Làm việc cho tôi với tất cả các tuyến đường và công cụ.
Nuhman

335

Trong create-react-appcác đường dẫn tương đối cho hình ảnh dường như không hoạt động. Thay vào đó, bạn có thể nhập một hình ảnh:

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

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

14
những gì về hình ảnh động, ví dụ, được tham chiếu trong một tệp json, trong ứng dụng tạo phản ứng?
zok

2
@zok Tôi nghĩ bạn sẽ xuất biến từ tệp JSON, nhập biến vào thành phần của bạn. Sau đó, bạn có thể tham khảo nó như bình thường. ví dụ: xuất const my_src = biến_here, nhập {my_src} từ my_file và src = {my_src}.
claireablani

1
import './styles/style.less'; **import logo from './styles/images/deadline.png';**Tôi không nhận được lỗi trên mô-đun dòng 2 trong khi hình ảnh tồn tại & đường dẫn là chính xác.
Hitendra

Phương thức này cũng được xác nhận bởi survival.js nếu bạn muốn xem một trong các phương thức của tác giả webpack cốt lõi. Ông cũng đề cập đến việc bạn có thể sử dụng babel-plugin-Transform-Reac-jsx-img-import để tránh phải nhập hình ảnh mỗi khi bạn tham chiếu hình ảnh.
Andre

2
Không phải điều này, nó chỉ giải quyết vấn đề hình ảnh nhưng không giải quyết được vấn đề đường dẫn .. Câu trả lời của Dima Gershman là giải pháp phản ứng thực tế cho đường dẫn của bất kỳ tệp img nào khác
Sami

130

Nếu bạn đã sử dụng ứng dụng tạo phản ứng để tạo dự án thì thư mục chung của bạn có thể truy cập được. Vì vậy, bạn cần thêm imagethư mục của bạn bên trong thư mục công cộng.

công khai / hình ảnh /

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


Tôi định hỏi một câu hỏi nhưng câu trả lời NÀY đã giải quyết vấn đề của tôi !!! Nên được đánh dấu là câu trả lời. Cảm ơn!!! +1
Si8

Nó làm việc cho tôi. Chỉ cần nhớ rằng bạn cần khởi động lại ứng dụng nếu bạn đã thêm hình ảnh mới vào thư mục công cộng.
awasik

Đây thực sự là một cách nhanh chóng để xử lý các tình huống, nhưng nó sẽ chỉ hoạt động nếu bạn không cần URL tương đối. Ví dụ: nếu bạn phục vụ ứng dụng của mình tại www.example.com/react-app, thư mục công cộng sẽ được hiển thị trên www.example.com mà không có react-app. Điều này có thể gây rắc rối, vì vậy câu trả lời được chấp nhận là câu trả lời đúng. Nguồn: thêm tài sảnsử dụng thư mục công cộng
Alexandru Pirvu

44

Với create-react-app công thư mục (với index.html ...). Nếu bạn đặt "myImage.png" của mình ở đó, hãy nói trong thư mục con img , sau đó bạn có thể truy cập chúng thông qua:

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

4
Điều này nên được đánh dấu là câu trả lời đúng, bởi vì đây thực sự là giải pháp Reacjs cho tất cả các loại đường dẫn của bất kỳ tệp nào
Sami

Tôi không hiểu tại sao bạn nghĩ rằng đây là câu trả lời chính xác. Tôi vừa thử câu trả lời này và câu trả lời của Claireblani và câu trả lời của claire đã hoạt động trong khi điều này thì không. Câu trả lời này chỉ hoạt động nếu hình ảnh nằm trong thư mục công cộng. Hình ảnh của tôi có nên vào thư mục công cộng không? @Sami
Maderas

Có @Maderas điều đầu tiên là câu trả lời này giống như câu trả lời được chấp nhận => chỉ cần xóa {} và url cơ sở, bạn có thể sử dụng đơn giản src = '/ đường dẫn tương đối của hình ảnh' hoặc src = 'đường dẫn tuyệt đối của hình ảnh' câu trả lời là nó chứa đường dẫn thay đổi cho bất kỳ hình ảnh nào
Sami

Cho đến nay làm việc cho tôi như một nét duyên dáng. Không có gì khác đã làm! Và tôi đã thử mọi thứ. Cảm ơn!
Maria Campbell

32
  1. Tạo một thư mục hình ảnh bên trong src (/ src / hình ảnh) Và giữ hình ảnh của bạn trong đó. Sau đó nhập hình ảnh này trong thành phần của bạn (sử dụng đường dẫn tương đối của bạn). Giống như bên dưới-

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

    Và sau đó trong thành phần của bạn.

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

  2. Một cách khác là giữ hình ảnh trong thư mục công cộng và nhập chúng bằng đường dẫn tương đối. Để làm điều này, hãy tạo một thư mục hình ảnh trong thư mục công cộng và giữ hình ảnh của bạn trong đó. Và sau đó trong thành phần của bạn sử dụng nó như dưới đây.

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

    Cả hai phương pháp đều hoạt động nhưng cách thứ nhất được khuyến nghị vì cách sạch hơn và hình ảnh được xử lý bởi webpack trong thời gian xây dựng.


2
điều này đã giúp tôi :)
Raphael

Điều này sẽ không hoạt động, một dấu gạch chéo (/) được yêu cầu khi bắt đầu chỉ ra đường dẫn tương đối, như vậy: "/images/pitbull-mark.png"
Jeremy Rea

Bạn đã thử một trong những câu trả lời trong câu trả lời? Điều này cũng nên làm việc.
Mustkeem K

26

trong trường hợp của tôi sau đây mã làm việc quá.

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

1
Điều đó làm việc cho tôi. Điều này hoạt động trong trường hợp bạn KHÔNG muốn lưu trữ hình ảnh trong thư mục công cộng
Mr_LinDowsMac

13

Một số câu trả lời cũ hơn không hoạt động, những câu trả lời khác là tốt nhưng sẽ không giải thích chủ đề, tóm lại:

Nếu hình ảnh nằm trong thư mục 'công khai'

Thí dụ: \public\charts\a.png

Trong html:

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

Trong JavaScript:

Tạo hình ảnh sang img mới, động:

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

Đặt hình ảnh thành img hiện có với id là 'img1', tự động:

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

Nếu hình ảnh nằm trong thư mục 'src':

Thí dụ: \src\logo.svg

Trong JavaScript:

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

Trong jsx:

<img src={logo} /> 

3

Thêm npm trình tải tệp vào webpack.config.js theo hướng dẫn sử dụng chính thức của nó như sau:

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

đã làm cho tôi.


3

Nhập hình ảnh trong thành phần của bạn

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

Và gọi tên hình ảnh trên hình ảnh src = {RecentProjectImage_3} làm đối tượng

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

2

Một người bạn đã chỉ cho tôi cách làm điều này như sau:

"./" hoạt động khi tệp yêu cầu hình ảnh (ví dụ: "example.js") ở cùng cấp trong cấu trúc cây thư mục với thư mục "hình ảnh".


1

Đặt logo trong thư mục công cộng của bạn dưới ví dụ: public / img / logo.png và sau đó tham khảo thư mục công khai dưới dạng% PUBLIC_URL%:

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

Việc sử dụng% PUBLIC_URL% ở trên sẽ được thay thế bằng URL của publicthư mục trong quá trình xây dựng. Chỉ các tệp bên trongpublic thư mục có thể được tham chiếu từ HTML.

Không giống như "/img/logo.png" hoặc "logo.png", "% PUBLIC_URL% / img / logo.png" sẽ hoạt động chính xác cả với định tuyến phía máy khách và URL công cộng không root. Tìm hiểu cách định cấu hình URL công cộng không root bằng cách chạy npm run build.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.