Функция React map возвращает одно и то же изображение при отображении случайно сгенерированного URL-адреса изображения

Я сопоставляю простой массив данных членов команды. URL-адрес изображения в данных представляет собой случайно сгенерированное изображение кошки. Моя проблема в том, что когда я сопоставляю массив членов команды, изображение всех членов одинаково. Каждый раз, когда я обновляю, они все меняются на другое изображение, но не на разные для каждого участника.

Остальные данные работают нормально. Как я могу решить эту проблему?

Пример данных:

[
  {
    "name": "Jessika",
    "role": "Interaction Design",
    "location": "berlin",
    "image": "https://loremflickr.com/640/480/cat",
    "tags": [
      "salmon",
      "red"
    ]
  },
  {
    "name": "Kyra",
    "role": "Project Manager",
    "location": "amsterdam",
    "image": "https://loremflickr.com/640/480/cat",
    "tags": [
      "white",
      "gold"
    ]
  },

Мой код:

        <div className = "grid-item">
          {response && (
            <div className = "card">
              {response.map((member: any) => {
                return (
                  <div key = {member.name} className = "card__container">
                    <div className = "card-image">
                      <img src = {member.image} alt = "Team member" />
                    </div>
                    <div className = "card-content">
                      <p>{member.name}</p>
                    </div>
                  </div>
                );
              })}
            </div>
          )}
        </div>

Я попытался сопоставить свой ответ и отобразить данные в моем jsx. Он отлично работает, но изображение не дает уникального изображения для каждого члена команды.

const { useState } = React;

const Example = () => {
    const response = [
        {
            name: "Jessika",
            role: "Interaction Design",
            location: "berlin",
            image: "https://loremflickr.com/640/480/cat",
            tags: ["salmon", "red"],
        },
        {
            name: "Kyra",
            role: "Project Manager",
            location: "amsterdam",
            image: "https://loremflickr.com/640/480/cat",
            tags: ["white", "gold"],
        },
    ];

    return (
        <div className = "grid-item">
            {response && (
                <div className = "card">
                    {response.map((member/*: any*/) => {
                        return (
                            <div key = {member.name} className = "card__container">
                                <div className = "card-image">
                                    <img src = {member.image} alt = "Team member" />
                                </div>
                                <div className = "card-content">
                                    <p>{member.name}</p>
                                </div>
                            </div>
                        );
                    })}
                </div>
            )}
        </div>
    );
};

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<Example />);
<div id = "root"></div>

<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/18.1.0/umd/react.development.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.1.0/umd/react-dom.development.js"></script>

Используйте реальные изображения, если вам нужны четкие результаты, а не генератор случайных изображений.

Spikatrix 24.11.2022 11:39

@Spikatrix Я понимаю, но это конечная точка, которую мне дали для задания.

Mees Goudbeek 24.11.2022 11:47

В задании говорится, что все изображения должны быть уникальными?

Spikatrix 24.11.2022 11:49

@Spikatrix Нет, но мне это не понравилось, и должно было быть решение :)

Mees Goudbeek 24.11.2022 11:50

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

Spikatrix 24.11.2022 11:52

@MeesGoudbeek - Если это для задания, и они дали вам этот URL-адрес, вы можете использовать разные URL-адреса с одного и того же сервера и включить в код примечание, объясняющее, почему (вместо того, чтобы делать то, что в моем ответе, что добавляет ненужные сложности в код, если вам на самом деле не нужны одинаковые URL-адреса). Нравится https://loremflickr.com/640/480/cat, https://loremflickr.com/640/480/dog, https://loremflickr.com/640/480/giraffe...

T.J. Crowder 24.11.2022 11:54

@MeesGoudbeek - Или даже просто жестко закодированные https://loremflickr.com/640/480/cat?1, https://loremflickr.com/640/480/cat?2, https://loremflickr.com/640/480/cat?3 и т. д., опять же с примечанием, почему.

T.J. Crowder 24.11.2022 11:56

Спасибо вам обоим за отзыв! Посмотрю еще раз и посмотрю, какой подход лучше. Я обязательно добавлю примечание, объясняющее выбор, который я сделал.

