Reactã®experimental_SuspenseListå調ãšã³ãžã³ã培åºè§£èª¬ãã¢ãŒããã¯ãã£ãå©ç¹ããŠãŒã¹ã±ãŒã¹ãè€éãªã¢ããªã±ãŒã·ã§ã³ã«ãããå¹ççã§äºæž¬å¯èœãªSuspense管çã®ããã®ãã¹ããã©ã¯ãã£ã¹ãæ¢ããŸãã
React experimental_SuspenseList å調ãšã³ãžã³ïŒSuspense管çã®æé©å
React Suspenseã¯ãã³ã³ããŒãã³ãå
ã§ã®ããŒã¿ååŸãªã©ã®éåææäœãåŠçããããã®åŒ·åãªã¡ã«ããºã ã§ããããŒã¿ãããŒããããã®ãåŸ
ã€éããã©ãŒã«ããã¯UIãé©åã«è¡šç€ºããããšãã§ãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã倧å¹
ã«åäžãããŸããexperimental_SuspenseList
ã³ã³ããŒãã³ãã¯ããããã®ãã©ãŒã«ããã¯ã衚瀺ãããé åºãå¶åŸ¡ããæ©èœãæäŸããããšã§ããããããã«äžæ©é²ããSuspenseã管çããããã®å調ãšã³ãžã³ãå°å
¥ããŸãã
React Suspenseãçè§£ãã
experimental_SuspenseList
ã«é£ã³èŸŒãåã«ãReact Suspenseã®åºæ¬ã埩ç¿ããŸãããïŒ
- Suspenseãšã¯äœãïŒ Suspenseã¯ãã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããåã«äœãããåŸ ã€ãããšãå¯èœã«ããReactã³ã³ããŒãã³ãã§ãããã®ãäœãããšã¯éåžžãéåæããŒã¿ååŸã§ãããä»ã®æéã®ãããæäœã§ããå ŽåããããŸãã
- ã©ã®ããã«æ©èœããã®ãïŒ ãµã¹ãã³ãããå¯èœæ§ã®ããã³ã³ããŒãã³ãïŒã€ãŸããéåæããŒã¿ã«äŸåããã³ã³ããŒãã³ãïŒã
<Suspense>
å¢çã§ã©ããããŸãã<Suspense>
ã³ã³ããŒãã³ãå ã§ã¯ãfallback
ããããã£ãæäŸããã³ã³ããŒãã³ãããµã¹ãã³ãããŠããéã«è¡šç€ºããUIãæå®ããŸãã - ãã€ãµã¹ãã³ãããã®ãïŒ ã³ã³ããŒãã³ãã¯ããŸã 解決ãããŠããªãpromiseããå€ãèªã¿åãããšãããšãµã¹ãã³ãããŸãã
react-cache
ãrelay
ã®ãããªã©ã€ãã©ãªã¯ãSuspenseãšã·ãŒã ã¬ã¹ã«çµ±åããããã«èšèšãããŠããŸãã
äŸïŒåºæ¬çãªSuspense
ãŠãŒã¶ãŒããŒã¿ãååŸããç°¡åãªäŸã§èª¬æããŸãããïŒ
import React, { Suspense } from 'react';
// Pretend this fetches data asynchronously
const fetchData = (id) => {
let promise;
return {
read() {
if (!promise) {
promise = new Promise(resolve => {
setTimeout(() => {
resolve({ id, name: `User ${id}` });
}, 1000);
});
}
if (promise) {
let status = 'pending';
let result;
const suspender = promise.then(
(r) => {
status = 'success';
result = r;
},
(e) => {
status = 'error';
result = e;
},
);
if (status === 'pending') {
throw suspender;
}
if (status === 'error') {
throw result;
}
return result;
}
},
};
};
const UserProfile = ({ userId }) => {
const user = fetchData(userId).read();
return (
<div>
<h2>User Profile</h2>
<p>ID: {user.id}</p>
<p>Name: {user.name}</p>
</div>
);
};
const App = () => (
<Suspense fallback={<p>Loading user data...</p>}>
<UserProfile userId={123} />
</Suspense>
);
export default App;
ãã®äŸã§ã¯ãfetchData
ããŠãŒã¶ãŒããŒã¿ãååŸããŠããéãUserProfile
ã¯ãµã¹ãã³ãããŸãã<Suspense>
ã³ã³ããŒãã³ãã¯ãããŒã¿ãæºåã§ãããŸã§ãLoading user data...ãã衚瀺ããŸãã
experimental_SuspenseListã®ç޹ä»
Reactã®å®éšçæ©èœã®äžéšã§ããexperimental_SuspenseList
ã³ã³ããŒãã³ãã¯ãè€æ°ã®<Suspense>
å¢çã衚瀺ãããé åºãå¶åŸ¡ããã¡ã«ããºã ãæäŸããŸããããã¯ãäžé£ã®ããŒãã£ã³ã°ç¶æ
ããããããæå³çã§èŠèŠçã«é
åçãªããŒãã£ã³ã°ã·ãŒã±ã³ã¹ãç·šæãããå Žåã«ç¹ã«åœ¹ç«ã¡ãŸãã
experimental_SuspenseList
ããªãå ŽåãSuspenseå¢çã¯ãåŸ
æ©ããŠããpromiseã解決ãããã¿ã€ãã³ã°ã«åºã¥ããŠãããäºæž¬äžå¯èœãªé åºã§è§£æ±ºãããŸããããã¯ãããã€ãããããŸãšãŸãã®ãªããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«ã€ãªããå¯èœæ§ããããŸããexperimental_SuspenseList
ã䜿çšãããšãSuspenseå¢çã衚瀺ãããé åºãæå®ã§ããäœæããã©ãŒãã³ã¹ãæ»ããã«ããããæå³çãªããŒãã£ã³ã°ã¢ãã¡ãŒã·ã§ã³ãäœæã§ããŸãã
experimental_SuspenseListã®äž»ãªå©ç¹
- å¶åŸ¡ãããããŒãã£ã³ã°é åºïŒ Suspenseãã©ãŒã«ããã¯ã衚瀺ãããé åºãæ£ç¢ºã«å®çŸ©ããŸãã
- æ¹åããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ïŒ ããã¹ã ãŒãºã§äºæž¬å¯èœãªããŒãã£ã³ã°äœéšãäœæããŸãã
- èŠèŠçéå±€ïŒ è«ççãªé åºã§ã³ã³ãã³ãã衚瀺ããããšã«ããããŠãŒã¶ãŒã®æ³šæãå°ããŸãã
- ããã©ãŒãã³ã¹ã®æé©åïŒ UIã®ããŸããŸãªéšåã®ã¬ã³ããªã³ã°ããããããšã§ãäœæããã©ãŒãã³ã¹ãåäžãããå¯èœæ§ããããŸãã
experimental_SuspenseListã®ä»çµã¿
experimental_SuspenseList
ã¯ããã®åã§ãã<Suspense>
ã³ã³ããŒãã³ãã®å¯èŠæ§ã調æŽããŸãã2ã€ã®äž»èŠãªããããã£ãåãå
¥ããŸãïŒ
- `revealOrder`ïŒ
<Suspense>
ãã©ãŒã«ããã¯ã衚瀺ãããã¹ãé åºãæå®ããŸããå¯èœãªå€ã¯æ¬¡ã®ãšããã§ãïŒ - `forwards`: ãã©ãŒã«ããã¯ã¯ãã³ã³ããŒãã³ãããªãŒã«çŸããé åºïŒäžããäžïŒã§è¡šç€ºãããŸãã
- `backwards`: ãã©ãŒã«ããã¯ã¯éã®é åºïŒäžããäžïŒã§è¡šç€ºãããŸãã
- `together`: ãã¹ãŠã®ãã©ãŒã«ããã¯ãåæã«è¡šç€ºãããŸãã
- `tail`ïŒ1ã€ããµã¹ãã³ããããšãã«ãæ®ãã®
<Suspense>
ã³ã³ããŒãã³ããã©ã®ããã«åŠçããããæ±ºå®ããŸããå¯èœãªå€ã¯æ¬¡ã®ãšããã§ãïŒ - `suspense`: çŸåšã®ãã®ã解決ããããŸã§ããã以äžã®ãã©ãŒã«ããã¯ã衚瀺ãããã®ãé²ããŸããïŒããã©ã«ãïŒ
- `collapsed`: æ®ãã®ãã©ãŒã«ããã¯ãå®å šã«é衚瀺ã«ããŸããçŸåšã®ããŒãã£ã³ã°ç¶æ ã®ã¿ã衚瀺ããŸãã
experimental_SuspenseListã®å®çšäŸ
experimental_SuspenseList
ã®åã瀺ãããã«ãããã€ãã®å®çšçãªäŸãèŠãŠã¿ãŸãããã
äŸ1ïŒForwards衚瀺é ã§ãããã£ãŒã«ããŒãžãèªã¿èŸŒã
ãŠãŒã¶ãŒè©³çްãæè¿ã®ã¢ã¯ãã£ããã£ãåéãªã¹ããªã©ãããã€ãã®ã»ã¯ã·ã§ã³ããããããã£ãŒã«ããŒãžãæ³åããŠã¿ãŠãã ãããexperimental_SuspenseList
ã䜿çšããŠããããã®ã»ã¯ã·ã§ã³ãç¹å®ã®é åºã§èªã¿èŸŒã¿ãäœæããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã
import React, { Suspense } from 'react';
import { unstable_SuspenseList as SuspenseList } from 'react'; // Import experimental API
const fetchUserDetails = (userId) => {
let promise;
return {
read() {
if (!promise) {
promise = new Promise(resolve => {
setTimeout(() => {
resolve({ id: userId, name: `User ${userId}`, bio: 'A passionate developer' });
}, 500);
});
}
if (promise) {
let status = 'pending';
let result;
const suspender = promise.then(
(r) => {
status = 'success';
result = r;
},
(e) => {
status = 'error';
result = e;
},
);
if (status === 'pending') {
throw suspender;
}
if (status === 'error') {
throw result;
}
return result;
}
},
};
};
const fetchRecentActivity = (userId) => {
let promise;
return {
read() {
if (!promise) {
promise = new Promise(resolve => {
setTimeout(() => {
resolve([
{ id: 1, activity: 'Posted a new photo' },
{ id: 2, activity: 'Commented on a post' },
]);
}, 700);
});
}
if (promise) {
let status = 'pending';
let result;
const suspender = promise.then(
(r) => {
status = 'success';
result = r;
},
(e) => {
status = 'error';
result = e;
},
);
if (status === 'pending') {
throw suspender;
}
if (status === 'error') {
throw result;
}
return result;
}
},
};
};
const UserDetails = ({ userId }) => {
const user = fetchUserDetails(userId).read();
return (
<div>
<h3>User Details</h3>
<p>Name: {user.name}</p>
<p>Bio: {user.bio}</p>
</div>
);
};
const RecentActivity = ({ userId }) => {
const activity = fetchRecentActivity(userId).read();
return (
<div>
<h3>Recent Activity</h3>
<ul>
{activity.map(item => (<li key={item.id}>{item.activity}</li>))}
</ul>
</div>
);
};
const FriendsList = ({ userId }) => {
// Placeholder - replace with actual data fetching
return <div><h3>Friends</h3><p>Loading friends...</p></div>;
}
const App = () => (
<SuspenseList revealOrder="forwards">
<Suspense fallback={<p>Loading user details...</p>}>
<UserDetails userId={123} />
</Suspense>
<Suspense fallback={<p>Loading recent activity...</p>}>
<RecentActivity userId={123} />
</Suspense>
<Suspense fallback={<p>Loading friends...</p>}>
<FriendsList userId={123} />
</Suspense>
</SuspenseList>
);
export default App;
ãã®äŸã§ã¯ãrevealOrder="forwards"
ããããã£ã«ããããLoading user details...ããã©ãŒã«ããã¯ãæåã«è¡šç€ºãããæ¬¡ã«ãLoading recent activity...ããã©ãŒã«ããã¯ããããŠãLoading Friends...ããã©ãŒã«ããã¯ã衚瀺ãããŸããããã«ãããããæ§é åãããçŽæçãªããŒãã£ã³ã°äœéšãçãŸããŸãã
äŸ2ïŒ`tail="collapsed"`ã䜿çšããŠåæããŒããã¯ãªãŒã³ã«ãã
æã«ã¯ãäžåºŠã«1ã€ã®ããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒã®ã¿ã衚瀺ãããå ŽåããããŸããtail="collapsed"
ããããã£ã䜿çšãããšããããå®çŸã§ããŸãã
import React, { Suspense } from 'react';
import { unstable_SuspenseList as SuspenseList } from 'react'; // Import experimental API
// ... (fetchUserDetails and UserDetails components from previous example)
const fetchRecentActivity = (userId) => {
let promise;
return {
read() {
if (!promise) {
promise = new Promise(resolve => {
setTimeout(() => {
resolve([
{ id: 1, activity: 'Posted a new photo' },
{ id: 2, activity: 'Commented on a post' },
]);
}, 700);
});
}
if (promise) {
let status = 'pending';
let result;
const suspender = promise.then(
(r) => {
status = 'success';
result = r;
},
(e) => {
status = 'error';
result = e;
},
);
if (status === 'pending') {
throw suspender;
}
if (status === 'error') {
throw result;
}
return result;
}
},
};
};
const RecentActivity = ({ userId }) => {
const activity = fetchRecentActivity(userId).read();
return (
<div>
<h3>Recent Activity</h3>
<ul>
{activity.map(item => (<li key={item.id}>{item.activity}</li>))}
</ul>
</div>
);
};
const FriendsList = ({ userId }) => {
// Placeholder - replace with actual data fetching
return <div><h3>Friends</h3><p>Loading friends...</p></div>;
}
const App = () => (
<SuspenseList revealOrder="forwards" tail="collapsed">
<Suspense fallback={<p>Loading user details...</p>}>
<UserDetails userId={123} />
</Suspense>
<Suspense fallback={<p>Loading recent activity...</p>}>
<RecentActivity userId={123} />
</Suspense>
<Suspense fallback={<p>Loading friends...</p>}>
<FriendsList userId={123} />
</Suspense>
</SuspenseList>
);
export default App;
tail="collapsed"
ã䜿çšãããšãæåã«ãLoading user details...ããã©ãŒã«ããã¯ã®ã¿ã衚瀺ãããŸãããŠãŒã¶ãŒè©³çްãããŒãããããšããLoading recent activity...ããã©ãŒã«ããã¯ã衚瀺ããã以äžåæ§ã«ç¶ããŸããããã«ãããããã¯ãªãŒã³ã§æ£ãããã®å°ãªãåæããŒãã£ã³ã°äœéšãçãŸããŸãã
äŸ3ïŒéèŠãªã³ã³ãã³ããåªå ããããã®`revealOrder="backwards"`
ã·ããªãªã«ãã£ãŠã¯ãæãéèŠãªã³ã³ãã³ããã³ã³ããŒãã³ãããªãŒã®æäžéšã«ããå ŽåããããŸãã`revealOrder="backwards"`ã䜿çšããŠããã®ã³ã³ãã³ãã®èªã¿èŸŒã¿ãæåã«åªå ãããããšãã§ããŸãã
import React, { Suspense } from 'react';
import { unstable_SuspenseList as SuspenseList } from 'react'; // Import experimental API
// ... (fetchUserDetails and UserDetails components from previous example)
const fetchRecentActivity = (userId) => {
let promise;
return {
read() {
if (!promise) {
promise = new Promise(resolve => {
setTimeout(() => {
resolve([
{ id: 1, activity: 'Posted a new photo' },
{ id: 2, activity: 'Commented on a post' },
]);
}, 700);
});
}
if (promise) {
let status = 'pending';
let result;
const suspender = promise.then(
(r) => {
status = 'success';
result = r;
},
(e) => {
status = 'error';
result = e;
},
);
if (status === 'pending') {
throw suspender;
}
if (status === 'error') {
throw result;
}
return result;
}
},
};
};
const RecentActivity = ({ userId }) => {
const activity = fetchRecentActivity(userId).read();
return (
<div>
<h3>Recent Activity</h3>
<ul>
{activity.map(item => (<li key={item.id}>{item.activity}</li>))}
</ul>
</div>
);
};
const FriendsList = ({ userId }) => {
// Placeholder - replace with actual data fetching
return <div><h3>Friends</h3><p>Loading friends...</p></div>;
}
const App = () => (
<SuspenseList revealOrder="backwards">
<Suspense fallback={<p>Loading user details...</p>}>
<UserDetails userId={123} />
</Suspense>
<Suspense fallback={<p>Loading recent activity...</p>}>
<RecentActivity userId={123} />
</Suspense>
<Suspense fallback={<p>Loading friends...</p>}>
<FriendsList userId={123} />
</Suspense>
</SuspenseList>
);
export default App;
ãã®å ŽåããLoading friends...ããã©ãŒã«ããã¯ãæåã«è¡šç€ºãããæ¬¡ã«ãLoading recent activity...ãããããŠãLoading user details...ãã衚瀺ãããŸããããã¯ãåéãªã¹ããããŒãžã®æãéèŠãªéšåãšèŠãªãããã§ããã ãæ©ãããŒãããå¿ èŠãããå Žåã«äŸ¿å©ã§ãã
ã°ããŒãã«ãªèæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹
ã°ããŒãã«ãªã¢ããªã±ãŒã·ã§ã³ã§experimental_SuspenseList
ã䜿çšããéã«ã¯ã以äžã®èæ
®äºé
ã念é ã«çœ®ããŠãã ããïŒ
- ãããã¯ãŒã¯é å»¶ïŒ ç°ãªãå°ççå Žæã«ãããŠãŒã¶ãŒã¯ãããŸããŸãªãããã¯ãŒã¯é å»¶ãçµéšããŸããäžçäžã®ãŠãŒã¶ãŒã®é å»¶ãæå°éã«æããããã«ãã³ã³ãã³ãããªããªãŒãããã¯ãŒã¯ïŒCDNïŒã®äœ¿çšãæ€èšããŠãã ããã
- ããŒã¿ã®ããŒã«ã©ã€ãŒãŒã·ã§ã³ïŒ ã¢ããªã±ãŒã·ã§ã³ãããŒã«ã©ã€ãºãããããŒã¿ã衚瀺ããå ŽåãããŒã¿ååŸããã»ã¹ããŠãŒã¶ãŒã®ãã±ãŒã«ãèæ
®ããŠããããšã確èªããŠãã ããã
Accept-Language
ããããŒãŸãã¯åæ§ã®ã¡ã«ããºã ã䜿çšããŠãé©åãªããŒã¿ãååŸããŸãã - ã¢ã¯ã»ã·ããªãã£ïŒ ãã©ãŒã«ããã¯ãã¢ã¯ã»ã¹å¯èœã§ããããšã確èªããŠãã ãããé©åãªARIA屿§ãšã»ãã³ãã£ãã¯HTMLã䜿çšããŠãé害ã®ãããŠãŒã¶ãŒã«è¯ãäœéšãæäŸããŸããããšãã°ããã©ãŒã«ããã¯ã«
role="alert"
屿§ãæäŸããŠãäžæçãªããŒãã£ã³ã°ç¶æ ã§ããããšã瀺ããŸãã - ããŒãã£ã³ã°ç¶æ ã®ãã¶ã€ã³ïŒ ããŒãã£ã³ã°ç¶æ ãèŠèŠçã«é åçã§æ å ±éã®å€ããã®ã«ãã¶ã€ã³ããŠãã ãããããã°ã¬ã¹ããŒãã¹ãããŒããŸãã¯ãã®ä»ã®èŠèŠçãªæãããã䜿çšããŠãããŒã¿ãããŒããããŠããããšã瀺ããŸããäžè¬çãªãLoading...ãã¡ãã»ãŒãžã¯ããŠãŒã¶ãŒã«æçšãªæ å ±ãæäŸããªããããé¿ããŠãã ããã
- ãšã©ãŒãã³ããªã³ã°ïŒ ããŒã¿ååŸã倱æããå Žåã«é©åã«åŠçããããã«ãå ç¢ãªãšã©ãŒãã³ããªã³ã°ãå®è£ ããŠãã ããããŠãŒã¶ãŒã«æçãªãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããªã¯ãšã¹ããå詊è¡ãããªãã·ã§ã³ãæäŸããŸãã
Suspense管çã®ãã¹ããã©ã¯ãã£ã¹
- 詳现ãªSuspenseå¢çïŒ å°ãããæç¢ºã«å®çŸ©ããã
<Suspense>
å¢çã䜿çšããŠãããŒãã£ã³ã°ç¶æ ãåé¢ããŸããããã«ãããUIã®ããŸããŸãªéšåãç¬ç«ããŠããŒãã§ããŸãã - éå°ãªSuspenseãé¿ããïŒ ã¢ããªã±ãŒã·ã§ã³å
šäœãåäžã®
<Suspense>
å¢çã§ã©ããããªãã§ãã ãããUIã®ã»ãã®äžéšã§ãããŒããé ãå ŽåããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæªåããå¯èœæ§ããããŸãã - ããŒã¿ååŸã©ã€ãã©ãªã䜿çšããïŒ
react-cache
ãrelay
ã®ãããªããŒã¿ååŸã©ã€ãã©ãªã䜿çšããŠãããŒã¿ååŸãšSuspenseãšã®çµ±åãç°¡çŽ åããããšãæ€èšããŠãã ããã - ããŒã¿ååŸã®æé©åïŒ è»¢éããå¿ èŠã®ããããŒã¿éãæå°éã«æããããã«ãããŒã¿ååŸããžãã¯ãæé©åããŸãããã£ãã·ã³ã°ãããŒãžããŒã·ã§ã³ãGraphQLãªã©ã®æè¡ã䜿çšããŠãããã©ãŒãã³ã¹ãåäžãããŸãã
- 培åºçãªãã¹ãïŒ Suspenseã®å®è£ ãããŸããŸãªã·ããªãªã§æåŸ ã©ããã«åäœããããšã確èªããããã«ã培åºçã«ãã¹ãããŠãã ãããããŸããŸãªãããã¯ãŒã¯é å»¶ããšã©ãŒæ¡ä»¶ã§ãã¹ãããŸãã
é«åºŠãªãŠãŒã¹ã±ãŒã¹
åºæ¬çãªäŸãè¶
ããŠãexperimental_SuspenseList
ã¯ããé«åºŠãªã·ããªãªã§äœ¿çšã§ããŸãïŒ
- åçãªã³ã³ãã³ãã®èªã¿èŸŒã¿ïŒ ãŠãŒã¶ãŒã®æäœãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ã«åºã¥ããŠã
<Suspense>
ã³ã³ããŒãã³ããåçã«è¿œå ãŸãã¯åé€ããŸãã - ãã¹ããããSuspenseListïŒ
experimental_SuspenseList
ã³ã³ããŒãã³ãããã¹ãããŠãè€éãªããŒãã£ã³ã°éå±€ãäœæããŸãã - ãã©ã³ãžã·ã§ã³ãšã®çµ±åïŒ
experimental_SuspenseList
ãReactã®useTransition
ããã¯ãšçµã¿åãããŠãããŒãã£ã³ã°ç¶æ ãšããŒããããã³ã³ãã³ãéã®ã¹ã ãŒãºãªãã©ã³ãžã·ã§ã³ãäœæããŸãã
å¶éãšèæ ®äºé
- å®éšçãªAPIïŒ
experimental_SuspenseList
ã¯å®éšçãªAPIã§ãããå°æ¥ã®Reactã®ããŒãžã§ã³ã§å€æŽãããå¯èœæ§ããããŸããæ¬çªã¢ããªã±ãŒã·ã§ã³ã§ã®äœ¿çšã«ã¯æ³šæãå¿ èŠã§ãã - è€éãïŒ Suspenseå¢çã®ç®¡çã¯ãç¹ã«å€§èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã§ã¯è€éã«ãªãå¯èœæ§ããããŸããããã©ãŒãã³ã¹ã®ããã«ããã¯ãäºæããªãåäœãé¿ããããã«ãSuspenseã®å®è£ ãæ éã«èšç»ããŠãã ããã
- ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒ Suspenseã䜿çšãããµãŒããŒãµã€ãã¬ã³ããªã³ã°ã«ã¯ãæ éãªèæ ®ãå¿ èŠã§ãããµãŒããŒãµã€ãã®ããŒã¿ååŸããžãã¯ãSuspenseãšäºææ§ãããããšã確èªããŠãã ããã
çµè«
experimental_SuspenseList
ã¯ãReactã¢ããªã±ãŒã·ã§ã³ã«ãããSuspense管çãæé©åããããã®åŒ·åãªããŒã«ãæäŸããŸããSuspenseãã©ãŒã«ããã¯ã衚瀺ãããé åºãå¶åŸ¡ããããšã«ãããããã¹ã ãŒãºã§äºæž¬å¯èœããã€èŠèŠçã«é
åçãªããŒãã£ã³ã°äœéšãäœæã§ããŸããããã¯å®éšçãªAPIã§ãããReactã«ããéåæUIéçºã®æªæ¥ãå£éèŠããŠãããŸãããã®å©ç¹ããŠãŒã¹ã±ãŒã¹ãããã³å¶éãçè§£ããããšã§ããã®èœåã广çã«æŽ»çšããã°ããŒãã«ãªã¹ã±ãŒã«ã§ã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããããšãã§ããŸãã