리액트 공식 사이트에 리액트 19 베타 버전에 대한 설명이 올라왔다.
이 글에는 리액트 19에서 새롭게 추가된 기능, 개선된 사항 등을 소개하고 있다.
리액트 19에서 새롭게 추가된 기능과 훅, API 로는
<form>Actions가 있고, 개선된 사항으로는
ref를 프로퍼티로 접근 가능하게 함Context.provider 대신 Context를 프로바이더로 이용함ref 콜백에서 클린업 함수를 반환하는 것을 지원함useDeferredValue에 initialValue 옵션을 추가함비동기 트랜지션은 isPending 값을 즉시 true로 설정하며 비동기 요청을 보내고, 트랜지션이 수행되면 isPending을 false로 전환합니다. 이러한 방식은 데이터가 변경되는 동안에도 현재 UI의 반응성 및 상호작용을 유지할 수 있습니다.
npm create vite@latestcd vite-projectnpm installnpm install react@beta react-dom@beta
pakage.jsonimport { useState, useTransition } from 'react';
async function updateNumber(count, setCount) {
await new Promise((resolve) =>
setTimeout(() => {
setCount(count + 1);
resolve();
}, 3000)
);
return null;
}
function App() {
// React 18 버전
const [count, setCount] = useState(0);
const [isPending, setIsPending] = useState(false);
const handleClickReact18 = async () => {
setIsPending(true);
await updateNumber(count, setCount);
setIsPending(false);
};
// React 19 버전
const [count19, setCount19] = useState(0);
const [isPending19, startTransition] = useTransition();
const handleClickReact19 = async () => {
startTransition(async () => {
await updateNumber(count19, setCount19);
});
};
return (
<div>
{/* React 18 버전 */}
<h1>리액트 18 예시</h1>
<p>Count: {isPending ? 'Loading...' : count}</p>
<button onClick={handleClickReact18}>Increment</button>
{/* React 19 버전 */}
<h1>리액트 19 예시</h1>
<p>Count: {isPending19 ? 'Loading...' : count19}</p>
<button onClick={handleClickReact19}>Increment</button>
</div>
);
}
액션은 비동기 트랜지션(async transitions)을 사용하는 함수를 말한다.
<form>Actions로 이런 라이브러리를 대체할 수 있을 지 궁금하다.