Динамическая загрузка местоположения изображения из файла JSON - (Не удается найти модуль...) React, Next.js

Я пытаюсь динамически загрузить информацию из этого файла JSON и подключить ее к компоненту.

{
    "team": [
        {
            "id": "",
            "name": "",
            "role": "",
            "bio": "",
            "major": "",
            "image": "akh.jpg"
        },
       {
            "id": "",
            "name": "",
            "role": "",
            "bio": "",
            "major": "",
            "image": "chr.jpg"
        }
    ]
}

Расположение моего кода — /pages/about/index.js, а мой файл JSON — /pages/about/about.json.

То, как я разбираю код, выглядит так:

var data = require('./about.json')
var teams = data['team'];

<ul>
   {teams.map((person) => {
      var basePath = "/public/images/profiles/";
      var loc = require(basePath + person.image);
      return <ProfileCard key = {person.id} id = {person.id} name = {person.name} role = {person.role} major = {person.major} image = {loc} />
   })}
</ul>

Компонент находится в том же файле. Я прикрепляю только элемент img из профиля, так как остальные работают нормально.

<img className = "" src = {require(props.image)}></img>

Если я уберу элемент img или вставлю реальный путь, он отлично работает, но этот способ не работает. Единственный похожий пост, который я смог найти, был этот, но на него так и не ответили. StackOverflow: динамический импорт изображения (React Js) (требуется путь img, не удается найти модуль)

Обновленный код 1:

<ul>
  {teams.map((person) => {
    var basePath = "/public/images/profiles/";
    return <ProfileCard 
       key = {person.id} 
       id = {person.id} 
       name = {person.name} r
       role = {person.role} 
       major = {person.major} 
       image = {`${basePath}/${person.image}`} />
   })}
</ul>

И компонент теперь такой после удаления require().

<img src = {props.image}></img>

Обновленный код 2: Перешел на next/image с img и все работает! Пришлось убрать последний / и все заработало.

JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Раскрытие чувствительных данных
Раскрытие чувствительных данных
Все внешние компоненты, рассмотренные здесь до сих пор, взаимодействуют с клиентской стороной. Однако, если они подвергаются атаке, они не...
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Руководство ChatGPT по продаже мини JS-файлов
Руководство ChatGPT по продаже мини JS-файлов
JS-файл - это файл, содержащий код JavaScript. JavaScript - это язык программирования, который в основном используется для добавления интерактивности...
2
0
2 098
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В NextJS изображения обслуживаются из / (root), поэтому вам не нужно использовать public в своем пути или использовать require в этом отношении. Просто создайте стандартную строку. Это должно быть так же просто, как...

import aboutJson from './about.json'

const teams = aboutJson[teams]

const basePath = '/images/profiles/'

const Teams = () => (
   <ul>
      {teams.map((person) => <ProfileCard 
         key = {person.id} 
         id = {person.id} 
         name = {person.name} 
         role = {person.role} 
         major = {person.major} 
         image = {`${basePath}/${person.image}`} 
       />
   )}
   </ul>
)

const ProfileCard = ({ image, ...props }) => <img src = {image} />

Кроме того, next предоставляет свой собственный компонент изображения:

import Image from 'next/image'

const ProfileCard = ({ image, ...props }) => <Image src = {image} />

Это может быть признаком основной проблемы, потому что, когда я удаляю требование, изображения вообще не загружаются. Я получаю квадратный символ «изображение не найдено».

Akhil Sukhthankar 18.12.2020 20:56

Можете ли вы опубликовать свой обновленный код? Кроме того, я обновил свой пример, чтобы удалить public.

Jay Kariesch 18.12.2020 21:07

Также обновлен компонентом next/image.

Jay Kariesch 18.12.2020 21:09

Удалил /public и require() и обновил пост. Все еще не работает. Компонент next/image еще не пробовал, но выглядит многообещающе.

Akhil Sukhthankar 18.12.2020 21:20

Это сработало после того, как я удалил лишний / в конце basePath. Спасибо!

Akhil Sukhthankar 18.12.2020 21:29

Другие вопросы по теме