useAsync
مدیریت وضعیت یک عملیات async (loading / data / error) بدون کتابخانهی سنگین
معرفی
هوک useAsync یک هوکِ سبک برای مدیریت وضعیتِ یک عملیاتِ async یکباره است: loading، data و error را نگه میدارد و یک تابعِ پایدارِ run میدهد.
اگر به caching، حذفِ درخواستهای تکراری، retry، mutation یا optimistic update نیاز دارید، TanStack Query را ترجیح دهید — این هوک عمداً کوچک مانده است.
چه زمانی استفاده کنیم
- یک fetch ساده در یک کامپوننت بدون نیاز به cache سراسری
- صفحهای که فقط یکبار داده میگیرد و حالتهای loading/error را نشان میدهد
چه زمانی استفاده نکنیم
- دادهای که در چند جا share و cache میشود → TanStack Query
- نیاز به retry/refetch خودکار
استفاده
import { useAsync } from '@partodata/ui'
function UserCard({ id }) {
const { data, status, run } = useAsync<User>()
React.useEffect(() => {
run(() => fetch(`/api/users/${id}`).then((r) => r.json()))
}, [id, run])
if (status === 'loading') return <Skeleton className="h-20 w-full" />
if (status === 'error') return <ErrorState onRetry={() => run(() => fetchUser(id))} />
return <ProfileCard user={data} />
}run پایدار است (با useCallback)، پس میتوانید با خیال راحت آن را در آرایهی وابستگیِ useEffect بگذارید. اگر در حین یک درخواست، درخواستِ تازهای run شود، نتیجهی قدیمی نادیده گرفته میشود (بدون race).
پارامترها
امضا: useAsync<T = unknown>(initialData?) — نوع نتیجه را با جنریک T مشخص کنید (مثل useAsync<User>()).
| پارامتر | نوع | پیشفرض | توضیح |
|---|---|---|---|
initialData | T | null | null | مقدار اولیهی data — پیش از اولین run و پس از reset همین مقدار برمیگردد |
مقدار بازگشتی
| فیلد | نوع | توضیح |
|---|---|---|
data | T | null | نتیجهی آخرین عملیاتِ موفق |
error | unknown | خطای آخرین عملیات |
status | 'idle' | 'loading' | 'success' | 'error' | وضعیتِ فعلی |
isLoading | boolean | میانبُرِ status === 'loading' (و مشابه برای بقیه) |
run | (op: () => Promise<T>) => Promise<T | undefined> | اجرای عملیات؛ نتیجهی قبلیِ در حالِ اجرا را لغو میکند |
reset | () => void | بازگشت به حالتِ idle |
هوکهای مرتبط
- نمایشِ حالتِ خطا → ErrorState
- نمایشِ حالتِ بارگذاری → Skeleton