-
React #8. Movie introduction, router-dom프론트/React 2024. 8. 14. 21:31
채찍피티 왈
`react-router-dom`은 React 애플리케이션에서 클라이언트 사이드 라우팅을 쉽게 구현할 수 있게 도와주는 라이브러리입니다. 페이지 간 이동이나 URL 변화를 관리할 수 있게 해주며, 이를 통해 SPA(Single Page Application)에서도 페이지 전환과 같은 사용자 경험을 제공할 수 있습니다.
예를 들어, 사용자가 특정 경로로 이동하면 해당 경로에 맞는 컴포넌트를 렌더링하고, 뒤로 가기나 앞으로 가기와 같은 브라우저의 내비게이션 기능도 지원합니다. 이 라이브러리를 사용하면, 브라우저의 주소창에 있는 URL에 따라 서로 다른 화면을 렌더링하거나, `Link` 컴포넌트를 이용해 화면 간의 이동을 구현할 수 있습니다.
따라서 `react-router-dom`은 SPA를 만들 때 매우 유용하며, 페이지 이동이 필요할 때 서버로 요청을 보내지 않고도 브라우저에서 페이지 전환이 이루어지는 것처럼 보이게 할 수 있습니다. 이는 특히 네트워크 요청이 필요 없는 클라이언트 사이드 렌더링 상황에서 더욱 빛을 발합니다.Index.js
import React from 'react'; import ReactDOM from 'react-dom/client'; import App from './App'; const root = ReactDOM.createRoot(document.getElementById('root')); root.render( <App /> );
App.js
react-router-dom 5버전 -> 버전6 바뀐 부분
1. Switch컴포넌트가 Routes컴포넌트로 대체되었습니다.
Switch -> Routes
2. Route컴포넌트 사이에 자식 컴포넌트를 넣지 않고, element prop에 자식 컴포넌트를 할당하도록 바뀌었습니다.
Route path="/" element={< Home / >}import { useEffect, useState } from "react"; import { BrowserRouter as Router, Routes, Route, } from "react-router-dom"; import Home from "./routes/Home"; import Detail from "./routes/Detail"; function App() { return ( <Router> <Routes> <Route path="/" element={<Home/>}/> <Route path="/movie" element={<Detail/>}/> </Routes> </Router> ); } export default App;
Home.js
import { useEffect, useState } from "react"; import Movie from "../components/Movie"; function Home() { const [loading, setLoading] = useState(true); const [movies, setMovies] = useState([]); const getMovies = async() => { const response = await fetch('https://yts.mx/api/v2/list_movies.json?minimum_rating=8&sort_by=year'); const json = await response.json(); setMovies(json.data.movies); setLoading(false); } // 아무것도 주시하지 않고 있기 때문에 한번만 실행된다. useEffect(() => { getMovies(); }, []); console.log(movies); return ( <div> {loading ? (<h1>Loading...</h1> ) : ( <div> {movies.map((movie) => // Key 는 React 에서 렌더링할때 꼭 필요한 속성이고, // Movie 컴포넌트를 props 를 통해서 값을 전달하고 있다. <Movie key={movie.id} coverImg={movie.medium_cover_image} title={movie.title} summary={movie.summary} genres={movie.genres}/>)} </div> )} </div> ); } export default Home;
Movie.js
import PropTypes from "prop-types"; import {Link} from "react-router-dom"; function Movie({coverImg, title, summary, genres}) { return ( <div> <img src={coverImg} alt={title}/> {/* <a href="/movie"><h2>{title}</h2></a> */} {/* 일반적인 HTML 의 a 태그를 사용하면 페이지 새로고침이 일어나 사용자의 경험을 저하시킨다. 그러므로 react-router-dom 에서 제공하는 Link 를 사용해 새로고침이 없이도 페이지 이동을 할 수 있도록 하자. */} <Link to="/movie"><h2>{title}</h2></Link> <p>{summary}</p> <ul> {genres.map((g) =>( <li key={g}>{g}</li> ))} </ul> </div> ) } Movie.propTypes = { coverImg: PropTypes.string.isRequired, title: PropTypes.string.isRequired, summary: PropTypes.string.isRequired, genres: PropTypes.arrayOf(PropTypes.string).isRequired }; export default Movie;
Detail.js
function Detail() { return <h1>Detail</h1>; } export default Detail;
'프론트 > React' 카테고리의 다른 글
React #9. Github 로 배포 (0) 2024.08.19 React #7. To-Do List (0) 2024.08.14 React #6. useEffect 의 사용 목적과 방법 (0) 2024.08.14 React #6. useEffect 의 사용 목적과 방법 (0) 2024.08.13 React #5. 리액트 컴포넌트와 CSS 모듈화의 장점 (0) 2024.08.05