react
useLocation() - 현재 위치가 바뀌는 경우
개발메모장
2023. 11. 16. 15:41
사용자가 로그인을 한 경우 다른 url로 옮겨 갔을때
해당 사용자 정보가 맞는지 또는 세션이 끊겼는지 안끊겼는지를 알아야 한다. (세션을 추적)
그럴 때 react에서는 useLoaction을 통해 현재 위치가 그대로인지 옮겼는지를 알 수 있다.
예시)
// 로그인시 로그인 유저의 세션 정보를 가져와 권한같은걸 확인 또는 로그인 유무 여부 확인
function LoginProvider({ children }) {
const [login, setLogin] = useState("");
console.log(login);
useEffect(() => {
fetchLogin();
}, []);
// 로그인 경로
function fetchLogin() {
// 성공하면 login 안에 세션정보를 넣어준다
axios.get("/api/member/login").then((res) => setLogin(res.data));
}
function isAuthenticated() {
return login !== "";
}
function isAdmin() {
if (login.auth) {
return login.auth.some((elem) => elem.name === "admin");
}
return false;
}
// function isManager(){
// return login.auth.some((elem) => elem.name === "manager");
// }
//
// function hasAuth(auth){
// return login.auth.some((elem) => elem.name === auth);
// }
function hasAccess(userId) {
return login.id === userId;
}
return (
<LoginContext.Provider
value={{ login, fetchLogin, isAuthenticated, hasAccess, isAdmin }}
>
{children}
</LoginContext.Provider>
);
}
네비게이션을 통해 url을 이동하기때문에 useLocation으로 움직임을 감지
export function NavBar() {
const { fetchLogin, login, isAuthenticated, isAdmin } =
useContext(LoginContext);
const toast = useToast();
const navigate = useNavigate();
const urlParams = new URLSearchParams();
const location = useLocation();
// 처음 컴포넌트 그려질 때 fetchLogin()을 통해 세션정보를 가져와서 있는지 없는지 유무확인으로
// 로그인 했는지 안했는지 확인
// useLocation을 통해 현재 위치에서 다른 위치로 옮겨갈 때 마다 useEffect 작동시켜서
// 위치 옮길때마다 유저정보 유무 확인
useEffect(() => {
fetchLogin();
}, [location]);
if (login !== "") {
urlParams.set("id", login.id);
}
function handleLogout() {
axios
.post("/api/member/logout")
.then(() => console.log("로그아웃 성공"))
.then(() => {
toast({
description: "로그아웃 되었습니다.",
status: "info",
});
navigate("/");
});
}
return (
<Flex>
<Button onClick={() => navigate("/")}>메인</Button>
{isAuthenticated() && (
<Button onClick={() => navigate("/write")}>글 쓰기</Button>
)}
{isAuthenticated() || (
<Button onClick={() => navigate("/signup")}>가입하기</Button>
)}
{isAdmin() && (
<Button onClick={() => navigate("/member/list")}>회원목록</Button>
)}
{isAuthenticated() && (
<Button onClick={() => navigate("/member?" + urlParams.toString())}>
회원 정보
</Button>
)}
{isAuthenticated() || (
<Button onClick={() => navigate("/login")}>로그인</Button>
)}
{isAuthenticated() && <Button onClick={handleLogout}>로그아웃</Button>}
</Flex>
);
}