enabled: !!dependency là pattern chuẩn cho dependent queries — query không fetch cho đến khi dependency có giá trị; enabled: false + refetch() cho lazy queries triggered by user action. enabled option kiểm soát khi nào query được phép chạy — là boolean hoặc function trả về boolean.
Khi enabled: false, query ở trạng thái 'disabled': không auto-fetch, status là 'pending' với fetchStatus: 'idle' (không phải loading).
Khi enabled chuyển từ false sang true, query tự động fetch ngay.
Use cases:
- Dependent queries — chỉ fetch khi dependency sẵn sàng:
enabled: !!userId && !!orgId. - Lazy queries — chỉ fetch khi user trigger:
const [enabled, setEnabled] = useState(false)→ button onClick:setEnabled(true). - Conditional skip — skip query dựa trên route hay feature flag.
- Pause queries khi offline:
enabled: isOnline
Pattern với TypeScript: khi enabled: !!userId, TypeScript vẫn thấy userId có thể undefined trong queryFn — workaround: queryFn: () => fetchUser(userId!) hoặc queryFn: () => fetchUser(userId as string).
Lưu ý: enabled: someExpensiveCheck() gọi mỗi render — wrap trong useMemo nếu check tốn kém. isLoading với disabled query: isLoading = true nếu enabled=false và chưa có data (status=pending) — check fetchStatus === 'idle' để phân biệt disabled vs loading.
enabled: !!dependency is the standard pattern for dependent queries — the query won't fetch until the dependency has a value; enabled: false + refetch() enables lazy queries triggered by user action.
- The enabled option controls whether a query should automatically run.
- When enabled is false, the query is in a 'disabled' state — it does not fetch, does not refetch on window focus, and does not retry on error.
- Use cases: Dependent queries — wait for a prerequisite value before fetching: enabled: !!userId fetches only after userId is defined; Conditional fetching — fetch only when certain conditions are met: enabled: isLoggedIn; Lazy queries — controlled by user action (search queries triggered by button click); Form-driven queries — fetch based on valid form state.
- Disabled queries still show cached data if available.
- To trigger a disabled query manually: const { refetch } = useQuery({ ..., enabled: false }); call refetch() on user action.
- In v5, enabled: false combined with placeholderData can show previous results while the query is paused.