본문으로 바로가기

TIL 2022-01-10 React18, startTransition

category TIL 2022. 1. 10. 22:48

startTransition

 

주어진 Input을 통해 검색쿼리를 설정하고 결과물을 반환하는 컴포넌트가 있다고 가정하자

// Urgent: Show what was typed
setInputValue(input);

// Not urgent: Show the results
setSearchQuery(input);

사용자는 Input을 작성하면 setInputValue가 즉시 업데이트되기를 바라지만, setSearchQuery는 좀 이후에 업데이트되어도 큰 불만을 갖지 않는다.

 

기존의 리액트는 모든 업데이트가 한번에 수행되는데 이는 모든 것이 리렌더될떄까지 interaction을 block할 수 있다.

이럴때 사용할 수 있는 것이 startTransition이다.

 

startTransition은 리액트로 하여금 즉시 수행되지 않아도 되는 것들을 'transition'으로 설정할수 있게 해준다.

import { startTransition } from 'react';


// Urgent: Show what was typed
setInputValue(input);

// Mark any state updates inside as transitions
startTransition(() => {
  // Transition: Show the results
  setSearchQuery(input);
});

startTransition에 포함된 이벤트는 즉시 수행되지 않아도 되는 것으로 판단하여, 클릭, 타이핑 등의 더 우선순위가 높은 이벤트가 들어오면 중단된다. transtition이 타이핑 등의 행동으로 인해 지연된다면 오래된 렌더링을 버리고 새로운 렌더링만 한다.

 

Transition에서는 두가지 업데이트를 구분하는데,

 

Urgent Update: 클릭, 버튼 누르기 등 직접적 상호작용

Transition Update:  UI를 업데이트함

 

Transition VS setTimeout

startTransition은 setTimeout과 달리 scheduled되는게 아님

즉시 실행되지만 transition 정보를 통해서 어떻게 업데이트를 렌더링할지를 결정함. timeout보다 더 빨리 렌더링 업데이트가 가능하단 뜻.

setTimeout은 단순히 업데이트를 지연시키기에 스피너 같은 Load 표시를 필요로 할때가 있는데, Transition에서는 useTransition을 통해 쉽게 구현 가능

 

import { useTransition } from 'react';


const [isPending, startTransition] = useTransition();


-------


{isPending && <Spinner />}