• 카테고리

    질문 & 답변
  • 세부 분야

    프론트엔드

  • 해결 여부

    미해결

부수 효과 비동기

20.09.06 17:27 작성 조회수 80

1

// useNeedLogin.js
export default function useNeedLogin() {
const history = useHistory();
const status = useSelector((state) => state.auth.status);

useEffect(() => {
if (status === AuthStatus.NotLogin) {
history.replace("/login");
}
}, [status, history]);
}
// Search.js
export default function Search() {
useNeedLogin();
const history = useSelector((state) => state.search.history);
const dispatch = useDispatch();
useEffect(() => {
dispatch(actions.fetchAllHistory());
}, [dispatch]);

search 컴포넌트와 useNeedLogin 훅이 위와 같이 작성되어 있습니다. 

이 경우에 Search 컴포넌트 랜더링 시에 fetchAllHistory가 실행이 되어 /history api를 호출합니다.
useNeedlogin의 useEffect와 Search 컴포넌트의 useEffect가 비동기로 호출되면서 useNeedLogin의 redirect가 호출되기 전에 dispatch가 호출이 되어 그런 것이라고 생각합니다.

state.auth.AuthStatus가 Login인지를 확인하는 로직을 Search 컴포넌트의 useEffect 내에 넣어 해결할 수 있었지만, useNeedLogin 훅의 기능과 중복이 됩니다.

조금 더 깔끔한 방법이 없을까 궁급하니다. 

답변 2

·

답변을 작성해보세요.

1

좋은 최적화 포인트네요 👍

state.auth.status 값을 필요한 곳에서 사용하는 게 이상한 것 같지는 않습니다.
useNeedLogin 의 역할은 `미로그인 시 로그인 페이지로 이동` 이라고 할 수 있는데요
아래처럼 if 문을 추가한 것이 기능 중복이라고 보기는 힘들 것 같아요

if (status === AuthStatus.Login) {
dispatch(actions.fetchAllHistory());
}

좀 다른 얘기지만, 로그인 상태에서만 함수를 호출해주는 useEffectOnLogin 훅을 만들어서 사용하는 방법도 괜찮아 보입니다.

useEffectOnLogin(() => {
dispatch(actions.fetchAllHistory());
}, [dispatch]);

0

이워낙님의 프로필

이워낙

질문자

2020.09.07

답변 감사합니다.