Navigation

ํ•™์Šต ํ‚ค์›Œ๋“œ

  • History

    • History.pushState

  • Link

  • NavLink

  • Navigate

  • useNavigate

History

History ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ์„ธ์…˜ ๊ธฐ๋ก, ์ฆ‰ ํ˜„์žฌ ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜จ ํƒญ ๋˜๋Š” ํ”„๋ ˆ์ž„์˜ ๋ฐฉ๋ฌธ ๊ธฐ๋ก์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

HTML ๋ฌธ์„œ์—์„œ, history.pushState() ๋ฉ”์„œ๋“œ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ์„ธ์…˜ ๊ธฐ๋ก ์Šคํƒ์— ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

const state = {};  // ๋ธŒ๋ผ์šฐ์ € ์ด๋™ ์‹œ ๋„˜๊ฒจ์ค„ ๋ฐ์ดํ„ฐ (popstate ์—์„œ ๋ฐ›์•„์„œ ์›ํ•˜๋Š” ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค„ ์ˆ˜ ์žˆ์Œ)
const title = '';  // ๋ณ€๊ฒฝํ•  ๋ธŒ๋ผ์šฐ์ € ์ œ๋ชฉ (๋ณ€๊ฒฝ ์›์น˜ ์•Š์œผ๋ฉด null)
const url = '/๊ฒฝ๋กœ';  // ๋ณ€๊ฒฝํ•  ์ฃผ์†Œ

history.pushState(state, title, url);

React ์—์„œ ํŽ˜์ด์ง€ ์ „ํ™˜ํ• ๋•Œ ์‚ฌ์šฉํ•˜๋Š” react-router ๋Š” history.push ๋ฅผ ํ†ตํ•ด ๋งˆ์น˜ SSR ์ฒ˜๋Ÿผ ๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๊ณ  ๋™์‹œ์— Root ์—˜๋ฆฌ๋จผํŠธ์˜ ๋‚ด์šฉ๋ฌผ๋„ ๋ฐ”๊ฟ”์ค€๋‹ค. ์ด๊ฑธ ์ˆœ์ˆ˜ JS ๋กœ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด history.pushState ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

History.pushState ๋Š” ํŽ˜์ด์ง€ ์ด๋™ ์—†์ด ์ฃผ์†Œ๋งŒ ๋ฐ”๊ฟ”์ค€๋‹ค. (๋ธŒ๋ผ์šฐ์ €์˜ ๋’ค๋กœ๊ฐ€๊ฐ€ ๋ฒ„ํŠผ์ด ํ™œ์„ฑํ™” ๋œ๋‹ค.) ๋ธŒ๋ผ์šฐ์ € ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๊ฒŒ ๋˜๋ฉด window.onpopstate ๋ผ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, pushState ๋ฅผ ํ–ˆ์„๋•Œ๋Š” popstate ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€์•Š๊ณ , ๋’ค / ์•ž์œผ๋กœ ๊ฐ€๊ธฐ๋ฅผ ํด๋ฆญ ํ–ˆ์„๋•Œ popstate ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰, pushState ์™€ popstate ๋‘˜์„ ์ด์šฉํ•˜์—ฌ SPA ์˜ ํŽ˜์ด์ง€ ์ „ํ™˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿค” React์—์„œ๋Š” <a> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค?

์™œ๋ƒ๋ฉด <a>๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ์ด๋™ํ•˜๊ฒŒ ๋˜๋ฉด ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋ง ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ž˜์„œ React Router ๋Š” Link ํŠน์ • ์ฃผ์†Œ๋กœ ์ด๋™ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ , Navigation ํŠน์ • ํ–‰๋™์„ ํ–ˆ์„ ๋•Œ ํ•ด๋‹น ์ฃผ์†Œ๋กœ ์ด๋™ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์ค€๋‹ค.

<Link to="/๊ฒฝ๋กœ"> ..... </Link>
import { Link } from 'react-router-dom';

export default function Header() {
  return (
    <header>
      <ul>
        <li>
          <Link to="/">Home</Link>
        </li>
        <li>
          <Link to="/about">About</Link>
        </li>
      </ul>
    </header>
  );
}

<NavLink to="/๊ฒฝ๋กœ"> ..... </NavLink>
import { Link, NavLink } from 'react-router-dom';

