What if you could write your API fetch code once and never worry about repeating it again?
Why Composable for API calls (useFetch pattern) in Vue? - Purpose & Use Cases
Imagine you have to fetch data from an API in multiple parts of your Vue app. You write the same fetch code again and again inside each component.
Copying fetch logic everywhere makes your code messy, hard to update, and easy to break. If the API changes, you must fix every component manually.
Composable functions like useFetch let you write the fetch logic once and reuse it anywhere. This keeps your code clean, consistent, and easy to maintain.
fetch('https://api.example.com/data').then(res => res.json()).then(data => { this.data = data })const { data, error } = useFetch('https://api.example.com/data')You can easily share and manage API calls across your app with less code and fewer bugs.
In a shopping app, you fetch product lists, user info, and order history using the same useFetch composable, making updates simple and fast.
Manual API calls repeated in components cause clutter and errors.
Composable useFetch centralizes fetch logic for reuse.
This leads to cleaner, easier-to-maintain Vue apps.
Practice
useFetch in Vue?Solution
Step 1: Understand composable role
A composable in Vue is a reusable function that encapsulates logic, often for state or side effects.Step 2: Identify useFetch purpose
TheuseFetchcomposable specifically handles API calls and manages reactive states like loading and error.Final Answer:
To fetch data from an API and manage loading and error states reactively -> Option AQuick Check:
Composable useFetch = fetch + reactive states [OK]
- Confusing composables with styling or routing
- Thinking composables only handle UI rendering
- Assuming composables are Vue components
useFetch composable in a Vue component?Solution
Step 1: Check import syntax
The composable is usually exported from a file and imported with curly braces if it's a named export.Step 2: Using the composable
CallinguseFetch(url)returns reactive properties likedataanderror.Final Answer:
import { useFetch } from '@/composables/useFetch'; const { data, error } = useFetch(url); -> Option CQuick Check:
Correct import + destructure = import { useFetch } from '@/composables/useFetch'; const { data, error } = useFetch(url); [OK]
- Importing from wrong path or package
- Using default import when composable is named export
- Not destructuring returned reactive properties
useFetch composable usage:const { data, loading, error } = useFetch('https://api.example.com/items');What will
loading.value be immediately after calling useFetch?Solution
Step 1: Understand loading state in useFetch
Loading usually starts as true when the fetch begins to indicate data is being fetched.Step 2: Check initial loading value
Immediately after calling, loading is true until data or error updates it to false.Final Answer:
true -> Option BQuick Check:
Loading starts true during fetch [OK]
- Assuming loading starts false before fetch
- Confusing loading with data presence
- Expecting loading to be null or undefined
useFetch composable snippet?export function useFetch(url) {
const data = ref(null);
const loading = ref(false);
const error = ref(null);
fetch(url)
.then(res => res.json())
.then(json => { data.value = json; loading.value = false; })
.catch(err => { error.value = err; loading.value = false; });
loading.value = true;
return { data, loading, error };
}Solution
Step 1: Analyze loading state timing
Loading is set to false inside fetch callbacks but set to true after fetch starts, which can cause timing issues.Step 2: Identify race condition
Because loading is set to true after fetch call, it might overwrite loading false set in callbacks if fetch resolves quickly.Final Answer:
Setting loading.value = true after fetch call starts causes race condition -> Option AQuick Check:
Loading state timing error = Setting loading.value = true after fetch call starts causes race condition [OK]
- Setting loading true after fetch call instead of before
- Confusing async/await with promises syntax errors
- Assuming initial data type must be array
useFetch composable that automatically retries fetching up to 3 times if the API call fails. Which approach correctly adds this retry logic?Solution
Step 1: Understand retry logic needs repeated fetch calls
Retry means calling fetch again if it fails, up to a limit.Step 2: Implement retry inside composable
A recursive or loop function inside composable can retry fetch on error until max retries.Step 3: Evaluate other options
Ignoring errors or retrying outside composable breaks encapsulation; try/catch without retry misses requirement.Final Answer:
Use a recursive function inside the composable that calls fetch again on error until max retries reached -> Option DQuick Check:
Retry logic inside composable = Use a recursive function inside the composable that calls fetch again on error until max retries reached [OK]
- Retrying outside composable losing reactive state control
- Ignoring errors instead of retrying
- Not limiting retry attempts causing infinite loops
Ready to prove it?
Pass the test and this pattern moves unknown
