<Switch>
<Route path={"/"} exact><Redirect to={"quotes"}/></Route>
<Route path={"/quotes"} exact><AllQuotes/></Route>
<Route path={"/quotes/:quoteId"}><QuoteDetail/></Route>
<Route path={"/new-quote"}><NewQuotes/></Route>
<Route path={"*"}><NotFound/></Route>
</Switch>
<Routes>
<Route path={"/"} element={<Redirect to={"quotes"}/>}/>
<Route path={"/quotes"} element={<AllQuotes/>}/>
<Route path={"/quotes/:quoteId"} element={<QuoteDetail/>}/>
<Route path={"/new-quote"} element={<NewQuotes/>}/>
<Route path={"*"} element={<NotFound/>}/>
</Routes>
<Route path={"/quotes/*"} element={<QuoteDetail/>}/>
이렇게 작성하면 된다.
<Route path={"/"} element={<Redirect to={"quotes"}/>}/>
<Route path={"/"} element={<Navigate replace to={"quotes"}/>}/>
history.push({
pathname:location.pathname,
search: `?sort=${(isSoringAscend ? "desc" : "asc")}`,
});
const navigate = useNavigate();
navigate({
pathname:location.pathname,
search: `?sort=${(isSoringAscend ? "desc" : "asc")}`,
},{replace:true});
navigate(-2);
<Route path={`${match.path}`} exact>
<div className={"centered"}>
<Link className="btn--flat" to={`${match.url}/comments`}>Load Comments</Link>
</div>
</Route>
<Routes>
<Route path={`${match.path}`} element={
<div className={"centered"}>
<Link className="btn--flat" to={"comments"}>Load Comments</Link>
</div>
}/>
<Route path={"comments"} element={<Comments/>}></Route>
</Routes>
<Routes>
<Route path={"/quotes"} element={<AllQuotes/>}/>
<Route path={"/quotes/:quoteId"} element={<QuoteDetail/>}/>
<Route path={"/quotes/*"} element={<QuoteDetail/>}/>
<Route path={"*"} element={<NotFound/>}/>
</Routes>
*
가 있어야 한다. 왜? 앞서 언급했듯 앞으로 모든 Route 태그는 exact가 default로 적용되기 때문이다.<Routes>
<Route path={"/"} element={<Navigate replace to={"quotes"}/>}/>
<Route path={"/quotes"} element={<AllQuotes/>}/>
<Route path={"/quotes/:quoteId"} element={<QuoteDetail/>}/>
<Route path={"/quotes/*"} element={<QuoteDetail/>}>
<Route path={"comments"} element={<Comments/>}/>
</Route>
<Route path={"/new-quote"} element={<NewQuotes/>}/>
<Route path={"*"} element={<NotFound/>}/>
</Routes>
return (<Fragment>
<HighlightedQuote text={loadedQuote.text} author={loadedQuote.author}/>
<div className={"centered"}>
<Link className="btn--flat" to={"comments"}>Load Comments</Link>
</div>
<Outlet/>
</Fragment>);
<li><NavLink to={"/quotes"} activeClassName={classes.active}>All quotes</NavLink></li>
<li><NavLink to={"/new-quote"} activeClassName={classes.active}>Add a quotes</NavLink></li>
className은 단순히 클래스 이름만 취하지 않고 함수를 인수로 갖는다.
이 함수에서는 해당 링크와 내비게이션의 현재 상태에 관한 정보를 얻을 수 있다.
navData를 얻는 것인데, navData 인수는 함수가 실행될 때 React Router가 이 함수에 제공하며 이 함수는 React Router에 의해 NavLink를 평가하거나 내비게이션이 변경될 때마다 실행된다.
React Router로부터 얻는 navData 객체 안에서 isActive props에 접근하여 현재 선택된 경로에 대한 링크가 활성화되었다면 이는 true고 이렇게 하면 NavLink에 적용해야 할 className을 동적으로 반환할 수 있다.
<li><NavLink to={"/quotes"} ClassName={(navData)=> navData.isActive?classes.active:""}>All quotes</NavLink></li>
<li><NavLink to={"/new-quote"} ClassName={(navData)=> navData.isActive?classes.active:""}>Add a quotes</NavLink></li>