<현재상황>
- TMDB api 를 통해 데이터를 받아서
- 메인화면에 띄워주고
- 메인화면에 보여지는 영화데이터 리스트를 영화제목을 통한 검색을 할 수 있게 함
- 메인화면에 나열되어 있는 영화 카드를 선택하면, 해당 영화의 id값을 받은 각각의 상세 페이지로 이동함
<나의 task>
- api id값에 따라 데이터 화면에 보여주기 (=> 클릭한 영화의 상세 정보를 화면에 보여주기)
오늘은 이걸 해결했다.
클릭한 영화의 상세 정보를 화면에 보여주기
내가 처음에 구상했던 로직
1. 처음에 받아온 api 데이터를 다시 가져오기
2. 선택된 영화아이디를 포함한 api 데이터(=movie-detail 배열) 내 요소(객체)를 추출한핟.
3. 객체의 값을 return 한다.
에서 좀 더 디벨롭하여
1. 상세페이지 주소 값에서 parameter 추출
2. movie-detail 배열에서 ${movie.id}, 즉 선택한 영화의 id 값을 가진 요소(객체) 찾고, 반환하기
3. 반환된 객체의 필요한 요소들에게 변수 정의를 해준다음, detailCardList(상세페이지 내 상세정보를 넣어줄 영역).innerHTML로 문자열로 내용을 변수들과 함께 넣어준다.
문제
1. 상세페이지 주소값에서 parameter을 추출 시 에러
2. 객체구조분해 할당을 통해서 클릭된 영화묶음 객체 출력 에러
해결방안
1. 상세페이지 주소는 상세페이지html에 아까 넣었던 주소와는 달리, 웹브라우저에서 쓰는 주소를 넣어야 한다. 따라서 현재 페이지 url 주소를 받아오는 아래 코드를 사용한다.
const url = window.location.href;
2. 객체구조분해 할당을 할 때, 배열 안에 id라는 요소를 가지고 오고 싶다면, 'id' 문자열이 아닌 id 로 인자를 받아야 한다.
const foundClickedMovie = movie_details.find(({id}) => id == idOnAddress); // 객체구조분해 할당
console.log(foundClickedMovie); // 클릭된 영화묶음 객체
나머지 코드
clicked_movie_show.js
// TMDB Movies Detail API
// https://developer.themoviedb.org/reference/movie-details
import {fetchMovieData} from "../feat_js/movieShow.js";
import {generateMovieCards} from "../feat_js/movieShow.js";
// -------------- 기존 API 다시 불러오기 ---------------- //
export const generateMovieDetailCards = async () => {
const movie_details = await fetchMovieData();
const detailCardList = document.querySelector("#detail_card_list");
const url = window.location.href;
// console.log(url);
const searchParams = new URL(url).searchParams;
const idOnAddress = searchParams.get('id');
console.log("결과: " + idOnAddress); // ${movie.id} 에 해당하는 number
const foundClickedMovie = movie_details.find(({id}) => id == idOnAddress); // 객체구조분해 할당
console.log(foundClickedMovie); // 클릭된 영화묶음 객체
const clickedMovieId = foundClickedMovie.id;
const clikedPoster = foundClickedMovie.poster_path;
const clickedTitle = foundClickedMovie.title;
const clickedOverview = foundClickedMovie.overview;
const clickedReview = foundClickedMovie.vote_average;
// console.log(clickedMovieId);
detailCardList.innerHTML =
`<div id=${clickedMovieId}>
<img src="https://image.tmdb.org/t/p/w500${clikedPoster}"/>
<h3>${clickedTitle}</h3>
<p>${clickedOverview}</p>
<p>${clickedReview}</p>
</div>`
;
};
main_detail_page.js
import {generateMovieDetailCards} from "../feat_js/clicked_movie_show.js"
generateMovieDetailCards();
movie_detail_page.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>FindMovie/movie/detail</title>
<!--CSS 연결-->
<link rel="stylesheet" href="./CSS/reset.css">
<link rel="stylesheet" href="./CSS/css.css">
<!-- JavaScript 연결 -->
<script type="module" src="./modules/main_js/main_detail_page.js"></script>
</head>
<body>
<header>
<h1>Movie Detail123</h1>
</header>
<main>
<ul id="detail_card_list">
</ul>
</main>
</body>
</html>
Element.innerHTML
Array.prototype.find()
URL Parameter
'부트캠프 개발일지 2023-2024 > Bootcamp 생활기록' 카테고리의 다른 글
[5주차] 개발공부 중 멘탈이 무너질 때, 스스로에게 해야 하는 말 (0) | 2023.11.05 |
---|---|
[5주차] KPT : JS 그룹프로젝트 회고 (1) | 2023.10.30 |
[4주차] 메인페이지에서 상세페이지로 이동하기 (0) | 2023.10.26 |
[4주차] 보충반 특강1 : 함수, 반복문(for, forEach), 배열메소드(map, filter, find) (0) | 2023.10.25 |
[4주차] html parsing, DOM tree, form-input 태그, cmd 함수로 바로가기 (0) | 2023.10.23 |