Компонент React не отображает данные из вызова API

Я работаю над проектом React, и у меня возникли проблемы с отображением данных, полученных из API, в моем компоненте «Фильмы». Данные правильно регистрируются в консоли, но не отображаются на странице. Мне нужна помощь, чтобы выяснить, почему.

Вот код моего вызова API:

import axios from 'axios';

const BASE_URL = 'http://127.0.0.1:5000';

export const getMovie = async (mood) => {
    try {
        console.info('Fetching movies for mood:', mood);
        const response = await axios.get(`${BASE_URL}/recomendar`, {
            params: { mood },
            headers: {
                Authorization: `Bearer ${localStorage.getItem('token')}`
            }
        });
        console.info(response.data);
        return response.data;
    } catch (error) {
        console.error('Error fetching movies:', error);
        throw error;
    }
};

А вот компонент Movies, где я пытаюсь отобразить данные в HTML:

import React, { useEffect, useState } from "react";
import { getMovie } from "../services/api";

const Movies = ({ mood }) => {
  const [movies, setMovies] = useState([]);

  useEffect(() => {
    const fetchMovies = async () => {
      if (mood) {
        try {
          const moviesData = await getMovie(mood);
          console.info(moviesData);  // This logs the data correctly
          setMovies(moviesData);
        } catch (error) {
          console.error("Error fetching movies:", error);
        }
      }
    };

    fetchMovies();
  }, [mood]);

  return (
    <div style = {{ padding: "128px" }}>
      <h3>Movies</h3>
      <ul>
        {movies.map((movie) => (
          <li key = {movie.id}>
            <div>{movie.title}</div>
            <div>{movie.genre}</div>
          </li>
        ))}
      </ul>
    </div>
  );
};

export default Movies;

Как поступают данные:

В HTML тег ul пуст.

Я получаю mood при выборе пользователя через Onclick в главном компоненте.

import { Link } from "react-router-dom";

import Section from "./Section";
import Button from "./Button";
import curve from "../assets/curve.png";
import { moods } from "../constants/mood";
import { getMovie } from "../services/api";
import { useState } from "react";

export const Main = () => {


  const [movies, setMovies] = useState([]);

  const handleMoodSelect = async (mood) => {
    try {
      const moviesData = await getMovie(mood);
      setMovies(moviesData);
    } catch (error) {
      console.error('Error fetching movies:', error);
    }
  };

  return (
    <Section className = "pt-[12rem] -mt-[5.25rem] mb-8" customPaddings id = "main">
      <div className = "container relative">
        <div className = "relative z-1 max-w-[62rem] mx-auto text-center mb-[3.875rem] md:mb-20 lg:mb-[6.25rem]">
          <h1 className = "h1 mb-6">
            Descubra filmes incríveis com base no seu{" "}
            <span className = "inline-block relative h1">
              humor
              <img
                src = {curve}
                className = "absolute top-full left-0 w-full xl:-mt-2"
                width = {624}
                height = {28}
                alt = "Curva"
              />
            </span>
          </h1>
          <span className = "inline-block relative h1">
            <img
              src = {curve}
              className = "absolute top-full left-0 w-full xl:-mt-2"
              width = {624}
              height = {28}
              alt = "Curva"
            />
          </span>
          <p className = "body-1 max-w-3xl mx-auto mb-6 text-n-2 lg:mb-8">
            A pergunta é: Como você está se sentindo hoje?
          </p>
          <Button white>Começar agora</Button>
        </div>

        <div className = "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-x-4 gap-y-4">
          {moods.map((mood) => (
            <button onClick = {() => handleMoodSelect(mood.title)}>
            <Link to = {`/movies/${mood.title}`}>
              <div className = "mb-2 p-4 rounded-lg relative">
                <div
                  className = "absolute inset-0 cursor-pointer"
                  style = {{
                    borderRadius: "5px",
                    padding: "2px",
                    background:
                      "linear-gradient(225deg, #FFC876, #79FFF7, #9F53FF, #FF98E2, #FFC876)",
                    WebkitMask:
                      "linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)",
                    WebkitMaskComposite: "xor",
                    maskComposite: "exclude",
                    position: "absolute",
                    content: '""',
                    inset: 0,
                  }}
                />
                {mood.title} {mood.emoji}
              </div>
            </Link>
          </button>
          ))}
        </div>
      </div>
    </Section>
  );
};