Mees Goudbeek 24.11.2022 12:32
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
8
142
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Поскольку URL-адреса одинаковы, браузер может повторно использовать предыдущий ответ, когда два запроса выполняются почти в одно и то же время. Чтобы предотвратить это, добавьте строку запроса, чтобы сделать их уникальными, чтобы браузер не использовал ответ повторно:

<img src = {member.image + "?" + member.name} alt = "Team member" />

const { useState } = React;

const Example = () => {
    const response = [
        {
            name: "Jessika",
            role: "Interaction Design",
            location: "berlin",
            image: "https://loremflickr.com/640/480/cat",
            tags: ["salmon", "red"],
        },
        {
            name: "Kyra",
            role: "Project Manager",
            location: "amsterdam",
            image: "https://loremflickr.com/640/480/cat",
            tags: ["white", "gold"],
        },
    ];

    return (
        <div className = "grid-item">
            {response && (
                <div className = "card">
                    {response.map((member/*: any*/) => {
                        return (
                            <div key = {member.name} className = "card__container">
                                <div className = "card-image">
                                    <img src = {member.image + "?" + member.name} alt = "Team member" />
                                </div>
                                <div className = "card-content">
                                    <p>{member.name}</p>
                                </div>
                            </div>
                        );
                    })}
                </div>
            )}
        </div>
    );
};

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<Example />);
<div id = "root"></div>

<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/18.1.0/umd/react.development.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.1.0/umd/react-dom.development.js"></script>

Я использовал там имя члена, но отправка этой информации на сервер изображений может оказаться неуместной. Это просто должно быть что-то уникальное для этого участника и, в идеале, не меняющееся со временем (в идеале, не случайное число, хотя, если изображение всегда предназначено для повторной загрузки, это будет нормально).

Или, возможно, индекс члена (поскольку это не ключ React):

{response.map((member/*: any*/, index/*: number*/) => {
    return (
        <div key = {member.name} className = "card__container">
            <div className = "card-image">
                <img src = {member.image + "?" + index} alt = "Team member" />
            </div>
            <div className = "card-content">
                <p>{member.name}</p>
            </div>
        </div>
    );
})}

const { useState } = React;

const Example = () => {
    const response = [
        {
            name: "Jessika",
            role: "Interaction Design",
            location: "berlin",
            image: "https://loremflickr.com/640/480/cat",
            tags: ["salmon", "red"],
        },
        {
            name: "Kyra",
            role: "Project Manager",
            location: "amsterdam",
            image: "https://loremflickr.com/640/480/cat",
            tags: ["white", "gold"],
        },
    ];

    return (
        <div className = "grid-item">
            {response && (
                <div className = "card">
                    {response.map((member/*: any*/, index/*: number*/) => {
                        return (
                            <div key = {member.name} className = "card__container">
                                <div className = "card-image">
                                    <img src = {member.image + "?" + index} alt = "Team member" />
                                </div>
                                <div className = "card-content">
                                    <p>{member.name}</p>
                                </div>
                            </div>
                        );
                    })}
                </div>
            )}
        </div>
    );
};

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<Example />);
<div id = "root"></div>

<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/18.1.0/umd/react.development.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.1.0/umd/react-dom.development.js"></script>

Если URL-адрес изображения может уже иметь строку запроса, вам понадобится & вместо ?. Вы можете сделать:

function appendUrlPart(url, part) {
    const delim = url.includes("?") ? "&" : "?";
    return url + delim + encodeURIComponent(part);
}

...тогда src = {appendUrlPart(member.image, index)}.


В комментарии вы сказали, что это для задания, и URL-адрес указан как часть задания. Если задание не предназначено для того, чтобы заставить вас решить эту самую проблему (то есть, если вы думаете, что инструктор просто выбросил URL-адрес, не приняв во внимание эту возможную проблему), вы можете просто использовать другие URL-адреса с этого сервера в данных «ответ», вместо добавления кода выше. Приведенный выше код решает проблему, но если это не настоящая проблема, вам не нужен лишний код в вашем решении. Возможно, просто используйте https://loremflickr.com/640/480/cat, https://loremflickr.com/640/480/dog, https://loremflickr.com/640/480/giraffe и т. д.; или даже просто https://loremflickr.com/640/480/cat?1, https://loremflickr.com/640/480/cat?2, https://loremflickr.com/640/480/cat?3 и т. д. Вместе с комментарием, объясняющим, почему вы это сделали.

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