çŸåšãã¬ã³ããªã³ã°ã³ã³ããŒãã³ãã«ã¯ãããã»ããµãã¯ãŒãšãããã¯ãŒã¯ããŒã¿è»¢éé床ã®2ã€ã®å¶éããããŸãããŠãŒã¶ãŒã«äœãã衚瀺ããå¿ èŠãããå Žåã¯åžžã«ãçŸåšã®ããŒãžã§ã³ã®Reactã¯åã³ã³ããŒãã³ããæåããæåŸãŸã§ã¬ã³ããªã³ã°ããããšããŸããã€ã³ã¿ãŒãã§ã€ã¹ãæ°ç§éããªãŒãºãããã©ããã¯é¢ä¿ãããŸãããããŒã¿è»¢éã«ã€ããŠãåãã§ããReactã¯ãã³ã³ããŒãã³ãã1ã€ãã€æç»ããã®ã§ã¯ãªããã³ã³ããŒãã³ããå¿ èŠãšãããã¹ãŠã®ããŒã¿ãå®å šã«åŸ æ©ããŸãã
ç«¶äºäœå¶ã¯ãããã®åé¡ã解決ããŸããããã䜿çšãããšãReactã¯ã以åã«ãããã¯ããŠããæäœãäžæåæ¢ãåªå é äœä»ããããã«ã¯å ã«æ»ãããšãã§ãããããåæã¢ãŒãã§ã¯ããã¹ãŠã®ããŒã¿ãåä¿¡ããããããã®äžéšã®ã¿ãåä¿¡ããããã«é¢ä¿ãªããã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°ãéå§ã§ããŸãã
ã³ã³ã«ã¬ã³ãã¢ãŒãã¯ãã¡ã€ããŒã¢ãŒããã¯ãã£ã§ã
ç«¶äºã¢ãŒãã¯ãéçºè ãçªç¶è¿œå ããããšã決å®ããæ°ãããã®ã§ã¯ãªãããã¹ãŠãããã§æ©èœããŸãããäºåã«ãªãªãŒã¹ã®æºåãããŸãããããŒãžã§ã³16ã§ã¯ãReactãšã³ãžã³ã¯ãã¡ã€ããŒã¢ãŒããã¯ãã£ã«åãæ¿ããããŸãããããã¯ãååãšããŠããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ã¿ã¹ã¯ã¹ã±ãžã¥ãŒã©ã«äŒŒãŠããŸããã¹ã±ãžã¥ãŒã©ã¯ãããã»ã¹éã§èšç®ãªãœãŒã¹ã忣ããŸãããã€ã§ãåãæ¿ããããšãã§ããããããŠãŒã¶ãŒã¯ããã»ã¹ã䞊è¡ããŠå®è¡ãããŠããããã«èŠããŸãã
ãã¡ã€ããŒã¢ãŒããã¯ãã£ãåãã§ãããã³ã³ããŒãã³ãããããŸãããã§ã«Reactã«ãããšããäºå®ã«ãããããããFiberã¢ãŒããã¯ãã£ã¯äžæãããã¢ãã¡ãŒã·ã§ã³ã«ãªã£ãŠããããã§ããã®æ©èœãæå€§éã«æŽ»çšããŠããŸãããç«¶åã¢ãŒãã§ã¯ããã«ãã¯ãŒã§ãªã³ã«ãªããŸãã
éåžžã¢ãŒãã§ã³ã³ããŒãã³ããæŽæ°ãããšãã¯ãç»é¢ã«ãŸã£ããæ°ãããã¬ãŒã ãæç»ããå¿ èŠããããŸããæŽæ°ãå®äºãããŸã§ããŠãŒã¶ãŒã«ã¯äœã衚瀺ãããŸããããã®å ŽåãReactã¯åæããŠåäœããŸãããã¡ã€ããŒã¯ç°ãªãæŠå¿µã䜿çšããŠããŸãã16ããªç§ããšã«å²ã蟌ã¿ãšãã§ãã¯ããããŸãïŒä»®æ³ããªãŒã倿ŽãããŸããããæ°ããããŒã¿ã衚瀺ãããŸãããïŒãããããªãããŠãŒã¶ãŒã¯ããã«ããããèŠãã§ãããã
ãªã16msïŒReactéçºè ã¯ãæ¯ç§60ãã¬ãŒã ã«è¿ãé床ã§ç»é¢ãåæç»ããããšåªããŠããŸãã60ã®æŽæ°ã1000msã«åããã«ã¯ãçŽ16msããšã«æŽæ°ãè¡ãå¿ èŠããããŸãããããã£ãŠãå³ãç«¶äºã¢ãŒãã¯ç®±ããåºããŠãããã³ããšã³ãã®ç掻ãããè¯ãããæ°ããããŒã«ã远å ããŸããããããã«ã€ããŠè©³ãã説æããŸãã
ãµã¹ãã³ã¹
ãµã¹ãã³ã¹ã¯ãã³ã³ããŒãã³ããåçã«ããŒãããã¡ã«ããºã ãšããŠReact16.6ã§å°å ¥ãããŸãããã³ã³ã«ã¬ã³ãã¢ãŒãã§ã¯ããã®ããžãã¯ã¯ä¿æãããŸããã远å ã®æ©äŒã衚瀺ãããŸãããµã¹ãã³ã¹ã¯ãããŒã¿ããŒãã©ã€ãã©ãªãšé£æºããŠæ©èœããã¡ã«ããºã ã«ãªããŸããã©ã€ãã©ãªãä»ããŠç¹å¥ãªãªãœãŒã¹ãèŠæ±ããããããããŒã¿ãèªã¿åããŸãã
ãµã¹ãã³ã¹ã¯ããŸã æºåãã§ããŠããªãããŒã¿ãåæã«èªã¿åããŸããã©ããã£ãŠïŒç§ãã¡ã¯ããŒã¿ãèŠæ±ããããããå®å šã«ãªããŸã§ãç§ãã¡ã¯ãã§ã«ããããå°ããªæçã§èªã¿å§ããŠããŸããéçºè ã«ãšã£ãŠæãã¯ãŒã«ãªããšã¯ãããŒããããããŒã¿ã衚瀺ãããé åºã管çããããšã§ãããµã¹ãã³ã¹ã䜿çšãããšãããŒãžã³ã³ããŒãã³ããåæã«ããŸãã¯äºãã«ç¬ç«ããŠè¡šç€ºã§ããŸããããã«ãããã³ãŒããç°¡åã«ãªããŸããSuspenseæ§é ã調ã¹ãŠãããŒã¿ãèŠæ±ãããŠããé åºã確èªããã ãã§ãã
ãå€ããReactã§ããŒãžãããŒãããããã®äžè¬çãªãœãªã¥ãŒã·ã§ã³ã¯ãFetch-On-Renderã§ãããã®å ŽåãuseEffectãŸãã¯componentDidMountå ã§ã¬ã³ããªã³ã°ããåŸã«ããŒã¿ãèŠæ±ããŸããããã¯ãReduxãŸãã¯ä»ã®ããŒã¿ã¬ã€ã€ãŒããªãå Žåã®æšæºããžãã¯ã§ããããšãã°ã2ã€ã®ã³ã³ããŒãã³ããæç»ããããããã«ããŒã¿ãå¿ èŠã§ãã
- ã³ã³ããŒãã³ããªã¯ãšã¹ã1
- æåŸ âŠ
- ããŒã¿ã®ååŸ->ã³ã³ããŒãã³ã1ã®ã¬ã³ããªã³ã°
- ã³ã³ããŒãã³ããªã¯ãšã¹ã2
- æåŸ âŠ
- ããŒã¿ã®ååŸ->ã³ã³ããŒãã³ã2ã®ã¬ã³ããªã³ã°
ãã®ã¢ãããŒãã§ã¯ãæåã®ã³ã³ããŒãã³ããã¬ã³ããªã³ã°ãããåŸã«ã®ã¿ã次ã®ã³ã³ããŒãã³ããèŠæ±ãããŸããé·ããŠäžäŸ¿ã§ãã
å¥ã®æ¹æ³ãFetch-Then-Renderã«ã€ããŠèããŠã¿ãŸããããæåã«ãã¹ãŠã®ããŒã¿ãèŠæ±ããæ¬¡ã«ããŒãžãã¬ã³ããªã³ã°ããŸãã
- ã³ã³ããŒãã³ããªã¯ãšã¹ã1
- ã³ã³ããŒãã³ããªã¯ãšã¹ã2
- æåŸ âŠ
- ã³ã³ããŒãã³ã1ã®ååŸ
- ã³ã³ããŒãã³ã2ã®å ¥æ
- ã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°
ãã®å Žåããªã¯ãšã¹ãã®ç¶æ ãäžã«ç§»åããŸããããŒã¿ãåŠçããããã«ããªã¯ãšã¹ããã©ã€ãã©ãªã«å§ä»»ããŸãããã®æ¹æ³ã¯ããŸãæ©èœããŸããã埮åŠãªéãããããŸããã³ã³ããŒãã³ãã®1ã€ãä»ã®ã³ã³ããŒãã³ããããããŒãã«æéããããå ŽåããŠãŒã¶ãŒã«ã¯äœã衚瀺ãããŸãããããã§ã«äœãã衚瀺ããããšã¯ã§ããŸãããŠãŒã¶ãŒãšæçš¿ã®2ã€ã®ã³ã³ããŒãã³ããå«ããã¢ã®ãµã³ãã«ã³ãŒããèŠãŠã¿ãŸããããã³ã³ããŒãã³ãããµã¹ãã³ã¹ã§ã©ããããŸãã
const resource = fetchData() // - React
function Page({ resource }) {
return (
<Suspense fallback={<h1>Loading user...</h1>}>
<User resource={resource} />
<Suspense fallback={<h1>Loading posts...</h1>}>
<Posts resource={resource} />
</Suspense>
</Suspense>
)
}
æåã®ã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããåŸã«ããŒã¿ãèŠæ±ãããšãããã®ã¢ãããŒãã¯Fetch-On-Renderã«è¿ãããã«èŠãããããããŸããããããå®éã«ã¯ãSuspenseã䜿çšãããšããŒã¿ãã¯ããã«é«éã«ååŸã§ããŸããããã¯ãäž¡æ¹ã®èŠæ±ã䞊è¡ããŠéä¿¡ãããããã§ãã
Suspenseã§ã¯ããã©ãŒã«ããã¯ã衚瀺ããã³ã³ããŒãã³ããæå®ããã³ã³ããŒãã³ãå ã®ããŒã¿ååŸã©ã€ãã©ãªã«ãã£ãŠå®è£ ããããªãœãŒã¹ãæž¡ãããšãã§ããŸãããã®ãŸãŸäœ¿çšããŸããã³ã³ããŒãã³ãå ã§ããªãœãŒã¹ããããŒã¿ãèŠæ±ããreadã¡ãœãããåŒã³åºããŸããããã¯ã峿žé€šãç§ãã¡ã«çŽæããããšã§ãã Suspenseã¯ãããŒã¿ãããŒããããŠãããã©ãããçè§£ããããŒããããŠããå Žåã¯ããã衚瀺ããŸãã
ã³ã³ããŒãã³ãã¯ããŸã åä¿¡äžã®ããŒã¿ãèªã¿åãããšããŠããããšã«æ³šæããŠãã ããã
function User() {
const user = resource.user.read()
return <h1>{user.name}</h1>
}
function Posts() {
const posts = resource.posts.read()
return //
}
Dan Abramovã®çŸåšã®ãã¢ã§ã¯ããã®ãããªãã®ããªãœãŒã¹ã®ã¹ã¿ããšããŠäœ¿çšãããŠããŸãã
read() {
if (status === 'pending') {
throw suspender
} else if (status === 'error') {
throw result
} else if (status === 'success') {
return result
}
}
ãªãœãŒã¹ããŸã ããŒããããŠããå Žåã¯ãäŸå€ãšããŠPromiseãªããžã§ã¯ããã¹ããŒããŸãããµã¹ãã³ã¹ã¯ãã®äŸå€ããã£ããããããããããã¹ã§ããããšãèªèããŠãããŒããç¶è¡ããŸãã Promiseã®ä»£ããã«ãä»ã®ãªããžã§ã¯ãã®äŸå€ãå°çããå ŽåãèŠæ±ããšã©ãŒã§çµäºããããšãæããã«ãªããŸãã宿ããçµæãè¿ããããšããµã¹ãã³ã¹ã¯ããã衚瀺ããŸãããªãœãŒã¹ãååŸãããã®ãªãœãŒã¹ã§ã¡ãœãããåŒã³åºãããšãéèŠã§ããå éšã§ã©ã®ããã«å®è£ ãããã¯ãã©ã€ãã©ãªéçºè ã®æ±ºå®ã§ããäž»ãªããšã¯ãSuspenseããã®å®è£ ãçè§£ããŠããããšã§ãã
ãã€ããŒã¿ããªã¯ãšã¹ãããŸããïŒããªãŒã®äžçªäžã§è³ªåããããšã¯ãå¿ é ã§ã¯ãªãå¯èœæ§ãããããããå§ãã§ããŸãããããè¯ããªãã·ã§ã³ã¯ãã€ãã³ããã³ãã©ãŒå ãããã²ãŒããããšãã«ãããããã«è¡ãããšã§ããããšãã°ãããã¯ãä»ããŠåæç¶æ ãååŸãããŠãŒã¶ãŒããã¿ã³ãã¯ãªãã¯ãããšããã«ãªãœãŒã¹ãèŠæ±ããŸãã
ã³ãŒãã§ã¯æ¬¡ã®ããã«ãªããŸãã
function App() {
const [resource, setResource] = useState(initialResource)
return (
<>
<Button text='' onClick={() => {
setResource(fetchData())
}}>
<Page resource={resource} />
</>
);
}
ãµã¹ãã³ã¹ã¯éåžžã«æè»ã§ããã³ã³ããŒãã³ããæ¬¡ã ã«è¡šç€ºããããã«äœ¿çšã§ããŸãã
return (
<Suspense fallback={<h1>Loading user...</h1>}>
<User />
<Suspense fallback={<h1>Loading posts...</h1>}>
<Posts />
</Suspense>
</Suspense>
)
ãŸãã¯åæã«ãäž¡æ¹ã®ã³ã³ããŒãã³ãã1ã€ã®ãµã¹ãã³ã¹ã«ã©ããããå¿ èŠããããŸãã
return (
<Suspense fallback={<h1>Loading user and posts...</h1>}>
<User />
<Posts />
</Suspense>
)
ãŸãã¯ãã³ã³ããŒãã³ããç¬ç«ãããµã¹ãã³ã¹ã§ã©ããããŠãã³ã³ããŒãã³ããäºãã«å¥ã ã«ããŒãããŸãããªãœãŒã¹ã¯ã©ã€ãã©ãªãä»ããŠããŒããããŸãããšãŠããã£ããããŠäŸ¿å©ã§ãã
return (
<>
<Suspense fallback={<h1>Loading user...</h1>}>
<User />
</Suspense>
<Suspense fallback={<h1>Loading posts...</h1>}>
<Posts />
</Suspense>
</>
)
ããã«ããšã©ãŒå¢çã³ã³ããŒãã³ãã¯ãµã¹ãã³ã¹å ã®ãšã©ãŒããã£ããããŸããäœãåé¡ãçºçããå ŽåããŠãŒã¶ãŒãããŒãããããšã瀺ãããšãã§ããŸãããæçš¿ã¯ããŒããããŠããªãããããšã©ãŒãçºçããŸãã
return (
<Suspense fallback={<h1>Loading user...</h1>}>
<User resource={resource} />
<ErrorBoundary fallback={<h2>Could not fetch posts</h2>}>
<Suspense fallback={<h1>Loading posts...</h1>}>
<Posts resource={resource} />
</Suspense>
</ErrorBoundary>
</Suspense>
)
ããã§ã¯ãç«¶äºäœå¶ã®ã¡ãªãããå®å šã«åŒãåºãããšãã§ããä»ã®ããŒã«ãèŠãŠã¿ãŸãããã
SuspenseList
SuspenseListã¯ãSuspenseã®ããŒãé åºã®å¶åŸ¡ãåæã«æ¯æŽããŸããè€æ°ã®ãµã¹ãã³ã¹ãå³å¯ã«æ¬¡ã ã«ããŒãããå¿ èŠãããå Žåã¯ãããããçžäºã«ãã¹ãããå¿ èŠããããŸãã
return (
<Suspense fallback={<h1>Loading user...</h1>}>
<User />
<Suspense fallback={<h1>Loading posts...</h1>}>
<Posts />
<Suspense fallback={<h1>Loading facts...</h1>}>
<Facts />
</Suspense>
</Suspense>
</Suspense>
)
SuspenseListã䜿çšãããšããããã¯ããã«ç°¡åã«ãªããŸãã
return (
<SuspenseList revealOrder="forwards" tail="collapsed">
<Suspense fallback={<h1>Loading posts...</h1>}>
<Posts />
</Suspense>
<Suspense fallback={<h1>Loading facts...</h1>}>
<Facts />
</Suspense>
</Suspense>
)
SuspenseListã®æè»æ§ã¯é©ãã¹ããã®ã§ãããŠã£ãžã§ããããã®ä»ã®ã³ã³ããŒãã³ãã衚瀺ããã®ã«äŸ¿å©ãªãããSuspenseListã奜ããªããã«ãã¹ãããå éšã®èªã¿èŸŒã¿é åºãã«ã¹ã¿ãã€ãºã§ããŸãã
useTransition
ã³ã³ããŒãã³ãã®æŽæ°ãå®å šã«æºåãã§ãããŸã§å»¶æããäžéã®ããŒãç¶æ ãåé€ããç¹å¥ãªããã¯ãããã¯äœã®ããïŒ Reactã¯ãç¶æ ã倿Žãããšãã«ã§ããã ãéãç§»è¡ããããã«åªããŠããŸãããã ããæéããããããšãéèŠãªå ŽåããããŸããããŒã¿ã®äžéšããŠãŒã¶ãŒã¢ã¯ã·ã§ã³ã§ããŒããããå ŽåãéåžžãããŒãæã«ããŒããŒãŸãã¯ã¹ã±ã«ãã³ã衚瀺ãããŸããããŒã¿ãéåžžã«æ©ãå°çããå ŽåãããŒããŒã¯åå転ã§ãå®äºããæéããããŸãããç¹æ» ããŠããæ¶ããæŽæ°ãããã³ã³ããŒãã³ããæç»ããŸãããã®ãããªå Žåã¯ãããŒããŒããŸã£ãã衚瀺ããªãæ¹ãè³¢æã§ãã
ãããuseTransitionã®åºçªã§ããã³ãŒãã§ã¯ã©ã®ããã«æ©èœããŸããïŒ useTransitionããã¯ãåŒã³åºããã¿ã€ã ã¢ãŠããããªç§åäœã§æå®ããŸããæå®ãããæéå ã«ããŒã¿ãå±ããªãå Žåã§ããããŒããŒã衚瀺ãããŸããããããããããããéãååŸãããšãå³åº§ã«ç§»è¡ããŸãã
function App() {
const [resource, setResource] = useState(initialResource)
const [startTransition, isPending] = useTransition({ timeoutMs: 2000 })
return <>
<Button text='' disabled={isPending} onClick={() => {
startTransition(() => {
setResource(fetchData())
})
}}>
<Page resource={resource} />
</>
}
ããŒãžã«ç§»åãããšãã«ããŒããŒã衚瀺ããããªãå ŽåããããŸãããããã§ãã€ã³ã¿ãŒãã§ã€ã¹ã§äœãã倿Žããå¿ èŠããããŸããããšãã°ããã©ã³ãžã·ã§ã³ã®éããã¿ã³ããããã¯ããŸããæ¬¡ã«ãisPendingããããã£ã圹ç«ã¡ãŸããããã«ãããç§»è¡æ®µéã«ããããšãéç¥ãããŸãããŠãŒã¶ãŒã«ãšã£ãŠãæŽæ°ã¯å³åº§ã«è¡ãããŸãããuseTransitionããžãã¯ã¯ãSuspenseã§ã©ãããããã³ã³ããŒãã³ãã«ã®ã¿åœ±é¿ããããšã«æ³šæããŠãã ãããUseTransitionèªäœã¯æ©èœããŸããã
é·ç§»ã¯ã€ã³ã¿ãŒãã§ã€ã¹ã§äžè¬çã§ããç§»è¡ãæ åœããããžãã¯ã¯ããã¿ã³ã«çž«ãä»ããŠã©ã€ãã©ãªã«çµ±åããã®ã«æé©ã§ããããŒãžéã®é·ç§»ãæ åœããã³ã³ããŒãã³ããããå Žåã¯ãonClickãhandleClickã§ã©ããããŸããããã¯ãå°éå ·ãä»ããŠãã¿ã³ã«æž¡ãããisDisabledç¶æ ã衚瀺ããŸãã
function Button({ text, onClick }) {
const [startTransition, isPending] = useTransition({ timeoutMs: 2000 })
function handleClick() {
startTransition(() => {
onClick()
})
}
return <button onClick={handleClick} disabled={isPending}>text</button>
}
useDeferredValue
ãããã£ãŠãé·ç§»ãè¡ãã³ã³ããŒãã³ãããããŸããæ¬¡ã®ç¶æ³ãçºçããããšããããŸãããŠãŒã¶ãŒãå¥ã®ããŒãžã«ç§»åãããå ŽåãããŒã¿ã®äžéšãåãåãã衚瀺ããæºåãã§ããŠããŸããåæã«ãããŒãžã¯äºãã«ãããã«ç°ãªããŸãããã®å Žåãä»ã®ãã¹ãŠãããŒãããããŸã§ããŠãŒã¶ãŒã«å€ãããŒã¿ã衚瀺ããã®ãè«ççã§ãã
çŸåšãReactã¯ãããè¡ãããšãã§ããŸãããçŸåšã®ããŒãžã§ã³ã§ã¯ãçŸåšã®ç¶æ ã®ããŒã¿ã®ã¿ããŠãŒã¶ãŒã®ç»é¢ã«è¡šç€ºã§ããŸãããã ããã³ã³ã«ã¬ã³ãã¢ãŒãã®useDeferredValueã¯ãå€ã®é å»¶ããŒãžã§ã³ãè¿ããããŒããŒã®ç¹æ» ãèµ·åæã®ãã©ãŒã«ããã¯ã®ä»£ããã«å€ãããŒã¿ã衚瀺ããå¯èœæ§ããããŸãããã®ããã¯ã¯ãé å»¶ããŒãžã§ã³ãå¿ èŠãªå€ãšããªç§åäœã®é å»¶ãåããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹ã¯éåžžã«æµåçã«ãªããŸããæå°éã®ããŒã¿ã§æŽæ°ãè¡ãããšãã§ãããã®ä»ã¯ãã¹ãŠåŸã ã«èªã¿èŸŒãŸããŸãããŠãŒã¶ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ãé«éã§ã¹ã ãŒãºã§ãããšããå°è±¡ãåããŸããå®éã«ã¯ãuseDeferredValueã¯æ¬¡ã®ããã«ãªããŸãã
function Page({ resource }) {
const deferredResource = useDeferredValue(resource, { timeoutMs: 1000 })
const isDeferred = resource !== deferredResource;
return (
<Suspense fallback={<h1>Loading user...</h1>}>
<User resource={resource} />
<Suspense fallback={<h1>Loading posts...</h1>}>
<Posts resource={deferredResource} isDeferred={isDeferred}/>
</Suspense>
</Suspense>
)
}
å°éå ·ããã®å€ãuseDeferredValueããååŸããå€ãšæ¯èŒã§ããŸããããããç°ãªãå ŽåãããŒãžã¯ãŸã ããŒãäžã§ãã
è峿·±ãããšã«ãuseDeferredValueã䜿çšãããšããããã¯ãŒã¯ãä»ããŠéä¿¡ãããããŒã¿ã ãã§ãªããå€§èŠæš¡ãªèšç®ã«ããã€ã³ã¿ãŒãã§ã€ã¹ã®ããªãŒãºãåãé€ãããã«ãé å»¶èªã¿èŸŒã¿ã®ããªãã¯ãç¹°ãè¿ãããšãã§ããŸãã
ãªããããçŽ æŽãããã®ã§ããïŒããã€ã¹ãç°ãªãã°ãåäœãç°ãªããŸããæ°ããiPhoneã§useDeferredValueã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããšãããŒãžãéãå Žåã§ããããŒãžããããŒãžãžã®ç§»è¡ã¯å³åº§ã«è¡ãããŸãããã ãããããŠã³ã¹ã䜿çšãããšã匷åãªããã€ã¹ã§ãé å»¶ãçºçããŸããUseDeferredValueãšã³ã³ã«ã¬ã³ãã¢ãŒãã¯ããŒããŠã§ã¢ã«é©å¿ããŸããåäœãé ãå Žåã§ããå ¥åã¯é£è¡ããããã€ã¹ãèš±å¯ããããã«ããŒãžèªäœãæŽæ°ãããŸãã
ãããžã§ã¯ããã³ã³ã«ã¬ã³ãã¢ãŒãã«åãæ¿ããã«ã¯ã©ãããã°ããã§ããïŒ
ç«¶åã¢ãŒãã¯ã¢ãŒããªã®ã§ãæå¹ã«ããå¿ èŠããããŸãããã¡ã€ããŒããã«çšŒåããããã°ã«ã¹ã€ããã®ããã«ãã©ãããå§ããŸããïŒ
ã¬ã¬ã·ãŒãåé€ããŸããã³ãŒãå ã®å»æ¢ãããã¡ãœããããã¹ãŠåé€ããããããã©ã€ãã©ãªã«ãªãããšã確èªããŸããã¢ããªã±ãŒã·ã§ã³ãReact.StrictModeã§æ£åžžã«åäœããå Žåããã¹ãŠãæ£åžžã§ã-ç§»åã¯ç°¡åã§ããæœåšçãªè€éãã¯ãã©ã€ãã©ãªå ã®åé¡ã§ãããã®å Žåãæ°ããããŒãžã§ã³ã«ã¢ããã°ã¬ãŒãããããã©ã€ãã©ãªã倿Žããå¿ èŠããããŸãããŸãã¯ç«¶äºäœå¶ãæŸæ£ããŸããã¬ã¬ã·ãŒãåãé€ããåŸãæ®ã£ãŠããã®ã¯ã«ãŒããåãæ¿ããããšã ãã§ãã
ã³ã³ã«ã¬ã³ãã¢ãŒãã®ç»å Žã«ããã3ã€ã®ã«ãŒãæ¥ç¶ã¢ãŒããå©çšå¯èœã«ãªããŸãã
-
ReactDOM.render(<App />, rootNode)
ç«¶åã¢ãŒãããªãªãŒã¹ãããåŸãå€ãã¬ã³ããªã³ã°ã¢ãŒãã¯éæšå¥šã«ãªããŸãã - ããããã³ã°ã¢ãŒã
ReactDOM.createBlockingRoot(rootNode).render(<App />)
äžé段éãšããŠãããããã³ã°ã¢ãŒãã远å ãããŸããããã«ããã移転ã«ã¬ã¬ã·ãŒããã®ä»ã®åé¡ããããããžã§ã¯ãã§ã®ç«¶äºã¢ãŒãã®æ©äŒã®äžéšã«ã¢ã¯ã»ã¹ã§ããŸãã - ç«¶äºã¢ãŒã
ReactDOM.createRoot(rootNode).render(<App />)
ãã¹ãŠãé 調ã§ãã¬ã¬ã·ãŒããªãããããžã§ã¯ããããã«åãæ¿ããããšãã§ããå Žåã¯ããããžã§ã¯ãã®ã¬ã³ããªã³ã°ãcreateRootã«çœ®ãæããŠãæããæªæ¥ã«åããŠãªãã«ããŸãã
çµè«
Reactå ã®ãããã¯æäœã¯ããã¡ã€ããŒã«åãæ¿ããããšã§éåæã«ãªããŸããã¢ããªã±ãŒã·ã§ã³ãããã€ã¹ã®æ©èœãšãããã¯ãŒã¯é床ã®äž¡æ¹ã«ç°¡åã«é©å¿ãããæ°ããããŒã«ãç»å ŽããŠããŸãã
- ãµã¹ãã³ã¹ãããã«ãããããŒã¿ã®ããŒãé åºãæå®ã§ããŸãã
- SuspenseListã¯ãããã«äŸ¿å©ã§ãã
- useTransitionã䜿çšããŠããµã¹ãã³ã¹ã§ã©ãããããã³ã³ããŒãã³ãéã®ã¹ã ãŒãºãªé·ç§»ãäœæããŸãã
- useDeferredValue-I / Oããã³ã³ã³ããŒãã³ãã®æŽæ°äžã«å€ãããŒã¿ã衚瀺ããŸã
ã³ã³ã«ã¬ã³ãã¢ãŒãããŸã åºãŠããªãç¶æ ã§è©ŠããŠã¿ãŠãã ãããã³ã³ã«ã¬ã³ãã¢ãŒãã䜿çšãããšãå°è±¡çãªçµæãåŸãããšãã§ããŸãã䟿å©ãªé åºã§ã®ã³ã³ããŒãã³ãã®é«éã§ã¹ã ãŒãºãªããŒããè¶ æµåã€ã³ã¿ãŒãã§ãŒã¹ã詳现ã¯ããã¥ã¡ã³ãã«èšèŒãããŠãããèªåã§èª¿ã¹ã䟡å€ã®ããäŸãå«ããã¢ããããŸãããŸãããã¡ã€ããŒã¢ãŒããã¯ãã£ãã©ã®ããã«æ©èœãããã«ã€ããŠç¥ãããå Žåã¯ãè峿·±ãè¬æŒãžã®ãªã³ã¯ãã芧ãã ããã
ãããžã§ã¯ããè©äŸ¡ããŸã-æ°ããããŒã«ã§äœãæ¹åã§ããŸããïŒãããŠãç«¶äºäœå¶ãæŽã£ãããæ°è»œã«ç§»åããŠãã ããããã¹ãŠãçŽ æŽãããã§ãããïŒ