unstable_addTransitionType unstable_addTransitionType โ€“ React - This feature is available in the latest Experimental version of React - This feature is available in the latest Experimental version of React - This feature is available in the latest Experimental version of React - This feature is available in the latest Experimental version of React - This feature is available in the latest Experimental version of React - This feature is available in the latest Experimental version of React - ko.react.dev

์‹คํ—˜์  ๊ธฐ๋Šฅ

์ด API๋Š” ์‹คํ—˜์ ์ด๋ฉฐ React ์•ˆ์ • ๋ฒ„์ „์—์„œ๋Š” ์•„์ง ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด API๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด React ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์žฅ ์ตœ์‹ ์˜ ์‹คํ—˜์ ์ธ ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • react@experimental
  • react-dom@experimental
  • eslint-plugin-react-hooks@experimental

์‹คํ—˜์ ์ธ ๋ฒ„์ „์˜ React์—๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”.

unstable_addTransitionType์„ ์‚ฌ์šฉํ•˜๋ฉด ํŠธ๋žœ์ง€์…˜์ด ๋ฐœ์ƒํ•œ ์›์ธ์„ ์ƒ์„ธํžˆ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

startTransition(() => {
unstable_addTransitionType('my-transition-type');
setState(newState);
});

๋ ˆํผ๋Ÿฐ์Šค

addTransitionType

๋งค๊ฐœ๋ณ€์ˆ˜

  • type: ์ถ”๊ฐ€ํ•  ํŠธ๋žœ์ง€์…˜์˜ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฌธ์ž์—ด์ด๋“  ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

startTransition์€ ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฃผ์˜ ์‚ฌํ•ญ

  • ์—ฌ๋Ÿฌ ํŠธ๋žœ์ง€์…˜์ด ๊ฒฐํ•ฉ๋˜๋ฉด ๋ชจ๋“  ํŠธ๋žœ์ง€์…˜ ํƒ€์ž…์ด ์ˆ˜์ง‘๋ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ํŠธ๋žœ์ง€์…˜์— ๋‘ ๊ฐœ ์ด์ƒ์˜ ํƒ€์ž…์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŠธ๋žœ์ง€์…˜ ํƒ€์ž…์€ ์ปค๋ฐ‹๋งˆ๋‹ค ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, <Suspense>์˜ Fallback์€ startTransition ์ดํ›„ ํƒ€์ž…์„ ์—ฐ๊ฒฐํ•˜๋ฉฐ, ๋‚ด์šฉ์ด ๋‚˜ํƒ€๋‚  ๋•Œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋ฒ•

ํŠธ๋žœ์ง€์…˜์˜ ์›์ธ ์ถ”๊ฐ€ํ•˜๊ธฐ

ํŠธ๋žœ์ง€์…˜์˜ ์›์ธ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด startTransition ๋‚ด๋ถ€์—์„œ addTransitionType์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค

import { startTransition, unstable_addTransitionType } from 'react';

function Submit({action) {
function handleClick() {
startTransition(() => {
unstable_addTransitionType('submit-click');
action();
});
}

return <button onClick={handleClick}>Click me</button>;
}

addTransitionType์„ startTransition์˜ ๋ฒ”์œ„ ๋‚ด์—์„œ ํ˜ธ์ถœํ•˜๋ฉด, React๋Š” ํ•ด๋‹น ํŠธ๋žœ์ง€์…˜์— submit-click์„ ์›์ธ์œผ๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ํŠธ๋žœ์ง€์…˜ ํƒ€์ž…์€ ์›์ธ์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์€ ์„ธ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

ํ–ฅํ›„์—๋Š” ํŠธ๋žœ์ง€์…˜์˜ ์›์ธ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์šฉ๋ก€๋ฅผ ์ง€์›ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.


๋ธŒ๋ผ์šฐ์ € View Transition ํƒ€์ž…์œผ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ปค์Šคํ…€ํ•˜๊ธฐ

ํŠธ๋žœ์ง€์…˜์—์„œ ViewTransition์ด ํ™œ์„ฑํ™”๋˜๋ฉด, React๋Š” ๋ชจ๋“  ํŠธ๋žœ์ง€์…˜ ํƒ€์ž…์„ ๋ธŒ๋ผ์šฐ์ €์˜ View Transition Types์œผ๋กœ ํ•ด๋‹น ์š”์†Œ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด CSS ๋ฒ”์œ„์—์„œ ๋‹ค๋ฅธ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ปค์Šคํ…€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function Component() {
return (
<ViewTransition>
<div>Hello</div>
</ViewTransition>
);
}

startTransition(() => {
unstable_addTransitionType('my-transition-type');
setShow(true);
});
:root:active-view-transition-type(my-transition-type) {
&::view-transition-...(...) {
...
}
}

View Transition ํด๋ž˜์Šค๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ปค์Šคํ…€ํ•˜๊ธฐ

ํ™œ์„ฑํ™”๋œ ViewTransition์—์„œ ํƒ€์ž…์— ๋”ฐ๋ผ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•˜๋ ค๋ฉด, View Transition ํด๋ž˜์Šค์— ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

function Component() {
return (
<ViewTransition enter={{
'my-transition-type': 'my-transition-class',
}}>
<div>Hello</div>
</ViewTransition>
);
}

// ...
startTransition(() => {
unstable_addTransitionType('my-transition-type');
setState(newState);
});

์—ฌ๋Ÿฌ ํƒ€์ž…์ด ๋งค์นญ๋˜๋ฉด ๊ฐ’๋“ค์ด ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. ๋งค์นญ๋˜๋Š” ํƒ€์ž…์ด ์—†์œผ๋ฉด โ€œdefaultโ€ ์—”ํŠธ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ํƒ€์ž…์ด๋ผ๋„ ๊ฐ’์ด โ€œnoneโ€์ด๋ฉด ํ•ด๋‹น ๊ฐ’์ด ์šฐ์„ ํ•˜๋ฉฐ ViewTransition์€ ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. (์ด๋ฆ„์ด ํ• ๋‹น๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

์ด ๋ฐฉ์‹์€ enter/exit/update/layout/share Props์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ํŠธ๋ฆฌ๊ฑฐ ์ข…๋ฅ˜์™€ ํŠธ๋žœ์ง€์…˜ ํƒ€์ž…์— ๋”ฐ๋ผ ๋™์ž‘์„ ๋งž์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<ViewTransition enter={{
'navigation-back': 'enter-right',
'navigation-forward': 'enter-left',
}}
exit={{
'navigation-back': 'exit-right',
'navigation-forward': 'exit-left',
}}>

ViewTransition ์ด๋ฒคํŠธ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ปค์Šคํ…€ํ•˜๊ธฐ

View Transition ์ด๋ฒคํŠธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํƒ€์ž…์— ๋”ฐ๋ผ ํ™œ์„ฑํ™”๋œ ViewTransition์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ฆ‰์‹œ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<ViewTransition onUpdate={(inst, types) => {
if (types.includes('navigation-back')) {
...
} else if (types.includes('navigation-forward')) {
...
} else {
...
}
}}>

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์›์ธ์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋ฌธ์ œ ํ•ด๊ฒฐ

ํ•ด์•ผ ํ•  ์ผ