[TIL] 220129

Lee Syong·2022년 1ė›” 29ėž
0

TIL

ëŠĐ록 ëģīęļ°
164/204
post-thumbnail

📝 ė˜Ī늘 한 ęēƒ

  1. React-router-dom / parameter

📚 ë°°ėšī ęēƒ

1. PRACTICE

1) movie app

(1) React JSė—ė„œ 페ėīė§€ ė „환하는 ë°Đëē•

React JSė—ė„œ 페ėīė§€ëĨž ė „환하ęļ° ėœ„í•ī React-router-domė„ ė‚ŽėšĐí•īė•ž 한ë‹Ī.

$ npm i react-router-dom

routes íī더ė™€ components íī더ëĨž 만ë“Īė—ˆë‹Ī.
Movie.js 파ėžė„ components íī더 ė•ˆėœžëĄœ ė˜Ūęēžë‹Ī.

routes íī더 ė•ˆė— Home.js 파ėžęģž Detail.js 파ėžė„ 만ë“Īė—ˆë‹Ī.
App.js 파ėžė˜ App ėŧī폮넌íŠļė— ėž‘ė„ąí•œ ė―”ë“œëĨž Home.js 파ėžė˜ Home ėŧī폮넌íŠļ로 ė˜Ūęēžë‹Ī.

대ė‹  App ėŧī폮넌íŠļ는 router(urlė„ ëģīęģ  ėžˆëŠ” component)ëĨž render 하도록 했ë‹Ī.
urlė— 따띾ė„œ Home 또는 Detailė„ ëģīė—ŽėĢžęēŒ 된ë‹Ī.

react-router (v6 ėīėƒ) ė‚ŽėšĐëē• ė°ļęģ 

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> // root ęē―로ëĨž ë§Ļ 마ė§€ë§‰ė— ėž‘ė„ąí•īė•ž 한ë‹Ī.
        <Route path="/movie" element={<Detail />} />
        <Route path="/" element={<Home />} />
      </Routes>
    </Router>
  );
}

export default App;

(2) 하나ė˜ routeė—ė„œ ë‹ĪëĨļ route로 ėī동하는 ë°Đëē•

movie titleëĨž íīëĶ­í•˜ëĐī detail 페ėīė§€ëĄœ ėī동하도록 하ęļ° ėœ„í•ī linkëĨž ė‚ŽėšĐ한ë‹Ī.
a 태ę·ļëĨž ė‚ŽėšĐ할 ėˆ˜ë„ ėžˆė§€ë§Œ ėī ë°Đëē•ėœžëĄœëŠ” 페ėīė§€ ė „ėēī가 ėžŽëĄœë”Đ된ë‹Ī.
link ėŧī폮넌íŠļ는 ëļŒëžėš°ė €ëĨž ėƒˆëĄœęģ ėđĻ 하ė§€ ė•Šęģ ë„ ë‹ĪëĨļ 페ėīė§€ëĄœ ėī동ė‹œėžœėĪ€ë‹Ī.

<h2>
  <Link to="/movie">{title}</Link>
</h2>

(3) URL parameter

detail 페ėīė§€ė—ė„œ ė‹Īė œëĄœ í•īë‹đ ė˜í™”ė— 대한 ė •ëģīë“Īė„ ëģīė—ŽėĢžęļ° ėœ„í•ī urlė— 파띾ëŊļ터(urlė— ė†í•œ ëģ€ėˆ˜)ëĨž ėķ”ę°€í•œë‹Ī.

// App.js
<Route path="/movie/:id" element={<Detail />} />
// Movie.js
const Movie = ({ id, title }) => {
  return (
    <h2>
      <Link to={`/movie/${id}`}>{title}</Link>
    </h2>
};
// Detail.js
import { useState, useEffect } from "react";
import { useParams } from "react-router-dom";

const Detail = () => {
  const { id } = useParams(); // ðŸ’Ą useParams í•Ļėˆ˜ëĨž ėīėšĐí•ī urlė˜ 파띾ëŊļ터ëĨž 받ė•„ė˜Ž ėˆ˜ ėžˆë‹Ī
  const [loading, setLoading] = useState(true);
  const [movie, setMovie] = useState({});

  const getMovie = async () => {
    const json = await (
      await fetch(`https://yts.mx/api/v2/movie_details.json?movie_id=${id}`)
    ).json();

    setMovie(json.data.movie);
    setLoading(false);
  };

  useEffect(() => getMovie());

  return (
    <div>
      <h1>
        {loading ? (
          <strong>로ë”Đ ėĪ‘...</strong>
        ) : (
          `${movie.title} (rating ${movie.rating})`
        )}
      </h1>
      <img src={movie.large_cover_image} alt={movie.title} />
      <p>{movie.description_full}</p>
    </div>
  );
};

export default Detail;

âœĻ ë‚īėž 할 ęēƒ

  1. 마ëŽīëĶŽ
profile
ëŠĨ동ė ėœžëĄœ ė‚īėž, 행ëģĩ하ęēŒðŸ˜

0개ė˜ 댓ęļ€