프로젝트를 진행하면서 전역변수로 저장할 만한 것이 생겼다.
우리는 로그인 여부에 따라 보이는 헤더가 달라보이게끔
로그인 전에는 로그인, 회원가입메뉴가 헤더에 존재하고, 로그인 후에는 이 둘이 사라지고 마이페이지와, 로그아웃메뉴가 헤더에 존재하도록 구현하려고했다.
처음에는 굳이 리덕스를 사용하지않고 세션스토리지에 저장해놓은 토큰의 존재유무에 따라 로그인 여부를 결정하려고했다.
const [isLogin, setIsLogin] = useState(false);
useEffect(() => {
const accessKey = localStorage.getItem("Access_key");
if (accessKey) {
setIsLogin(true);
} else {
setIsLogin(false);
}
}, []);
하지만 항상 새로고침을 해야 헤더창이 변경되는 문제점이 발생하였다.
그래서 전역상태관리도구인 리덕스툴킷을 이용해 로그인 여부를 관리해주기로했다.
import { createSlice } from "@reduxjs/toolkit";
const initialState = {
isLoggedIn: false,
};
export const userSlice = createSlice({
name: "user",
initialState,
reducers: {
loginSuccess: (state) => {
state.isLoggedIn = true;
},
logoutSuccess: (state) => {
state.isLoggedIn = false;
},
},
});
export const { loginSuccess, logoutSuccess } = userSlice.actions;
export default userSlice.reducer;
처음 상태를 false로 초기화하고, 로그인에 성공할 시에 true로, 로그아웃에 성공할 시에는 false로 바꿔준다.
//로그인 시
const loginMutation = useMutation(loginAxios, {
onSuccess: (response) => {
alert("로그인 성공!");
dispatch(loginSuccess());
navigate("/main");
resetEmail();
resetPassword();
},
onError: (error) => {
alert("아이디와 비밀번호를 다시 확인해주세요!");
resetPassword();
},
});
const loginButtonHandler = () => {
loginMutation.mutate({ email, password });
};
//로그아웃시
const logoutMutation = useMutation(logoutAxios, {
onSuccess: () => {
alert("로그아웃 되었습니다.");
navigate("/");
},
onError: (error) => {
throw error;
},
});
const logoutHandler = async (e) => {
e.stopPropagation();
sessionStorage.removeItem("Access_key");
sessionStorage.removeItem("Refresh_key");
await logoutMutation.mutateAsync();
dispatch(logoutSuccess());
navigate("/");
logoutMutation.mutate();
};
이렇게 로그인과 로그아웃을 하면서 리덕스에 저장된 isLoggedIn의 상태를 변경했다.
마지막으로 이 로그인 상태를 활용하고 싶으면
const isLoggedIn = useSelector((state) => state.user.isLoggedIn);
user의 로그인 상태를 useSelector를 이용해 불러와 isLoggedIn에 저장하고, isLoggedIn의 상태에 따라 조건부렌더링을 해주면 처음에 원했던대로 잘 작동한다!
'리액트' 카테고리의 다른 글
새로고침하면 휘발하는 redux, redux-persist 로 유지하기 (0) | 2023.06.09 |
---|---|
[React] 리액트에서 이미지 파일과 json data를 함께 formData에 넣어 전송(post) (0) | 2023.05.31 |
useCallback과 React.Memo을 통한 불필요한 리렌디링 막기 (0) | 2023.05.24 |
CryptoJS를 활용한 RefreshToken 암호화 및 복호화 - 안전한 로그인 토큰 관리 방법 (0) | 2023.05.24 |
[React] 옵셔널 체이닝(Optional Chaining) (0) | 2023.04.28 |
댓글