Правильний шлях для 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

Як можна вирішити цю проблему? Я хочу, щоб у будь-якій формі маршрутів, якими обробляється реактор-маршрутизатор, всі зображення могли відображатися однаковим шляхом.


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 - це те, що рекомендують документи-додатки create-react-app. Вони перераховують низку переваг над розміщенням ресурсів у публічному facebook.github.io/create-react-app/docs/…
Athir Nuaimi

@ user1322092 має рацію. Пам’ятайте, це /images/popcorn.pngі ні ./images/popcorn.png. Працював для мене з усіма маршрутами та іншим.
Нуман

335

У create-react-appвідносних доріжках зображення, здається, не працюють. Натомість ви можете імпортувати зображення:

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

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

15
що з динамічними зображеннями, наприклад, з посиланням у файлі json, у програмі create-react-app?
зок

2
@zok Я думаю, ви б експортували змінну з файлу JSON, імпортували змінну у ваш компонент. Тоді ви можете посилатися на це як завжди. наприклад, експортувати const my_src = змінний_тук, імпортувати {my_src} з my_file та src = {my_src}.
claireablani

1
import './styles/style.less'; **import logo from './styles/images/deadline.png';**Я отримую помилку в модулі 2-го рядка не знайдено, поки зображення існує і шлях правильний.
Хітендра

Цей метод також підтверджено в. Survival.js, якщо ви хочете ознайомитися з одним із основних методів автора веб-упаковки. Він також згадує, що ви можете використовувати babel-plugin-transform-react-jsx-img-import, щоб уникнути необхідності імпортувати зображення кожного разу, коли ви посилаєтесь на зображення.
Андре

2
Не це, він вирішує лише проблему із зображенням, але не вирішує питання про шлях. Відповідь Діми Гершмана - це фактичне рішення реакції для шляху будь-якого файлу img або іншого
Самі

130

Якщо для створення проекту ви використовували додаток create-react, тоді ваша загальнодоступна папка доступна. Тому вам потрібно додати свою imageпапку всередині загальнодоступної папки.

громадські / образи /

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


Я збирався задати питання, але ця відповідь вирішила моє питання !!! Слід позначити як відповідь. Дякую!!! +1
Si8

Це працювало для мене. Просто пам’ятайте, що вам потрібно перезапустити додаток, якщо ви додали нове зображення до загальнодоступного каталогу.
awasik

Це справді швидкий спосіб вирішити ситуації, але він буде працювати лише в тому випадку, якщо вам не потрібні відносні URL-адреси. Наприклад, якщо ви обслуговуєте свою програму в www.example.com/react-app, публічна папка буде відкрита на www.example.com, без react-app. Це може бути клопітно, тому прийнята відповідь є правильною. Джерела: додавання активів та використання загальнодоступної папки
Олександру Пірву,

44

З create-react-appє публічна папка (з index.html ...). Якщо ви розмістите там "myImage.png", скажімо, у підпапці img , тоді ви можете отримати доступ до них через:

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

4
Це слід позначити як правильну відповідь, оскільки це фактично рішення reactjs для всіх типів шляхів до будь-яких файлів
Самі

Я не розумію, чому ви вважаєте, що це правильна відповідь. Я просто спробував цю відповідь, і відповідь Клерблані, і відповідь Клер працювали, поки цього не було. Ця відповідь працює лише в тому випадку, якщо зображення знаходиться у загальнодоступній папці. Чи повинні мої зображення зберігатись у загальнодоступній папці? @Sami
Мадерас

Так, @Maderas спочатку - це ця відповідь така ж, як прийнята => просто видалення {} та базовий URL-адрес, ви можете використовувати просто src = '/ відносний шлях зображення' або src = 'абсолютний шлях зображення'. Що більше в цьому відповідь полягає в тому, що він вміщує змінний шлях для будь-якого зображення
Самі

Поки що працює для мене як шарм. Нічого іншого не зробив! І я спробував майже все. Дякую!
Марія Кемпбелл

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" />

    Обидва способи працюють, але перший рекомендується, оскільки його більш чистий спосіб і зображення обробляються веб-пакетом під час збирання.


2
це мені допомогло :)
Рафаель

Це не спрацює. На початку потрібно
Джеремі Реа

ви пробували те, що згадується у відповіді? Це теж має працювати.
Mustkeem K

26

і в моєму випадку працює наступний код.

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

1
Це працювало для мене. Це працює в тому випадку, якщо ви не хочете зберігати зображення в загальнодоступній папці
Mr_LinDowsMac

13

Деякі відповіді старшого віку не спрацюють, інші - це добре, але не пояснюють тему, підсумовуючи:

Якщо зображення знаходиться в каталозі "public"

Приклад: \public\charts\a.png

У HTML:

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

У JavaScript:

Створюйте зображення в новому зображенні, динамічно:

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} /> 

3

Додавання завантажувача файлів 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'

І назвіть ім'я зображення на зображенні 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папки під час збирання. З publicHTML можна посилатися лише на файли всередині папки.

На відміну від "/img/logo.png" або "logo.png", "% PUBLIC_URL% / img / logo.png" буде працювати правильно як з маршрутизацією на стороні клієнта, так і з некореневою публічною URL-адресою. Дізнайтеся, як налаштувати некореневу загальнодоступну URL-адресу, запустивши npm run build.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.