강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

Moa Kim님의 프로필 이미지
Moa Kim

작성한 질문수

[리뉴얼] React로 NodeBird SNS 만들기

state의 무결성?

해결된 질문

작성

·

289

0

안녕하세요. 올려주신 리엑트쿼리 기반으로 연습하고 있습니다.

antd의 datepicker 이용해서 기간별로 포스트 불러오는걸 해보고 있습니다.

리액트의 state에 관해서 좀 기초적인?원초적인? 질문이 있습니다..

 

출발날짜의 상태와 변경함수

  const [ startDate, setStartDate ] = useState(moment().subtract(5, 'days'));
...
 
  const onChangeStartDate = (date, dateString) => {
    setStartDate(date);
};

 

날짜 변경후 적용버튼 눌러 서버 데이터 갱신하는 부분

  const onLoadTodos = () => {
    if(!startDate || !endDate){
      message.error('날짜를 선택해 주세요.', 0.5);
      return;
    }
    queryClient.invalidateQueries('orders');
}

 

데이터 가져오는 useQuery 부분

  const { status, isLoading, data: orders } = useQuery('orders',
  () => {
    console.log('useQuery');
    console.log(startDate);
    const from = startDate.toDate();
    const til = endDate.toDate();
    const params = {from:from, til:til, stat1: orderStatOpt};
    console.log(params);
    return loadTodosAPI(params)}
...

 

날짜를 변경setStartDate(date);한다음에 

<Button onClick={()=>{console.log('메롱', startDate)}}>날짜보기</Button>

이렇게 버튼으로 startDate값을 가져오는것과 

invalidateQueries('orders');  로  useQuery('orders',를 불러서 안에서 startDate를 가져오면 값이 다르게 나오는데..

원래 state의 값이 다르게 나오기도 하나요? 아니면 useQuery안에서 state가 다르게 작동한건지..

이상태에서 브라우저밖으로 커서 이동했다가 다시 들어오면(갱신시) state값이 동기화되긴 합니다..

답변 1

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

둘중에 버튼쪽이 맞는 날짜인가요?

Moa Kim님의 프로필 이미지
Moa Kim
질문자

네 버튼쪽이 맞는날짜이고 

invalidateQueries('orders');

로 하면 날짜 뿐만아니라 다른 state들도 갱신전 예전값으로 출력됩니다.

 

그상태에서 날짜출력버튼 눌러보면 갱신된값이 나오는데

state가 갱신된값, 갱신되기 전값 두개가 공존해버립니다..

 

refetchInterval: 2000,

로 강제 리패칭하거나 브라우저 커서 나갔다 들어오면 제대로 갱신된 state값을 출력하고요.

 

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

그 전까지의 state가 caching되어 있는 상태인 것 같습니다. invalidateQueries 말고 아예 강제로 업데이트하는 메서드를 쓰셔야 할것 같습니다.

Moa Kim님의 프로필 이미지
Moa Kim
질문자

리액트 state문제가 아니라 리액트쿼리의 캐싱문제인거죠?

 

use쿼리 부분에서

const { status, isLoading, data: orders, refetch } = useQuery('orders',

이렇게 하고

refetch();

이렇게 사용할수 있네요. 감사합니다.

Moa Kim님의 프로필 이미지
Moa Kim

작성한 질문수

질문하기