
index.js 만든 담에 ctrl + c v하고 rafce 함수형 컴포넌트 만들기❗
import React from 'react'
import Nav from '../../components/Nav'
import Banner from '../../components/Banner'
import Category from '../../components/Category'
import Row from '../../components/Row'
import requests from '../../api/requests'
import styled from 'styled-components'
const MainPage = () => {
return (
<Container>
<Nav />
<Banner />
<Category />
<Row title="Trending Now" id="TN" fetchUrl={requests.fetchTrending} />
<Row title="Top Rated" id="TR" fetchUrl={requests.fetchTopRated} />
<Row title="Action Movies" id="AM" fetchUrl={requests.fetchActionMovies} />
<Row title="Comedy Movies" id="CM" fetchUrl={requests.=fetchComedyMovies} />
</Container>
)
}
export default MainPage
import { Route, Routes } from "react-router-dom";
const Layout = () => {
return (
<div>
{/* 메인에서 항상 보여줘야 되는 부분 : nev */}
<Nav />
{/* 자식 경로 요소 렌더링하려면❓
👉 부모 경로 요소에서 Outlet 태그 사용해야 함❗
이렇게 하면 하위 경로가 렌더링될 때
중첩된 UI 표시될 수 있음 */}
<Outlet />
</div>
)
}
function App() {
return (
{/* 1. Routes로 먼저 감싸주기 */}
<Routes>
{/* 2. Route로 감싸고 여러개의 Route 넣을 것(중첩) */}
{/* localhost:3000번에 왔을 때 Layout 렌더링 될 때
LoginPage도 같이 렌더링 되게 하고 싶으면➡index */}
<Route path="/" element={<Layout />}>
<Route index element={<LoginPage />} />
<Route path="main" element={<MainPage />} />
<Route path=":movieId" element={<DetailPage />} />
<Route path="search" element={<SearchPage />} />
</Route>
</Routes>
);
}
export default App;

실행하면 Nev랑 loginPage 뜨는 것을 확인할 수 있음👀
⬇
🕸spiderman 검색해서 뜨고 여기서 아무거나
Logo 밑에 만들면 되겠져❓
input창이 오른쪽에 있음const Input = style.input`
position: fixed;
left: 50%; // 이렇게 하면 정중앙일까❓
// input 창의 왼쪽 기준으로 정렬 되어서 아님🙅♀️
// input 전체의 반 만큼만 옮겨주면 됨❗
transform: translate(-50%, 0); // 이렇게 하면 정중앙
background-color: rgba(0, 0, 0, 0.582);
color: white;
padding: 5px;
border: 1px solid lightgray;
`
실행하면 정중앙으로 input창 완성✨
⬇
첨엔 localhost:3000/main이 었다가 input창에 spiderman 이라고
value 안에 state 넣고 타이핑할 때마다 state를 업데이트 해주면 됨❗
state 만들어주기

이런식으로 해줘야겠져❗ 어떻게 할까❓
reate-router-dom에서 제공받음
타이핑 한 게 e.target.value에 들어가면서 저 경로로 이동할 수 있는 것
경로가 바뀌니까 바로 다른 search 페이지 컴포넌트도
spiderman 값 가져오고 싶으면 어떻게 해야할까❓
:movieId
즉, useLocation➡url의 전체 정보 가져오는 것
:movieId 다이나믹 하게 되는 이 부분➡useParam
useLocation➡호출하면 객체를 리턴🔁
search에서 spiderman만 가져와야 함
그러면 콘솔에 값이 다 가져와짐


has : string에서 현재 topic이 있는지❓➡있으니 true❗
get : topic의 값은 api가 맞으니까 true⭕
getAll : 모든 걸 다 가져오는 것➡["api"] ( 배열에 가져옴 )
set : topic=More webdev ( ➕추가할 수도 있음 )

console.log(searchTerm); 하고 콘솔 보면 값을 잘 가져옴
💁♀️useEffect 사용하기

${ } 여기다가 searchTerm 타이핑 한 거 넣어주면 됨










🕷🕸



포스터에 커서 올리면 커졌다가 빼면 원래 이미지 사이즈로 돌아옴🎶
css 끗👩🎨
어떤 걸 하나(s) 검색하고 바로 요청 보내서 가져오고
또 하나(p) 검색해서 이에 대한 요청 보내서 가져오고
이렇게 하면 백엔드에서 너무 고된,,,😩
웹에선 굉장히 많은 사람들이 검색을 하는데
그렇기에 Debounce 주로 이용해서
불필요한 로드를 하지 않을 수 있게 해줌🙊👍
🎣커스텀 훅 사용 ⬇
📁hooks 폴더 만들기
input에 타이핑하는 값➡value
useDebounce.js 에서 export 해줬으니

debouncedValue를 리턴🔁









끗



저 부분을 가져와야 함❗

여기 이름은 왜 movieId 일까❓
App.js 에서 path=":movieId"로 지정해놔서❗







movie가 아직 null(값없음)이면 "loading..." 화면을 보여준다는 것
데이터 가져왔을 땐 엄청나게 많은 데이터들이 들어있겠지만
잘 나오는 걸 확인 할 수 있음👀
useRef➡ 1 ) 변수 관리 2 ) 특정 DOM을 선택 할 때 사용🔥
💁♀️리액트 컴포넌트 안에서 어떠한 값을 기억할 수 있는 방법❓
👉 const/let/var 이용해서 변수 만들기
👉 state 사용하기
👉 useRef 사용하기
보통 JS에서 특정 DOM에 접근하려면❓
👉 getElementById, querySelect 같은
DOM Selector 함수 사용해서 DOM 선택❗
✅리액트 사용 시 useRef 이용해서 특정 DOM 선택 가능🙆♀️
useRef➡리액트에서 가져오겠져❓

DOM 노드 저부분을 가져오고 싶음

ref 객체는 { current: null } 이라는 걸 콘솔에서 확인할 수 있음

ref={ref} 하면 됨
콘솔로 확인해보면 안 들어와 있는데 실제론 들어온 것
억지로 1넣어주고 렌더링 하면
이번엔 잘 나오는 걸 확인할 수 있음
콘솔에 저것들을 이용해서 모달 클릭했을 때

📢useOnClickOutside 함수를 Modal.js 에서 호출하기
ref 가져오고 ref 바뀔 때마다 다시 호출할 것🔄📢
이름은 handler로 지정해주고
mousedown 이벤트가 일어나면 listener 함수 작동🙆♀️
이걸 제거 해야됨⭕
이렇게❗
현재 handler가 저 함수임
👉 ref={modalRef} 등록 안 해준 것
▶ ref.current➡modal node
▶ event.target➡클릭한 노드
▶ contains➡포함