Мы не можем видеть возвращаемые данные, поэтому нет другого способа сделать что-либо, кроме как гадать. Соответствуют ли данные вашему коду?

Dave Newton 29.05.2024 13:27

Как выглядят данные? Код кажется правильным.

shindeshubhamm 29.05.2024 13:30

@shindeshubhamm Я обновил код, чтобы вы могли видеть, как выглядят данные

olamundo97 29.05.2024 13:43

@olamundo97, есть ли шанс, что твоя проблема в CSS? Вы проверили элементы инструментов разработчика, чтобы увидеть, есть ли список?

Petros 29.05.2024 13:49

@Petros Я видел там, и тег ul пуст. Я добавил фото, вы видите в посте

olamundo97 29.05.2024 13:53

@olamundo97 @olamundo97 разве не должно быть два журнала консоли? один из функции getMovie, а другой из useEffect?

shindeshubhamm 29.05.2024 14:04

@shindeshubhamm да, ты прав. На консоли это не console.info. Возможно, это намек на то, в чем может быть проблема...

olamundo97 29.05.2024 14:09

@olamundo97 элемент h3 не содержит слова Movies. Я знаю, что это немного отдаленно, но есть ли шанс, что вы отображаете не тот компонент?

Petros 29.05.2024 14:13

@olamundo97 проблема может быть в том, что эффект заканчивается до полного выполнения fetchMovies. Раз уж вы не ждали fetchMovies.

shindeshubhamm 29.05.2024 14:17

@shindeshubhamm, такого не должно быть! Нет необходимости ждать fetchMovies, поскольку после вызова происходит setState и ничего больше. Также мы можем увидеть console.info, так что...

Petros 29.05.2024 14:21

@Петрос, я понял, что если я перезагрузлю страницу, API больше не будет вызываться. Например, больше не показывать в console.info. Может быть, проблема в этом?

olamundo97 29.05.2024 14:23

Можем ли мы увидеть родительский компонент? Тот, который визуализирует Movies и передает реквизит mood?

Petros 29.05.2024 14:25

@Петрос, я обновлю пост, чтобы показать тебе. По сути, я получаю настроение от выбора пользователя через Onclick в основном компоненте.

olamundo97 29.05.2024 14:29

@olamundo97 Я в замешательстве! Был ли компонент Movies примером, демонстрирующим вашу проблему? Или это реальный компонент вашей кодовой базы? Ваш компонент Main не отображает компонент «Фильмы».

Petros 29.05.2024 14:38

@Petros Movies в моем реальном компоненте. В Главном компоненте есть настройки настроения, чтобы система могла подобрать фильм по настроению человека. Таким образом, компонент «Кино» отвечает за загрузку определенного фильма в зависимости от настроения, выбранного пользователем в основном компоненте.

olamundo97 29.05.2024 14:43

Давайте продолжим обсуждение в чате.

Petros 29.05.2024 14:49
Поведение ключевого слова "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
16
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Проблема заключалась в том, что компонент Movies использовался в качестве страницы, отображаемой маршрутизатором. mood был параметром маршрута, поэтому код был изменен на:

import { useParams } from 'react-router-dom';


const Movies = () => {
    const { mood } = useParams();

    const [movies, setMovies] = useState([]);

    useEffect(() => {
        const fetchMovies = async () => {
            if (mood) {
                try {
                    const moviesData = await getMovie(mood);
                    console.info(moviesData);  // This logs the data correctly
                    setMovies(moviesData);
                } catch (error) {
                    console.error("Error fetching movies:", error);
                }
            }
        };

        fetchMovies();
    }, []);

    return (
        <div style = {{ padding: "128px" }}>
            <h3>Movies</h3>
            <ul>
                {movies.map((movie) => (
                    <li key = {movie.id}>
                        <div>{movie.title}</div>
                        <div>{movie.genre}</div>
                    </li>
                ))}
            </ul>
        </div>
    );
};

export default Movies;

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