ошибка синтаксического анализа реакции внутри функционального компонента

#reactjs #typescript #parsing #map-function

Вопрос:

Я получаю ошибку разбора на {movies.Map()}. В нем говорится об ошибке разбора», » ожидается. Также было бы полезно, если бы кто-нибудь сказал мне, есть ли лучший способ назначить тип параметру обратного вызова фильма. То, что я вижу ниже, было предложено моей IDE.

 import {useState} from "react";
import {map} from "react-bootstrap/ElementChildren";
import PosterTag from "./PosterTag";

function MovieTag(genreId = 0, sortBy = "popularity.desc", page = 1) {
    const [movies, setMovies] = useState([]);
    const baseUrl = "https://api.themoviedb.org/3/discover/movie?api_key=My_Key"  
        "amp;language=en-USamp;sort_by=popularity.descamp;include_adult=falseamp;include_video=falseamp;page=1amp;with_watch_monetization_types=flatrate"
    if(genreId === 0) {
        fetch(baseUrl).then(response => {
            return response.json();
        }).then(data => {
            setMovies(data.results);
        });
    }
    return (
        {movies.map((movie: { id: any; poster_path: any; title: any; }) => {
            return (
                <PosterTag key={movie.id}
                           poster={movie.poster_path}
                           title={movie.title}
                />
            );
        })}
    );
}
export default MovieTag
 

Ответ №1:

В своем компоненте вы возвращаете массив элементов JSX. Компоненты React всегда должны возвращать один элемент JSX.

Вам нужно обернуть свои PosterTag элементы в a div или a React.Fragment , если вам не нужен какой-либо элемент-оболочка.

попробуйте это

 return (
  <React.Fragment>
    {movies.map((movie: { id: any; poster_path: any; title: any; }) => {
        return (
          <PosterTag 
            key={movie.id}
            poster={movie.poster_path}
            title={movie.title}
           />
        );
     })}
   </React.Fragment>
 );
 

Отвечая на ваш второй вопрос, вы можете создать интерфейс для Movie

 interface Movie {
  id: string;
  poster_path: any;
  title: any
}
 

а затем внутри обратного map вызова вы можете сделать это

 movies.map((movie: Movie) => { ... }
 

Комментарии:

1. Огромное спасибо