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