--- title: Use immediate Option Instead of Duplicate Initial Call impact: LOW impactDescription: Duplicate code for initial call and watch callback reduces maintainability type: efficiency tags: [vue3, watch, watchers, immediate, best-practices, DRY] --- # Use immediate Option Instead of Duplicate Initial Call **Impact: LOW** - Calling a function manually at setup and also in a watcher leads to duplicate code. The `immediate: true` option runs the watcher callback immediately with the current value, combining both behaviors. ## Task Checklist - [ ] Use `{ immediate: true }` instead of calling handler in onMounted/created - [ ] Consider `watchEffect` as an alternative (always runs immediately) - [ ] Remember immediate callback receives `undefined` as oldValue on first run **Incorrect:** ```vue ``` ```javascript // Options API - BAD: Duplicate in created and watch export default { data() { return { userId: 1, userData: null }; }, created() { this.loadUser(); // Initial call }, watch: { userId() { this.loadUser(); // On change - duplicate! }, }, methods: { async loadUser() { const response = await fetch(`/api/users/${this.userId}`); this.userData = await response.json(); }, }, }; ``` **Correct:** ```vue ``` ```javascript // Options API - GOOD: Using immediate option export default { data() { return { userId: 1, userData: null }; }, watch: { userId: { async handler(newId) { const response = await fetch(`/api/users/${newId}`); this.userData = await response.json(); }, immediate: true, }, }, }; ``` ## Alternative: watchEffect ```vue ``` ## Handling oldValue on Initial Run ```vue ``` ## One-Time Watch with once Option ```vue ``` ## Reference - [Vue.js Watchers - Eager Watchers](https://vuejs.org/guide/essentials/watchers.html#eager-watchers)