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
propμ μ 곡νμ¬ μ»΄ν¬λνΈκ° μΌμ μ€λ¨λ λμ νμν 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;
μ΄ μμ μμ UserProfile
μ fetchData
κ° μ¬μ©μ λ°μ΄ν°λ₯Ό κ°μ Έμ€λ λμ μΌμ μ€λ¨λ©λλ€. <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>
μ»΄ν¬λνΈμ κ°μμ±μ μ‘°μ ν©λλ€. λ κ°μ§ μ£Όμ propμ λ°μ΅λλ€:
- `revealOrder`:
<Suspense>
ν΄λ°±μ΄ νμλμ΄μΌ νλ μμλ₯Ό μ§μ ν©λλ€. κ°λ₯ν κ°μ λ€μκ³Ό κ°μ΅λλ€: - `forwards`: ν΄λ°±μ΄ μ»΄ν¬λνΈ νΈλ¦¬ μμλλ‘(μμμ μλλ‘) νμλ©λλ€.
- `backwards`: ν΄λ°±μ΄ μμμΌλ‘(μλμμ μλ‘) νμλ©λλ€.
- `together`: λͺ¨λ ν΄λ°±μ΄ λμμ νμλ©λλ€.
- `tail`: νλκ° μΌμ μ€λ¨λ λ λλ¨Έμ§
<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"
propμ "Loading user details..." ν΄λ°±μ΄ λ¨Όμ νμλκ³ , κ·Έ λ€μ "Loading recent activity..." ν΄λ°±, κ·Έλ¦¬κ³ "Loading Friends..." ν΄λ°±μ΄ μμλλ‘ νμλλλ‘ λ³΄μ₯ν©λλ€. μ΄λ λ³΄λ€ κ΅¬μ‘°νλκ³ μ§κ΄μ μΈ λ‘λ© κ²½νμ λ§λ€μ΄μ€λλ€.
μμ 2: λ κΉλν μ΄κΈ° λ‘λλ₯Ό μν΄ `tail="collapsed"` μ¬μ©νκΈ°
λλ‘λ ν λ²μ νλμ λ‘λ© νμκΈ°λ§ λ³΄μ¬μ£Όκ³ μΆμ μ μμ΅λλ€. tail="collapsed"
propμ μ¬μ©νλ©΄ μ΄λ₯Ό λ¬μ±ν μ μμ΅λλ€.
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"
μμ±μ μ 곡νμ¬ μμ λ‘λ© μνμμ λνλΌ μ μμ΅λλ€. - λ‘λ© μν λμμΈ: λ‘λ© μνλ₯Ό μκ°μ μΌλ‘ λ§€λ ₯μ μ΄κ³ μ μ΅νκ² λμμΈνμμμ€. μ§νλ₯ νμμ€, μ€νΌλ λλ κΈ°ν μκ°μ μ νΈλ₯Ό μ¬μ©νμ¬ λ°μ΄ν°κ° λ‘λλκ³ μμμ λνλ΄μμμ€. μ¬μ©μμκ² μ μ©ν μ 보λ₯Ό μ 곡νμ§ μλ μΌλ°μ μΈ "λ‘λ© μ€..." λ©μμ§ μ¬μ©μ νΌνμμμ€.
- μ€λ₯ μ²λ¦¬: λ°μ΄ν° νμΉμ΄ μ€ν¨νλ κ²½μ°λ₯Ό μ μμ μΌλ‘ μ²λ¦¬νκΈ° μν΄ κ°λ ₯ν μ€λ₯ μ²λ¦¬ κΈ°λ₯μ ꡬννμμμ€. μ¬μ©μμκ² μ μ΅ν μ€λ₯ λ©μμ§λ₯Ό νμνκ³ μμ²μ μ¬μλν μ μλ μ΅μ μ μ 곡νμμμ€.
Suspense κ΄λ¦¬λ₯Ό μν λͺ¨λ² μ¬λ‘
- μΈλΆνλ Suspense κ²½κ³: μκ³ μ μ μλ
<Suspense>
κ²½κ³λ₯Ό μ¬μ©νμ¬ λ‘λ© μνλ₯Ό 격리νμμμ€. μ΄λ₯Ό ν΅ν΄ UIμ λ€λ₯Έ λΆλΆμ λ 립μ μΌλ‘ λ‘λν μ μμ΅λλ€. - κ³Όλν Suspense νΌνκΈ°: μ 체 μ ν리μΌμ΄μ
μ λ¨μΌ
<Suspense>
κ²½κ³λ‘ κ°μΈμ§ λ§μμμ€. UIμ μμ λΆλΆμ΄λΌλ λ‘λκ° λ리면 μ’μ§ μμ μ¬μ©μ κ²½νμΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€. - λ°μ΄ν° νμΉ λΌμ΄λΈλ¬λ¦¬ μ¬μ©: λ°μ΄ν° νμΉ λ° Suspenseμμ ν΅ν©μ λ¨μννκΈ° μν΄
react-cache
λrelay
μ κ°μ λ°μ΄ν° νμΉ λΌμ΄λΈλ¬λ¦¬ μ¬μ©μ κ³ λ €νμμμ€. - λ°μ΄ν° νμΉ μ΅μ ν: μ μ‘ν΄μΌ νλ λ°μ΄ν°μ μμ μ΅μννλλ‘ λ°μ΄ν° νμΉ λ‘μ§μ μ΅μ ννμμμ€. μΊμ±, νμ΄μ§λ€μ΄μ , 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 κ°λ°μ λ―Έλλ₯Ό μΏλ³Ό μ μκ² ν΄μ€λλ€. κ·Έ μ΄μ , μ¬μ© μ¬λ‘, κ·Έλ¦¬κ³ μ ν μ¬νμ μ΄ν΄νλ©΄ κ·Έ κΈ°λ₯μ ν¨κ³Όμ μΌλ‘ νμ©νκ³ μ μΈκ³ κ·λͺ¨μμ μ ν리μΌμ΄μ
μ μ¬μ©μ κ²½νμ ν₯μμν¬ μ μμ κ²μ
λλ€.