Реакция: «.map не является функцией»

Я создаю свое первое приложение React, используя Java Spring в качестве серверной части. Я столкнулся с проблемой при попытке получить данные из API и отобразить их в js. Это выдает мне ошибку fireteam.map is not a function. Вот код проблемы:

import React, { useEffect, useState } from "react";

const FireTeam = () =>{
  const [fireteam, setFireTeam] = useState([]);

  useEffect(() => {
    fetch(`http://localhost:8080/fireteam/id/${localStorage.getItem("fireteamId")}`)
      .then(response => response.json())
      .then(data => {setFireTeam(data)})
  });

  return (
    <div>
      <div>
        {fireteam.map(fteam =>
          <div key = {fteam.id}>
            <p>{fteam.name}</p>
          </div>
        )}
      </div>
    </div>
  )
}
export default FireTeam

использование console.info в конце запроса на выборку для проверки данных дало мне правильные данные:

{id: 3, name: 'Intercessors', description: 'fdgdfsggfsd', killTeamId: 1}

Так что проблема не в том, как я построил свой запрос на выборку. Я думал, что это может сводиться к проблемам с синхронизацией между fetch() и Javascript, пытающимися сопоставить данные до того, как данные были установлены, поэтому я попытался поместить запрос выборки в функцию async/await и вызвать его в блоке UseEffect, но проблема не устранена.

Как отметил в своем ответе Арно Флеш, data из вашего API не является массивом, поэтому у него нет .map()

Martin 30.06.2024 14:20

Привет. Добро пожаловать в СО. карта — это метод массива — он позволяет перебирать массив и возвращать другой массив с таким же количеством (измененных) элементов? Возможно, вы видели это в уроке по React и пытались реализовать, не понимая основ JavaScript map, а также того, почему и где это можно использовать?

Andy 30.06.2024 14:22

Привет большое спасибо. Я видел это в учебнике по React, и мне пока не очень нравятся собственные методы Javascript. Мне просто нужно руководство, поэтому я пришел сюда.

Gazes 30.06.2024 14:27
Поведение ключевого слова "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) для оценки ваших знаний,...
0
3
78
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Ваши данные — это не массив, а объект, поэтому использование карты() не сработает. Map() — это функция, которая существует только для массивов, как и filter(), уменьшить(), forEeach() и т. д. Вот почему у вас возникает ошибка «не является функцией».

Вам нужно либо убедиться, что API отправляет массив, например:

[{id: 3, name: 'Intercessors', description: 'fdgdfsggfsd', killTeamId: 1}]

Или, если вы уверены, что у вас всегда будет только объект, выполните:

setFireTeam([data])

В качестве альтернативы, если они ожидают, что fireteam всегда будет одним объектом, они могут удалить массив/отображение из своего кода.

Nick Parsons 30.06.2024 14:21

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

Arnaud Flaesch 30.06.2024 14:24

Огромное спасибо, Арно! Установка данных в виде массива исправила абсолютно все, в конце концов это действительно была проблема типа объекта/массива.

Gazes 30.06.2024 14:31

Ваш пример console.info не является массивом. Но функция карты используется для манипуляций с массивами. Чтобы исправить это, вы можете убедиться, что данные получены как fireteam — это массив.

Следующий код сделает это.

import React, { useEffect, useState } from "react";

const FireTeam = () => {
  const [fireteam, setFireTeam] = useState([]);

  useEffect(() => {
    const fetchData = async () => {
      const response = await fetch(`http://localhost:8080/fireteam/id/${localStorage.getItem("fireteamId")}`);
      const data = await response.json();
      setFireTeam([data]);
    };

    fetchData();
  }, []);

  return (
    <div>
      <div>
        {fireteam.map(fteam =>
          <div key = {fteam.id}>
            <p>{fteam.name}</p>
          </div>
        )}
      </div>
    </div>
  );
}

export default FireTeam; 

если вы не хотите менять тип данных на массив, вы можете сделать что-то вроде этого

return (
    <div>
      <div>
        {Object.entries(fireteam).map(fteam =>
          <div key = {fteam.id}>
            <p>{fteam.name}</p>
          </div>
         )}
    </div>
  </div>
)

вы можете прочитать больше здесь, как это работает

Я не против изменить тип данных, но это полезные знания, спасибо.

Gazes 30.06.2024 14:53

К вашему сведению, Object.entries возвращает массив кортежей ключ-значение (например, [ключ, значение]) свойств одного объекта, поэтому fteam.id и fteam.name оба будут неопределенными. Я не думаю, что ОП хочет сопоставить свойства одного fireteam объекта. Этот код не будет работать так, как вы ожидаете.

Drew Reese 03.07.2024 09:15

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