Route 조건부 렌더링
Route에서 조건에 따라 컴포넌트를 렌더링 하는 간단한 방법에 대해 설명합니다.
Redirect로 처리하는 방법도 있으나 Redirect로 처리하는 방법은 추후 설명하도록 하겠습니다.
아래 코드는 http://localhost:3000/Dashboard로 접속 시 토큰이 존재할 경우 Dashboard 컴포넌트를 렌더링 하며,
토큰이 존재하지 않을 경우 Login 컴포넌트를 렌더링 합니다.
...
function setToken(userToken) {
localStorage.setItem('token', JSON.stringify(userToken));
}
function getToken() {
const tokenString = localStorage.getItem('token');
const userToken = JSON.parse(tokenString);
return userToken?.token;
}
const App = () => {
const token = getToken();
return (
<Router>
<div className="App">
<div className='outer'>
<div className='inner'>
<Switch>
<Route exact path='/'
render={() => <Login setToken={setToken} />}/>
<Route path='/sign-up' component={SignUp} />
<Route path='/Dashboard' component={token ? Dashboard : Login} />
</Switch>
</div>
</div>
</div>
</Router>
);
}
export default App;
1. 삼항 연산자 처리
http://localhost:3000/Dashboard로 접속 시 토큰이 존재할 경우 Dashboard 컴포넌트를 렌더링 하며, 토큰이 존재하지 않으면 Login 컴포넌트를 렌더링 합니다.
<Route path='/Dashboard' component={token ? Dashboard : Login} />
2. && 연산자 처리
JSX안에 중괄호를 이용해서 논리 연산자(&&)를 사용합니다.
<Switch>
<Route exact path='/'
render={() => <Login setToken={setToken} />}/>
<Route path='/sign-up' component={SignUp} />
{token &&
<Route path='/Dashboard' component={Dashboard} />
}
</Switch>
잘못된 방법
토큰이 존재하지 않는 경우 path에 따라 Login 컴포넌트 또는 SignUp 컴포넌트를 렌더링 한다고 생각하고 코드를 작성하였습니다.
<Switch>
{!token &&
<Route exact path='/'
render={() => <Login setToken={setToken} />}/>
<Route path='/sign-up' component={SignUp} />
}
<Route path='/Dashboard' component={Dashboard} />
</Switch>
하지만, 다음과 같은 에러가 발생합니다.
『 Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...</>? 』
에러는 2개 이상의 태그를 반환할 경우 발생하는 에러입니다.
<Switch>
{!token &&
<>
<Route exact path='/'
render={() => <Login setToken={setToken} />}/>
<Route path='/sign-up' component={SignUp} />
</>
}
<Route path='/Dashboard' component={Dashboard} />
</Switch>
Fragments(태그를 그룹화)의 단축 문법인 <> ... </> 빈 태그로 그룹처리를 하면, 에러는 발생하지 않습니다.
그러나, 위 코드는 Dashboard path에 대해 조건 처리를 하지 않았으므로 토큰이 없어도 http://localhost:3000/Dashboard로 접속이 가능합니다.
간단한 프로젝트인 경우에는 Route 조건부 렌더링을 해도 큰 문제가 없어 보이지만, 처리해야 하는 Route가 많아지고 조건부 렌더링을 해야 되는 경우가 많다면 권장하는 방법은 아닙니다.
참고용으로만 봐주시면 감사하겠습니다.
참고
https://stackoverflow.com/questions/50526891/react-router-with-conditions
'React > React 문법' 카테고리의 다른 글
[React]자식 컴포넌트가 부모 컴포넌트의 state 변경 (0) | 2021.07.23 |
---|---|
[React]비동기로 동작하는 setState() (0) | 2021.07.15 |
[React]Key 이해하기 (1) | 2021.07.11 |
[React]이벤트 핸들러 바인딩(Event Handler Binding) (0) | 2021.07.07 |
[React]props 객체의 타입 검사 PropTypes (0) | 2021.06.29 |
댓글