티스토리 뷰
내가 작성한 코드와 팀원이 작성한 코드 합치기
< 팀원이 작성한 코드 sub.js >
const urlParams = new URLSearchParams(window.location.search);
const itemId = urlParams.get("id");
console.log("Item ID:", itemId);
const API_KEY = "api_key=2f7ff395e001967bcd029e4d663de74c";
const BASE_URL = "https://api.themoviedb.org/3/movie/";
const FULL_URL = `${BASE_URL + itemId}?language=en-US&${API_KEY}`;
const fetchMovieDetails = () => {
fetch(FULL_URL)
.then((response) => response.json())
.then((movie) => showMovieDetails(movie))
.catch((err) => console.error(err));
};
fetchMovieDetails();
const showMovieDetails = (movie) => {
console.log(movie);
const chosenMoviePage = document.getElementById("chosen-movie-page");
const IMG_URL = "https://image.tmdb.org/t/p/w500";
chosenMoviePage.innerHTML = `
<article id="movie-article">
<section id="poster-section">
<img src=${IMG_URL + movie.poster_path} />
</section>
<section id="info-section">
<h1>${movie.title}</h1>
<p class="releas-date">${movie.release_date}</p>
<p class="vote-star">
<img src="../assets/main/star.svg" />
${Math.ceil((movie.vote_average / 2) * 10) / 10}
</p>
<div class="details-box">
<div class="film-box">
<img class="film-bar" src="../assets/main/film_bar_gray.png">
<img class="back-porster" src=${IMG_URL + movie.backdrop_path} />
<img class="film-bar" src="../assets/main/film_bar_gray.png">
</div>
<div class="info-box">
<p class="tag-line">"${movie.tagline}"</p>
<p class="plot">${movie.overview}</p>
<a class="homepage-btn" href="${movie.homepage}" target="_blank">
<img src="../assets/main/logo_arrow.png"/>
</a>
</div>
</div>
<div id="review-box">
</div>
</section>
</article>
`;
updateReviewList(movie.id);
};
< 팀원 코드에 합쳐야 하는 나의 코드 statelist.js >
function updateReviewList() {
const reviewList = document.getElementById("reviewlist");
const reviews = JSON.parse(localStorage.getItem("reviews")) || [];
const reviewListUl = reviewList.querySelector("ul");
reviewListUl.innerHTML = "";
reviews.forEach((review) => {
const li = document.createElement("li");
li.innerHTML = `
<em>${review.stars}</em>
<br>
<br>
<em>${review.name}</em> <em>${review.impressions}</em>
<br>
<br>
<em>${review.aspects}</em> <em>${review.emotions}</em> <em> ${review.date}</em>
`;
reviewListUl.appendChild(li);
});
}
document.addEventListener("DOMContentLoaded", updateReviewList);
우선 상기 코드는 작성된 리뷰를 localstorage에서 리스트로 보여주는 부분이다.
위 코드를 전달하기 위해 import를 사용해 전달하고자 했다.
<그래서 수정된 나의 코드 statelist.js >
export default function updateReviewList(value) {
const reviewList = document.getElementById("reviewlist");
const reviews = JSON.parse(localStorage.getItem("reviews")) || [];
const reviewListUl = reviewList.querySelector("ul");
reviewListUl.innerHTML = "";
reviews.forEach((review) => {
console.log("1");
console.log(value);
console.log(review.id);
if (Number(review.id) === value) {
const li = document.createElement("li");
li.innerHTML = `
<em>${review.stars}</em>
<br>
<br>
<em>${review.name}</em> <em>${review.impressions}</em>
<br>
<br>
<em>${review.aspects}</em> <em>${review.emotions}</em> <em> ${review.date}</em>
`;
reviewListUl.appendChild(li);
}
});
}
❗ ❗ import로 전달한 이유
⬇️내가 작성한 코드의 역할
우선 영화의 상세페이지에 구현될 리뷰리스트이기 때문에
각각의 영화 아이템이 가지고 있는 id로 상세페이지가 열리면
동일한 id를 가지고 있는 리뷰만 화면에 띄워줘야 한다.
그러기 위해서는 상세페이지에서 urlParams로 받아오는 id와
작성된 리뷰에서 함께 저장한 id 값을 비교해야한다.
localstorage 에서 가져오는 reviews에는 movie ID가 저정될 수 있도록 했다.
그리고 urlParams로 받아오는 id를 가져와야 하는데
addEventListener를 사용해서 urlParams로 받는 id를 가져올 수 없었다.
**addEventListener
=이벤트가 발생하면 미리 등록해둔 이벤트 발생시켜 준다.
** DOMContentLoaded
=돔트리가 완성되었을때 해당 함수를 자동으로 불러주는 event
즉, DOMContentLoaded 이벤트가 발생되면 addEventListener가 지정된 함수를 실행해 준다.
그래서 해당 코드를 export해서 인자로 urlParams로 받는 id의 값을 받아야 한다.
그런데 여기서 당황했다.
reviews.forEach((review) => {
console.log("1");
console.log(value);
console.log(review.id);
if (review.id === value) {
const li = document.createElement("li");
원래 처음에는 위에 값처럼 작성했다.
분명 콘솔을 찍을때는 값을 value와 review.id 는 잘 가지고 오는데 아무런 값을 가져 오지 않았다.
문제는 review.id는 "문자" === value는 "숫자" 로 각각 id값을 받아오기 때문에 값을 가져오지 않았던 것이다.
그래서 review.id를 Number로 감싸 숫자로 읽힐 수 있도록 했다.
import updateReviewList from "./statelist.js";
// 기재된 코드...
const showMovieDetails = (movie) => {
//기재된 코드...
;
updateReviewList(movie.id);
};
그리고 sub.js 상단에 import로 statelist.js에 작성된 함수를 불러왔다.
** { } 중괄호를 삭제한 이유!
import { updateReviewList } from "./statelist.js";
export를 할때 default를 사용할 경우 { } 중괄호를 생략해야 한다.
addEventListener로 자동실행 되지 않기 때문에 updateReviwList(movie.id); 로 함수를 호출해서
urlParams로 받아온 id를 인자로 전달할 수 있고
urlParams로 받아온 id를 받아 === review.id 와 비교해 맞는 일치하는 리뷰만 꺼낼 수 있다.
<script type="module" defer src="../src/sub.js"></script>
그럼 HTML에서 type="module"를 지정해 주고 안전한 장치역할을 해주는 defer를 함께 붙여준다.
** type="module" 와 defer를 작성한 이유
type="module" 은 package.json이 있는 경우 package.json에 type="module" 작성하면 전역에 적용되지만
현재는 없음으로 해당 페이지의 모듈을 직접 설정해 주기 위해 작성.
defer은 작성하지 않아도 되지만 안전장치로 작성해 주었다! (나중에 공부해 보기로.)
'TIL' 카테고리의 다른 글
2024. 01 .15 TMDB 영화 리뷰 기능 구현 코드 뜯어보기 1 (팀프로젝트) (0) | 2024.01.15 |
---|---|
2024. 01. 14 팀 프로젝트 완료 & Git push (0) | 2024.01.14 |
2024.01.11 팀 프로젝트 2 (0) | 2024.01.11 |
2024. 01. 10 첫 팀프로젝트!! (0) | 2024.01.10 |
2024. 01. 09 node, yarn 삭제 후 재설치.. (0) | 2024.01.09 |
- Total
- Today
- Yesterday
- 별점 색채우기
- styled component 설치방법
- readme작성해보기
- axios CRUD
- readme 이미지 추가 방법
- git cache
- Warning: A component is changing an uncontrolled input to be controlled.
- readme 역할
- 유효성검사
- simple Icon 사용방법
- nextjs 토큰 만료처리하기
- axios instance 작성하기
- Warning: validateDOMNesting(...): <li> cannot appear as a descendant of <li>
- 유효성검사 css
- axiosinstance 사용 시 토큰 사용 법
- 별점만들기
- styled component 사용방법
- Warning: Each child in a list should have a unique "key" prop.
- styled component GlobalStyle 사용방법
- 영화별점만들기
- styled component 조건부 사용방법
- readme 작성해야 하는 이유
- 에러모음집
- readme 작성 방법
- axios 사용하기
- Fetch와 Axios 의 장단점
- axios 설치하기
- 영화 별점
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |