이번 프로젝트에서 react-router 쓰는데 내가 원래 알던 방식이 아니였다 ! "뭐지?" 하면서 구글링하니 업데이트가 되었다.. 이런ㅎ ㅎ 슬쩍 봤는데 조금 헷갈리는 부분도 있지만 ? 조금 더 직관적이고 간단해진 느낌은 있는거 같다!
본 글은 링크된 영상을 보고 정리한 글입니다. 참고해주세요!
기존 v5
<Switch>
<Route exact path="/">
<Home />
</Route>
</Switch>
업데이트 버전 v6
<Routes>
<Route path="/" element={<Home />} />
</Routes>
기존 v5
const history = useHistory();
history.push('/');
history.goback();
history.go(-2);
history.push(`/user/${user._id}`);
업데이트 버전 v6
const navigate = useNavigate();
navigate('/');
navigate(-1);
navigate(-2);
navigate(`/user/${user._id}`);
기존 v5
const match = useRouteMatch();
console.log(match);
// 현재 경로 "/"
// { path: '/', url: '/', isExact: true, params: {} }
<Link to={match.url} />; // 현재 url 로 이동
<Link to={`${match.url}/about`}>; // 현재 url에 /about을 붙인곳으로 이동
<Route path={match.path} />
<Route path={`${match.path}/about`} />
업데이트 버전 v6
<Link to="" />; // 만약 /users 였으면, 현재 페이지인 /user로 이동하는 것임.
<Link to="about">;
// 이렇게 입력시 현재 url에 /users/about을 붙인 곳으로 이동된다.
//*단 about앞에 /about을 붙이게되면 진짜 /about으로 이동되니 현재 기준으로 하려면 앞에 슬래쉬를 빼줘야함
<Route path="" exact />
<Route path="about" />
기존 v5
<Route path="/" component={Home} />
<Route path="/login">
<Login />
</Route>
업데이트 버전 v6
<Route path="/" element={<Home />} />
<Route path="/login" element = {<Login />}/>
기존 v5
// user.js
<Route path="/" component={UserMain} />
<Route path="/about">
<About />
</Route>
업데이트 버전 v6
<Routes>
<Route path="/" element={<UserMain />} />
<Route path="/about" element={<About />}>
</Routes>
여기서 잠깐.. 기존 exact prop을 사용한 이유는 "/users"의 경로를 정확히 매칭하기 위함입니다.
exact prop 가 없을 경우, /users 로 시작하는 모든 경로가 매칭되어, 아래의 "users/:username"요 페이지가 매칭되지 않고, "/users" 페이지가 매칭될 것입니다.
기존 v5
// user.js
<Route path="/users/:username" component={UsersPage} />
업데이트 버전 v6
<Route path="/users/:username/*" element={<UsersPage />} />
( 요건 사용자가 적어서 빠진 것인가 ? 음 )
기존 v5
// user.js
<Route path="/optional/:value?" component={Optional} />
업데이트 버전 v6
<Route path="/optional/:value?" element={<Optional />} />
<Route path="/optional" element={<Optional />} />
기존 v5
App.js
<Route path="/users/:username" component={UsersPage} />
user.js
<Route path="/users/:username" component={UserMain} />
<Route path="/users/:username/about" component={About} />
업데이트 버전 v6
App.js
<Route path="/users/:username/*" element={<UsersPage />}>
<Route path="" element={<UserMain />} />
<Route path="about" element={<About />} />
</Route>
user.js
// 기존 코드 없애주고 Outlet만 넣어주면 된다.
<Outlet />
기존 v5
<NavLink to="/messages" style={{ color: "blue"}} activeStyle={{ color: "green"}}>
Messages
</NavLink>
<NavLink to="/messages" className="nav-link" activeClassName="activated">
Messages
</NavLink>
업데이트 버전 v6
<NavLink to="/messages" style={({ isActive }) => ({ color: isActive ? 'green' : 'blue' })}>
Messages
</NavLink>
<NavLink to="/messages" className={({ isActive }) => "nav-link" + (isActive ? " activated" : "") }>
Messages
</NavLink>
다 적용해본 것은 아니지만, 위에서 말했듯이 대체적으로 직관적이고 간단하게 바뀐 것 같지만.. 헷갈리는 부분은 있는거 같다. 프로젝트에 적용하면서 조금 더 익혀야겠다.