--- title: Choose watch vs watchEffect Based on Dependency Control Needs impact: MEDIUM impactDescription: Wrong choice leads to unnecessary re-runs or missed dependency tracking type: efficiency tags: [vue3, watch, watchEffect, watchers, reactivity, best-practices] --- # Choose watch vs watchEffect Based on Dependency Control Needs **Impact: MEDIUM** - Using `watch` when `watchEffect` would be cleaner leads to repetitive code. Using `watchEffect` when `watch` is needed can cause unexpected re-runs or missed dependencies (especially with async). Use `watchEffect` for simple cases where the callback uses the same state as what should trigger it. Use `watch` when you need precise control over what triggers the callback, access to old values, or lazy execution. ## Task Checklist - [ ] Use `watchEffect` when callback logic uses the same state it should react to - [ ] Use `watch` when you need old value comparison - [ ] Use `watch` when you need lazy execution (not immediate) - [ ] Use `watch` for async callbacks with dependencies after await - [ ] Use `watch` when callback should not run on initial mount ## Comparison Table | Feature | `watch` | `watchEffect` | |---------|---------|---------------| | Dependency tracking | Explicit (you specify) | Automatic (uses accessed properties) | | Lazy by default | Yes (runs only on change) | No (runs immediately) | | Access old value | Yes | No | | Async dependency tracking | Full control | Only before first await | | Multiple sources | Array syntax | Automatic | **When to prefer `watchEffect`:** ```vue ``` **When to prefer `watch`:** ```vue ``` ## Avoid Redundant Code with watchEffect ```vue ``` ## Use watch for Lazy Behavior ```vue ``` ## Use watch for Old Value Comparison ```vue ``` ## Use watch for Complex Async Dependencies ```vue ``` ## Reference - [Vue.js Watchers - watch vs. watchEffect](https://vuejs.org/guide/essentials/watchers.html#watch-vs-watcheffect)