开发者问题收集

我点击电影时看不到其信息

2022-03-07
51

我希望在点击电影时查看电影信息,但它只显示热门电影的信息,而不是我通过输入搜索的电影的信息。换句话说,在 URL 中我看到我在电影中,但它什么也没显示。

我试了一整天,但什么都没用。

useHomeFetch.js

  const [movies, setMovies] = useState([]);
  const [searchMovie, setSearchMovie] = useState('');

  const getPopular = async () => {
    const res = await fetch(POPULAR);
    const data = await res.json();
    setMovies(data.results);
  };

  useEffect(() => {
    getPopular();
  }, []);

  const getSearch = async () => {
    const res = await fetch(SEARCH + searchMovie);
    const data = await res.json();

    if (data.results) {
      setMovies(data.results);
    } else {
      getPopular();
    }
  };

  useEffect(() => {
    getSearch(searchMovie);
  }, [searchMovie]);

  return { movies, searchMovie, setSearchMovie };
};

Home.js

  const mov = useHomeFetch();

  return (
    <div>
      <Search searchMovie={mov.searchMovie} setSearchMovie={mov.setSearchMovie}/>
      <div className="movie--container">
        {mov.movies.map((movie) => (
          <Link to={'/' + movie.id}>
            <div className="image-container" key={movie.id}>
              <img
                className="movie--poster"
                src={movie.poster_path === null ? NoImage : IMAGE + movie.poster_path}
                alt={movie.title}
              />
              <h3 className="title">{movie.title}</h3>
            </div>
          </Link>
        ))}
      </div>
    </div>
  );
};

export default Home;

MovieInfo.js

const MovieInfo = () => {
  const mov = useHomeFetch();
  const params = useParams();

  const infoMovie = mov.movies.find((movie) => movie.id === parseInt(params.movieId));

  let info= '';

  if (infoMovie) {
    info = infoMovie.overview;
  }

  return (
    <div>
      <h3>{info}</h3>
    </div>
  );
};

export default MovieInfo;
1个回答

从表面上看,问题与您的 MovieInfo.js 文件有关。您需要利用 useEffect 之类的钩子来处理数据,而不是在组件主体内部处理数据。每当发生任何变化时,这只会导致不必要的重新渲染。

您还需要包含一些在尝试查找电影时渲染的内容,因为它可能没有您想要的那么快。在我的示例中,我包含了一个加载字符串,您只有在找到电影后才能看到它。

import {useEffect, useState} from 'react';

const MovieInfo = () => {
  const mov = useHomeFetch();
  const params = useParams();
  const [info, setInfo] = useState()

  useEffect(() => {
    const infoMovie = mov.movies.find((movie) => movie.id === parseInt(params.movieId));
    if(infoMovie) {
      setInfo(infoMovie);
    }
  }, [mov, params.movieId])

  if(!info) {
    return 'Loading...';
  }

  return (
    <div>
      <h3>{info}</h3>
    </div>
  );
};

export default MovieInfo;

PS。我认为您可能将所有内容都放在 useHomeFetch 钩子中,从而使您的应用程序过于复杂,您应该再次查看 React 组件的生命周期如何工作,以便您只在需要时进行渲染。

Richard Hpa
2022-03-07