react-tutorial icon indicating copy to clipboard operation
react-tutorial copied to clipboard

4. 리액트 라우터 부가기능 · GitBook

Open utterances-bot opened this issue 3 years ago • 7 comments

4. 리액트 라우터 부가기능 · GitBook

https://react.vlpt.us/react-router/04-extra.html

utterances-bot avatar Jul 24 '21 06:07 utterances-bot

useHistory 훅을 사용하는것이랑 객체로 꺼내서 쓰는거랑 어떻게 차이가 있나요??

SpookyJelly avatar Jul 24 '21 06:07 SpookyJelly

history 객체는 라우트로 사용된 컴포넌트에게 match, location 과 함께 전달되는 props 중 하나 컴포넌트 내에 구현하는 메소드에서 라우터에 직접 접근 (뒤로가기, 특정 경로로 이동, 이탈 방지)

withRouter HoC 는 라우트 컴포넌트가 아닌곳에서 match / location / history 를 사용

Switch 는 여러 Route 들을 감싸서 그 중 규칙이 일치하는 라우트 단 하나만을 렌더링 (Not Found 페이지를 구현가능)

NavLink 는 Link 랑 비슷한데, 만약 현재 경로와 Link 에서 사용하는 경로가 일치하는 경우 특정 스타일 혹은 클래스를 적용 할 수 있는 컴포넌트

sshusshu avatar Sep 28 '21 05:09 sshusshu

react router 버전 6 에서는 history가 없어졌기 때문에 useNavigate을 사용할 수 있습니다.

...
  const navigate = useNavigate()

  const goBack = () => {

    const answer = window.confirm('정말 떠나시겠어요?')
    if (answer) {
      navigate(-1)
    }

  };
...

yechukim avatar Feb 09 '22 02:02 yechukim

HistorySample.js : React-Router v6 (예제는 v5 코딩)

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

function HistorySample() {
   const navigate = useNavigate();
   const goBack = () => {
   const confirm = window.confirm('정말 떠나시겠어요?')
   if (confirm) {
      navigate(-1);
    }
  };

const goHome = () => {
    navigate('/');
  }
  return (
    <div>
      <button onClick={goBack}>뒤로가기</button>
      <button onClick={goHome}>홈으로</button>
    </div>
  );
}

gitwoojohn avatar Mar 11 '22 04:03 gitwoojohn

import { Routes, Route, Link, useLocation } from 'react-router-dom';

function App = () => {
  const { pathname } = useLocation(); // 추가
 return ( ...

App.js v5 코딩

<Route
      // path 를 따로 정의하지 않으면 모든 상황에 렌더링됨
      render={({ location }) => (
        <div>
            <h2>이 페이지는 존재하지 않습니다:</h2>
             <p>{location.pathname}</p>
           </div>
        )}
/>

위 코드를 v6 코딩으로 변경

<Route path='/*' element={ <h1>이 페이지는 존재하지 않습니다. - {pathname}</h1> }

gitwoojohn avatar Mar 11 '22 07:03 gitwoojohn

v6에서는 withRouter 안 쓰는 듯 해서 공부하면서 남겨요!

import React from "react";
import { useParams, useLocation, useNavigate } from 'react-router-dom';

const WithRouterSample = () => {
    const params = useParams(); // url에 대한 정보
    const location = useLocation(); // 현재 페이지에 대한 정보
    const navigate = useNavigate();
    return (
        <div>
            <h4>params</h4>
            <textarea value={JSON.stringify(params)} readOnly />
            <h4>location</h4>
            <textarea value={JSON.stringify(location, null, 2)} readOnly />
            <h4>navigate</h4>
            <button onClick={() => navigate(-1)}>홈으로</button>
        </div>

    )
}
export default WithRouterSample;

Profiles.js

import WithRouterSampe from "./WithRouterSample";
...
...
            <Routes>
                <Route
                path="/"
                element={"유저를 선택해주세요."}
                />
                <Route path="/:username" element={<Profile />} />
            </Routes>
            <WithRouterSampe /> //라우트팅이 아니니 Routes 밖에!

저처럼 한발짝 늦게 공부하시는 분들 화이팅!

Decker-Noh avatar May 18 '22 08:05 Decker-Noh

v6 에서는 <NavLink>의 "activeStyle"과 "activeClassName"이 제거되었습니다.

참고 : https://reactrouter.com/en/main/components/nav-link

clean-teach avatar Oct 11 '22 16:10 clean-teach