Я работаю над проектом 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>
);
};
Как выглядят данные? Код кажется правильным.
@shindeshubhamm Я обновил код, чтобы вы могли видеть, как выглядят данные
@olamundo97, есть ли шанс, что твоя проблема в CSS? Вы проверили элементы инструментов разработчика, чтобы увидеть, есть ли список?
@Petros Я видел там, и тег ul пуст. Я добавил фото, вы видите в посте
@olamundo97 @olamundo97 разве не должно быть два журнала консоли? один из функции getMovie, а другой из useEffect?
@shindeshubhamm да, ты прав. На консоли это не console.info. Возможно, это намек на то, в чем может быть проблема...
@olamundo97 элемент h3 не содержит слова Movies. Я знаю, что это немного отдаленно, но есть ли шанс, что вы отображаете не тот компонент?
@olamundo97 проблема может быть в том, что эффект заканчивается до полного выполнения fetchMovies. Раз уж вы не ждали fetchMovies.
@shindeshubhamm, такого не должно быть! Нет необходимости ждать fetchMovies, поскольку после вызова происходит setState и ничего больше. Также мы можем увидеть console.info, так что...
@Петрос, я понял, что если я перезагрузлю страницу, API больше не будет вызываться. Например, больше не показывать в console.info. Может быть, проблема в этом?
Можем ли мы увидеть родительский компонент? Тот, который визуализирует Movies и передает реквизит mood?
@Петрос, я обновлю пост, чтобы показать тебе. По сути, я получаю настроение от выбора пользователя через Onclick в основном компоненте.
@olamundo97 Я в замешательстве! Был ли компонент Movies примером, демонстрирующим вашу проблему? Или это реальный компонент вашей кодовой базы? Ваш компонент Main не отображает компонент «Фильмы».
@Petros Movies в моем реальном компоненте. В Главном компоненте есть настройки настроения, чтобы система могла подобрать фильм по настроению человека. Таким образом, компонент «Кино» отвечает за загрузку определенного фильма в зависимости от настроения, выбранного пользователем в основном компоненте.
Давайте продолжим обсуждение в чате.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проблема заключалась в том, что компонент 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;
Мы не можем видеть возвращаемые данные, поэтому нет другого способа сделать что-либо, кроме как гадать. Соответствуют ли данные вашему коду?