vue-debug-guides
Vue 3 debugging and error handling for runtime errors, warnings, async failures, and SSR/hydration issues. Use when diagnosing or fixing Vue issues.
By vuejs-ai · 24,585 installs
npx skills add vuejs-ai/skills --skill vue-debug-guides
Source repository · Upstream listing
Vue 3 debugging and error handling for runtime issues, warnings, async failures, and hydration bugs.
For development best practices and common gotchas, use vue best practices .
Reactivity
Tracing unexpected re renders and state updates → See [reactivity debugging hooks](reference/reactivity debugging hooks.md)
Ref values not updating due to missing .value access → See [ref value access](reference/ref value access.md)
State stops updating after destructuring reactive objects → See [reactive destructuring](reference/reactive destructuring.md)
Refs inside arrays, Maps, or Sets not unwrapping → See [refs in collections need value](reference/refs in collections need value.md)
Nested refs rendering as [object Object] in templates → See [template ref unwrapping top level](reference/template ref unwrapping top level.md)
Reactive proxy identity comparisons always return false → See [reactivity proxy identity hazard](reference/reactivity proxy identity hazard.md)
Third party instances breaking when proxied → See [reactivity markraw for non reactive](reference/reactivity markraw for non reactive.md)
Watchers only firing once per tick unexpectedly → See [reactivity same tick batching](reference/reactivity same tick batching.md)
Computed
Computed getter triggers mutations or requests unexpectedly → See [computed no side effects](reference/computed no side effects.md)
Mutating computed values causes changes to disappear → See [computed return value readonly](reference/computed return value readonly.md)
Computed value never updates after conditional logic → See [computed conditional dependencies](reference/computed conditional dependencies.md)
Sorting or reversing arrays breaks original state → See [computed array mutation](reference/computed array mutation.md)
Passing parameters to computed properties fails → See [computed no parameters](reference/computed no parameters.md)
Watchers
Async operations overwriting with stale data → See [watch async cleanup](reference/watch async cleanup.md)
Creating watchers inside async callbacks → See [watch async creation memory leak](reference/watch async creation memory leak.md)
Watcher never triggers for reactive object properties → See [watch reactive property getter](reference/watch reactive property getter.md)
Async watchEffect misses dependencies after await → See [watcheffect async dependency tracking](reference/watcheffect async dependency tracking.md)
DOM reads are stale inside watcher callbacks → See [watch flush timing](reference/watch flush timing.md)
Deep watchers report identical old/new values → See [watch deep same object reference](reference/watch deep same object reference.md)
watchEffect runs before template refs update → See [watcheffect flush post for refs](reference/watcheffect flush post for refs.md)
Components
Child component throws "component not found" error → See [local components not in descendants](reference/local components not in descendants.md)
Click listener doesn't fire on custom component → See [click events on components](reference/click events on components.md)
Parent can't access child ref data in script setup → See [component ref requires defineexpose](reference/component ref requires defineexpose.md)
HTML template parsing breaks Vue component syntax → See [in dom template parsing caveats](reference/in dom template parsing caveats.md)
Wrong component renders due to naming collisions → See [component naming conflicts](reference/component naming conflicts.md)
Parent styles don't apply to multi root component → See [multi root component class attrs](reference/multi root component class attrs.md)
Props & Emits
Variables referenced in defineProps cause errors → See [prop defineprops scope limitation](reference/prop defineprops scope limitation.md)
Component emits undeclared event causing warnings → See [declare emits for documentation](reference/declare emits for documentation.md)
defineEmits used inside function or conditional → See [defineEmits must be top level](reference/defineEmits must be top level.md)
defineEmits has both type and runtime arguments → See [defineEmits no runtime and type mixed](reference/defineEmits no runtime and type mixed.md)
Native event listeners not responding to clicks → See [native event collision with emits](reference/native event collision with emits.md)
Component event fires twice when clicking → See [undeclared emits double firing](reference/undeclared emits double firing.md)
Templates
Getting template compilation errors with statements → See [template expressions restrictions](reference/template expressions restrictions.md)
"Cannot read property of undefined" runtime errors → See [v if null check order](reference/v if null check order.md)
Dynamic directive arguments not working properly → See [dynamic argument constraints](reference/dynamic argument constraints.md)
v else elements rendering unconditionally always → See [v else must follow v if](reference/v else must follow v if.md)
Mixing v if with v for causes precedence bugs and migration breakage → See [no v if with v for](reference/no v if with v for.md)
Template function calls mutating state cause unpredictable re render bugs → See [template functions no side effects](reference/template functions no side effects.md)
Child components in loops showing undefined data → See [v for component props](reference/v for component props.md)
Array order changing after sorting or reversing → See [v for computed reverse sort](reference/v for computed reverse sort.md)
List items disappearing or swapping state unexpectedly → See [v for key attribute](reference/v for key attribute.md)
Getting off by one errors with range iteration → See [v for range starts at one](reference/v for range starts at one.md)
v show or v else not working on template elements → See [v show template limitation](reference/v show template limitation.md)
Template Refs
Ref becomes null when element is conditionally hidden → See [template ref null with v if](reference/template ref null with v if.md)
Ref array indices don't match data array in loops → See [template ref v for order](reference/template ref v for order.md)
Refactoring template ref names breaks silently in code → See [use template ref vue35](reference/use template ref vue35.md)
Forms & v model
Initial form values not showing when using v model → See [v model ignores html attributes](reference/v model ignores html attributes.md)
Textarea content changes not updating the ref → See [textarea no interpolation](reference/textarea no interpolation.md)
iOS users cannot select dropdown first option → See [select initial value ios bug](reference/select initial value ios bug.md)
Parent and child components have different values → See [define model default value sync](reference/define model default value sync.md)
Object property changes not syncing to parent → See [definemodel object mutation no emit](reference/definemodel object mutation no emit.md)
Real time search/validation broken for Chinese/Japanese input → See [v model ime composition](reference/v model ime composition.md)
Number input returns empty string instead of zero → See [v model number modifier behavior](reference/v model number modifier behavior.md)
Custom checkbox values not submitted in forms → See [checkbox true false value form submission](reference/checkbox true false value form submission.md)
Events & Modifiers
Chaining multiple event modifiers produces unexpected results → See [event modifier order matters](reference/event modifier order matters.md)
Keyboard shortcuts don't fire with system modifier keys → See [keyup modifier timing](reference/keyup modifier timing.md)
Keyboard shortcuts fire with unintended modifier combinations → See [exact modifier for precise shortcuts](reference/exact modifier for precise shortcuts.md)
Combining passive and prevent modifiers breaks event behavior → See [no passive with prevent](reference/no passive with prevent.md)
Lifecycle
Memory leaks from unremoved event listeners → See [cleanup side effects](reference/cleanup side effects.md)
DOM access fails before component mounts → See [lifecycle dom access timing](reference/lifecycle dom access timing.md)
DOM reads return stale values after state changes → See [dom update timing nexttick](reference/dom update timing nexttick.md)
SSR rendering differs from client hydration → See [lifecycle ssr awareness](reference/lifecycle ssr awareness.md)
Lifecycle hooks registered asynchronously never run → See [lifecycle hooks synchronous registration](reference/lifecycle hooks synchronous registration.md)
Slots
Accessing child component data in slot content returns undefined values → See [slot render scope parent only](reference/slot render scope parent only.md)
Mixing named and scoped slots together causes compilation errors → See [slot named scoped explicit default](reference/slot named scoped explicit default.md)
Using v slot on native HTML elements causes compilation errors → See [slot v slot on components or templates only](reference/slot v slot on components or templates only.md)
Unexpected content placement from implicit default slot behavior → See [slot implicit default content](reference/slot implicit default content.md)
Scoped slot props missing expected name property → See [slot name reserved prop](reference/slot name reserved prop.md)
Wrapper components breaking child slot functionality → See [slot forwarding to child components](reference/slot forwarding to child components.md)
Provide/Inject
Calling provide after async operations fails silently → See [provide inject synchronous setup](reference/provide inject synchronous setup.md)
Tracing where provided values come from → See [provide inject debugging challenges](reference/provide inject debugging challenges.md)
Injected values not updating when provider changes → See [provide inject reactivity not automatic](reference/provide inject reactivity not automatic.md)
Multiple components share same default object → See [provide inject default value factory](reference/provide inject default value factory.md)
Attrs
Both internal and fallthrough event handlers execute → See [attrs event listener merging](reference/attrs event listener merging.md)
Explicit attributes overwritten by fallthrough values → See [fallthrough attrs overwrite vue3](reference/fallthrough attrs overwrite vue3.md)
Attributes applying to wrong element in wrappers → See [inheritattrs false for wrapper components](reference/inheritattrs false for wrapper components.md)
Composables
Composable called outside setup context or asynchronously → See [composable call location restrictions](reference/composable call location restrictions.md)
Composable reactive dependency not updating when input changes → See [composable tovalue inside watcheffect](reference/composable tovalue inside watcheffect.md)
Composable mutates external state unexpectedly → See [composable avoid hidden side effects](reference/composable avoid hidden side effects.md)
Destructuring composable returns breaks reactivity unexpectedly → See [composable naming return pattern](reference/composable naming return pattern.md)
Composition API
Lifecycle hooks failing silently after async operations → See [composition api script setup async context](reference/composition api script setup async context.md)
Parent component refs unable to access exposed properties → See [define expose before await](reference/define expose before await.md)
Functional programming patterns break expected Vue reactivity behavior → See [composition api not functional programming](reference/composition api not functional programming.md)
React Hook mental model causes incorrect Composition API usage → See [composition api vs react hooks differences](reference/composition api vs react hooks differences.md)
Animation