--- 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)