[React] useNavigate로 state 넘기기

demie·2024년 5월 10일
0

리액트

목록 보기
2/3

검색 결과 클릭하면 상세페이지로 넘어가는게 아무리 해도 안되더라....
근데 방금 어이없게 됨...

일단 이 블로그 참고했고
https://velog.io/@gin2808/React-useNavigate%EB%A1%9C-state-%EB%84%98%EA%B8%B0%EA%B8%B0

function Main() {
  const [query, setQuery] = useState("");
  const [movies, setMovies] = useState([]);
  const [filtered, setFiltered] = useState([]);
  const [isMouseOver, setIsMouseOver] = useState(false);

  const movie_url = "https://image.tmdb.org/t/p/w300";

  const options = {
    method: 'GET',
    url: 'https://api.themoviedb.org/3/search/movie',
    params: {include_adult: 'false', language: 'ko-KR', page: '1', query: query},
    headers: {
      accept: 'application/json',
      Authorization: 'Bearer eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiI1NmVhODk1ZWJhNDE2Yjc2YTk4MTZkOWQ1Nzc0ZDBjZSIsInN1YiI6IjY2MWU5YWI4NmQ5ZmU4MDE3ZDYwNmM5OSIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.TrsJisYxDoxOwAfg5jjHOj-3mvInGe-rqKtkM4xlQvA'
    }
  };

  useEffect(() => {
    const delayDebounceTimer = setTimeout(() => {
      axios
      .request(options)
      .then(function (response) {
        setMovies(response.data.results);
      })
      .catch(function (error) {
        console.error(error);
      });
    }, 1000);
    return () => clearTimeout(delayDebounceTimer);
  }, [query])

  const searchItems = (e) => {
    setQuery(e.target.value);
    const filteredData = movies.filter((movie) => {
      // return movie.title.includes(query);
      return movie.title.toLowerCase().includes(query.toLowerCase());
    })
    setFiltered(filteredData)
  }

  const navigate = useNavigate();

  // function handleClick() {
  //   navigate(`/movie/${id}`, {state: {id, poster_path, title, vote_average, overview, release_date}});
  // }

  return (
    <MainComponent>
      <div className="main">
        <div className="movie">
          {/* <BiSolidCameraMovie size="50"color="#FF748C"/> */}
          <h1>📽️Find your movies !</h1>
        </div>
        <div className="search">
          <input type="text"
            value={query} 
            onChange={searchItems}/>
          <button><FaSearch size="40" color="#FFC0CB"/></button>
        </div>

        <div className="search_component">
          {filtered.map((item) => {
            return (
              <div className="search_movie" 
                key={item.id}
                onMouseEnter={() => setIsMouseOver(true)}
                onMouseLeave={() => setIsMouseOver(false)}
                onClick={() => navigate(`/movie/${item.id}`, {state: {...item}})}
              >
                <img src={`${movie_url}${item.poster_path}`} alt="이미지" />
                <div className="search_info">
                  <p>{item.title}</p>
                  <span>⭐{item.vote_average}</span>
                </div>
                {isMouseOver && (
                  <div className="hover_movie">
                  <p>{item.title}</p>
                  <p>{item.overview}</p>
                </div>
                )}
              </div>
            )
          })}
        </div>
      </div>
    </MainComponent>
  );
}

function MainPage() {
  return(
      <div className="wrapper">
        <Banner />
        <Main />
      </div>
  );
}

export default MainPage;

Movie.jsx에서는 // 해놓은 것 처럼 이벤트 리스너 만들어서 썼는데 id 값을 모르니까 map 함수 안에서 써야 했다.
처음엔 ...filtered로 했는데 오류나서 그냥 item으로 했더니 그래도 오류.. 근데 ...item하니까 갑자기 됨.... 하하하

0개의 댓글