로그인 성공 후 Nav 상태 변경
서론
- 프로젝트에서 네비게이션바를 맡았다. 로그인을 성공하면 '로그인, 회원가입' 버튼이 유저의 닉네임과 로그아웃 버튼으로 변경이 되어야한다.
본론
Nav 로그인 전 이미지
Nav 로그인 전 이미지
Login.js
const loginFetch = e => {
e.preventDefault();
fetch(`${BASE_URL}users/signin`, {
method: 'POST',
body: JSON.stringify({
account: loginId,
password: loginPw,
}),
})
.then(res => res.json())
.then(result =>
sessionStorage.setItem('token', result.SUCCESS.ACCESS_TOKEN) // 세션스토리지에 토큰 저장
)
.then(() => navigate('/'));
};
- 일단 로그인이 성공하면 백엔드에서 토큰을 전달받게 되고 전달받은 토큰을 세션스토리지에 저장하게 된다.
UserInfo.js
{sessionStorage.getItem('token') ? (
<li>
<span className="userName">리치</span>
<span className="userPoint">
<p className="pointImage">P</p>
1,000,000
</span>
<span className="txtBar" />
</li>
) : (
<li>
<Link to="/login" className="navLogIn">
로그인
</Link>
<span className="txtBar" />
</li>
)}
- 로그인이 성공적으로 되면 페이지 이동을 하기 때문에 자동적으로 렌더링을 할 것이라 생각했고 위의 코드처럼 조건부 렌더링을 해놓으면 세션스토리지의 토큰 여부에 따라 렌더링이 될 줄 알았는데.. 맘처럼 쉽게 되지 않았다.
- 그러다가 우연히 새로고침을 하면 작동한다는 사실을 알고 야메로 새로고침 관련 코드를 넣었다. 그런데..
좋지 않습니다!
- 멘토 연욱님께서 친절하게 이런 방식의 접근은 좋지 않다고 말씀해주셔서 다른 방법을 찾아보았지만 도저히 찾을 수가 없었다.
힌트!
- 그래서 연욱님께 PR을 작성하며 하단에 도움을 요청했고 어느정도 힌트를 주셨다.
응?
- useLocation에서 힌트를 얻어 이것저것 해보다가 언제부턴가 동작이 제대로 되는 것을 발견했다.
- 왜 동작을 하게 되었는지는 모르겠지만 하나하나 정리를 해가며 알아보려고 했는데 이 코드만 삭제하면 동작하지 않는 것을 발견했다.
const location = useLocation();
- 이녀석은 대체 왜..?
React 동작 원리
- useLocation에서 navigate를 통해 페이지를 이동하며 state로 prop을 보내는 것을 이용해서 nav를 변경시킬 수 있는 줄 알았는데 그것은 이동한 페이지에 한해서만 동작하는 것이었고 정답은 아니었다.
- 연욱님께 가서 다시 여쭤본 결과 react가 다시 렌더링 되는 원리부터 말씀해주셨는데 react에서 재렌더링이 되는 순간은 state와 props가 변할 때 라는 것.
- useLocation은 현재 url을 나타내는 객체를 반환하는데 이렇게 호출 하는 것 만으로도 prop의 변화를 줄 수 있기 때문에 재렌더링되는 효과를 볼 수 있다 말씀해주셨다.
- 현재의 상황에서는 이정도로만 끝내는 것이 좋다고 해주셨다. (2주차에서는 절대 안되겠지만)
결론
Nav 로그인 후
- useLocation을 이용해서 로그인을 성공하면 원하는대로 변경이 되게끔 했다.
- 곧 2주차가 시작 될텐데 그때도 Nav를 맡게된다면 라이브러리나 전역변수를 사용해서 구현하게끔 해봐야겠다.
Author And Source
이 문제에 관하여(로그인 성공 후 Nav 상태 변경), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hsuj86/로그인-성공-후-Nav-상태-변경저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)