리액트 공식 사이트에 리액트 19 베타 버전에 대한 설명이 올라왔다.
이 글에는 리액트 19에서 새롭게 추가된 기능, 개선된 사항 등을 소개하고 있다.
리액트 19에서 새롭게 추가된 기능과 훅, API 로는
<form>
Actions가 있고, 개선된 사항으로는
ref
를 프로퍼티로 접근 가능하게 함Context.provider
대신 Context
를 프로바이더로 이용함ref
콜백에서 클린업 함수를 반환하는 것을 지원함useDeferredValue
에 initialValue
옵션을 추가함비동기 트랜지션은 isPending 값을 즉시 true로 설정하며 비동기 요청을 보내고, 트랜지션이 수행되면 isPending을 false로 전환합니다. 이러한 방식은 데이터가 변경되는 동안에도 현재 UI의 반응성 및 상호작용을 유지할 수 있습니다.
npm create vite@latest
cd vite-project
npm install
npm install react@beta react-dom@beta
import { 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로 이런 라이브러리를 대체할 수 있을 지 궁금하다.