React Router

React Router

npm i react-router-dom
// src/Home.js

import Banner from "./Banner";
import Category from "./Category";
import requests from "./requests";

const categories = [
  { title: "Now Playing", fetchUrl: requests.fetchNowPlaying },
  { title: "Popular", fetchUrl: requests.fetchPopular },
  { title: "Top Rated", fetchUrl: requests.fetchTopRated },
  { title: "Upcoming", fetchUrl: requests.fetchUpcoming },
];

const Home = () => {
  return (
    <div>
      <Banner fetchUrl={requests.fetchTrending} />
      {categories.map((category) => (
        <Category
          key={category.title}
          title={category.title}
          fetchUrl={category.fetchUrl}
        />
      ))}
    </div>
  );
};

export default Home;

Routes

// src/App.js

import { BrowserRouter as Router, Route } from "react-router-dom";
import Details from "./Details";
import Home from "./Home";

const App = () => {
  return (
    <Router>
      <header
        style=
      >
        <h1>React Workshop</h1>
        <Search />
      </header>

      <Route path="/movies/:id">
        <Details />
      </Route>

      <Route path="/">
        <Home />
      </Route>
    </Router>
  );
};

Switch

// src/App.js

const App = () => {
  return (
    <Router>
      ...
      <Switch>
        ...
      </Switch>
    </Router>
  );
};
// src/Movie.js

import { Link } from "react-router-dom";

const Movie = (props) => {
  return (
    <Link to={`/movies/${props.id}`} style=>
      <img
        style=
        src={props.poster_path}
        alt={props.title}
      />
      <h3>{props.title}</h3>
    </Link>
  );
};

Route Parameters

// src/Details.js
import { useParams } from "react-router";

const Details = () => {
  const { id } = useParams();

  return <h1>{id}</h1>;
};

export default Details;

Programmatic Routing

// src/Search.js

import { useHistory } from "react-router";

const Search = () => {
  const history = useHistory();

  async function fetchSearchResults() {
    if (query) {
      const response = await axios.get(requests.fetchQuery(query));
      history.push({
        pathname: "/search",
        search: `?q=${query}`,
        state: { movies: response.data.results },
      });
      setQuery("");
    }
  }
};
// src/Results.js

import { useLocation } from "react-router";
import Movie from "./Movie";

const Results = () => {
  const {
    state: { movies },
  } = useLocation();

  return (
    <div style=>
      {movies.map((movie) => (
        <Movie
          key={movie.id}
          id={movie.id}
          title={movie.title || movie.name}
          poster_path={movie.poster_path}
        />
      ))}
    </div>
  );
};

export default Results;
// src/App.js

import Results from "./Results";

const App = () => {
  return (
    ...
    <Route path="/search">
      <Results />
    </Route>
    ... 
  );
};