[TIL] 220129

dev·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
dev log

0ę°œė˜ 댓ęļ€