export default function Header() {
  return (
    <header>
      <ul>
        <li>
          <NavLink to="/">Home</NavLink>
        </li>
        <li>
          <NavLink to="/about">About</NavLink>
        </li>
      </ul>
    </header>
  );
}

By default, an active class is added to a <NavLink> component when it is active so you can use CSS to style it.

It provides useful context for assistive technology like screen readers

ํ™œ์„ฑํ™”๋œ ํŽ˜์ด์ง€์— ๊ธฐ๋ณธ์ ์œผ๋กœ active class๋ฅผ ์ œ๊ณตํ•ด์ค€๋‹ค. aria-current ๋˜ํ•œ ์ง€์›ํ•ด์ค€๋‹ค.

  • ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฆฌ๋‹ค์ด๋ ‰์…˜์„ ๋ฐœ์ƒ์‹œํ‚ฌ ๋•Œ ์‚ฌ์šฉ (Ex.Logout)

๐Ÿ“– Redirect ์‚ฌ์šฉ์ž๊ฐ€ ์ฒ˜์Œ ์š”์ฒญํ•œ URL์ด ์•„๋‹Œ, ๋‹ค๋ฅธ URL๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, ์›น์‚ฌ์ดํŠธ A์˜ ์ฃผ์†Œ๋กœ ์ ‘์†ํ•œ ์‚ฌ์šฉ์ž๋ฅผ ์›น์‚ฌ์ดํŠธ B๋กœ ์ด๋™์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

<Navigate to="/๊ฒฝ๋กœ" />
// LogoutPage.tsx

import { Navigate } from 'react-router-dom';

export default function LogoutPage() {
  return <Navigate to="/" />;
}

๐Ÿšจ Redirect์„ ํ•˜๋Š” LogoutPage ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ Error ๋ฐœ์ƒ

// routes.test.tsx

context('when the current path is โ€œ/logoutโ€', () => {
  it('redirects to the home page', () => {
    renderRouter('/logout');

    screen.getByText(/ํ™˜์˜/);
  });
});

ReferenceError: Request is not defined MSW ๋ฐฐ์šธ ๋•Œ ์‚ฌ์šฉํ–ˆ๋˜ ํด๋ฆฌํ•„ whatwg-fetch import ํ•ด์„œ ์‚ฌ์šฉํ•˜์ž. โ†’ ์ •ํ™•ํ•œ ์ด์œ ๋Š”... ์•„์ง ์ดํ•ด๋˜์ง€ ์•Š์•˜๋‹ค. ํŠน์ˆ˜ํ•œ ์ƒํ™ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค.

  • ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฆฌ๋‹ค์ด๋ ‰์…˜์„ ๋ฐœ์ƒ์‹œํ‚ฌ ๋•Œ ์‚ฌ์šฉ (Ex.Logout)

  • Hook์„ ์ด์šฉํ•ด redirect์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฒ˜๋ฆฌ

Navigate ๋ณด๋‹ค useNavigate ๋” ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. by. ์ฝ”๋”ฉ์˜์‹  ์•ผ์‚ด

const navigate = useNavigate();

navigate('/');

useNavigate ์˜ ์ธ์ž

const navigate = useNavigate();

navigate('๊ฒฝ๋กœ', {replace, state });

๐Ÿ“Œ replace

const navigate = useNavigate();

navigate('๊ฒฝ๋กœ', {replace : true });
  • true : navigate์— ์ ํžŒ ์ฃผ์†Œ๋กœ ์ด๋™ํ•œ ํ›„ ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ์˜ต์…˜

  • false : navigate์— ์ ํžŒ ์ฃผ์†Œ๋กœ ์ด๋™ํ•œ ํ›„ ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์˜ต์…˜ (Default)

๐Ÿ“Œ state

const navigate = useNavigate();

navigate('๊ฒฝ๋กœ', {state : {....props} });
  • navigate์— ์ ํžŒ ์ฃผ์†Œ๋กœ ์ด๋™ํ•œ ํ›„ state ์ „๋‹ฌ ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

  • ์ „๋‹ฌ ๋ฐ›์€ state๋Š” useLocation Hook์„ ์ด์šฉํ•ด ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”— ์ฐธ๊ณ 

Last updated