@pythoughts/vue-skills-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/README.md +63 -0
  2. package/index.mjs +139 -0
  3. package/package.json +34 -0
  4. package/skills/create-adaptable-composable/SKILL.md +76 -0
  5. package/skills/vue-best-practices/SKILL.md +154 -0
  6. package/skills/vue-best-practices/references/animation-class-based-technique.md +254 -0
  7. package/skills/vue-best-practices/references/animation-state-driven-technique.md +291 -0
  8. package/skills/vue-best-practices/references/component-async.md +97 -0
  9. package/skills/vue-best-practices/references/component-data-flow.md +350 -0
  10. package/skills/vue-best-practices/references/component-fallthrough-attrs.md +174 -0
  11. package/skills/vue-best-practices/references/component-keep-alive.md +137 -0
  12. package/skills/vue-best-practices/references/component-slots.md +216 -0
  13. package/skills/vue-best-practices/references/component-suspense.md +228 -0
  14. package/skills/vue-best-practices/references/component-teleport.md +108 -0
  15. package/skills/vue-best-practices/references/component-transition-group.md +128 -0
  16. package/skills/vue-best-practices/references/component-transition.md +125 -0
  17. package/skills/vue-best-practices/references/composables.md +290 -0
  18. package/skills/vue-best-practices/references/directives.md +162 -0
  19. package/skills/vue-best-practices/references/perf-avoid-component-abstraction-in-lists.md +159 -0
  20. package/skills/vue-best-practices/references/perf-v-once-v-memo-directives.md +182 -0
  21. package/skills/vue-best-practices/references/perf-virtualize-large-lists.md +187 -0
  22. package/skills/vue-best-practices/references/plugins.md +166 -0
  23. package/skills/vue-best-practices/references/reactivity.md +346 -0
  24. package/skills/vue-best-practices/references/render-functions.md +201 -0
  25. package/skills/vue-best-practices/references/sfc.md +310 -0
  26. package/skills/vue-best-practices/references/state-management.md +135 -0
  27. package/skills/vue-best-practices/references/updated-hook-performance.md +187 -0
  28. package/skills/vue-debug-guides/SKILL.md +205 -0
  29. package/skills/vue-debug-guides/reference/animation-key-for-rerender.md +160 -0
  30. package/skills/vue-debug-guides/reference/animation-transitiongroup-performance.md +241 -0
  31. package/skills/vue-debug-guides/reference/async-component-error-handling.md +115 -0
  32. package/skills/vue-debug-guides/reference/async-component-keepalive-ref-issue.md +112 -0
  33. package/skills/vue-debug-guides/reference/async-component-suspense-control.md +84 -0
  34. package/skills/vue-debug-guides/reference/async-component-vue-router.md +109 -0
  35. package/skills/vue-debug-guides/reference/attrs-event-listener-merging.md +205 -0
  36. package/skills/vue-debug-guides/reference/checkbox-true-false-value-form-submission.md +118 -0
  37. package/skills/vue-debug-guides/reference/cleanup-side-effects.md +172 -0
  38. package/skills/vue-debug-guides/reference/click-events-on-components.md +180 -0
  39. package/skills/vue-debug-guides/reference/component-naming-conflicts.md +159 -0
  40. package/skills/vue-debug-guides/reference/component-ref-requires-defineexpose.md +176 -0
  41. package/skills/vue-debug-guides/reference/composable-avoid-hidden-side-effects.md +208 -0
  42. package/skills/vue-debug-guides/reference/composable-call-location-restrictions.md +141 -0
  43. package/skills/vue-debug-guides/reference/composable-naming-return-pattern.md +139 -0
  44. package/skills/vue-debug-guides/reference/composable-tovalue-inside-watcheffect.md +182 -0
  45. package/skills/vue-debug-guides/reference/composition-api-not-functional-programming.md +120 -0
  46. package/skills/vue-debug-guides/reference/composition-api-script-setup-async-context.md +203 -0
  47. package/skills/vue-debug-guides/reference/composition-api-vs-react-hooks-differences.md +156 -0
  48. package/skills/vue-debug-guides/reference/computed-array-mutation.md +148 -0
  49. package/skills/vue-debug-guides/reference/computed-conditional-dependencies.md +147 -0
  50. package/skills/vue-debug-guides/reference/computed-no-parameters.md +159 -0
  51. package/skills/vue-debug-guides/reference/computed-no-side-effects.md +107 -0
  52. package/skills/vue-debug-guides/reference/computed-return-value-readonly.md +160 -0
  53. package/skills/vue-debug-guides/reference/configure-app-before-mount.md +89 -0
  54. package/skills/vue-debug-guides/reference/declare-emits-for-documentation.md +212 -0
  55. package/skills/vue-debug-guides/reference/define-expose-before-await.md +192 -0
  56. package/skills/vue-debug-guides/reference/define-model-default-value-sync.md +139 -0
  57. package/skills/vue-debug-guides/reference/defineEmits-must-be-top-level.md +164 -0
  58. package/skills/vue-debug-guides/reference/defineEmits-no-runtime-and-type-mixed.md +170 -0
  59. package/skills/vue-debug-guides/reference/definemodel-object-mutation-no-emit.md +148 -0
  60. package/skills/vue-debug-guides/reference/dom-update-timing-nexttick.md +90 -0
  61. package/skills/vue-debug-guides/reference/dynamic-argument-constraints.md +146 -0
  62. package/skills/vue-debug-guides/reference/dynamic-component-registration-vite.md +147 -0
  63. package/skills/vue-debug-guides/reference/event-modifier-order-matters.md +101 -0
  64. package/skills/vue-debug-guides/reference/exact-modifier-for-precise-shortcuts.md +155 -0
  65. package/skills/vue-debug-guides/reference/fallthrough-attrs-overwrite-vue3.md +159 -0
  66. package/skills/vue-debug-guides/reference/in-dom-template-parsing-caveats.md +149 -0
  67. package/skills/vue-debug-guides/reference/inheritattrs-false-for-wrapper-components.md +230 -0
  68. package/skills/vue-debug-guides/reference/keepalive-router-nested-double-mount.md +222 -0
  69. package/skills/vue-debug-guides/reference/keepalive-transition-memory-leak.md +144 -0
  70. package/skills/vue-debug-guides/reference/keyup-modifier-timing.md +137 -0
  71. package/skills/vue-debug-guides/reference/lifecycle-dom-access-timing.md +216 -0
  72. package/skills/vue-debug-guides/reference/lifecycle-hooks-synchronous-registration.md +156 -0
  73. package/skills/vue-debug-guides/reference/lifecycle-ssr-awareness.md +184 -0
  74. package/skills/vue-debug-guides/reference/local-components-not-in-descendants.md +151 -0
  75. package/skills/vue-debug-guides/reference/mount-return-value.md +88 -0
  76. package/skills/vue-debug-guides/reference/multi-root-component-class-attrs.md +93 -0
  77. package/skills/vue-debug-guides/reference/native-event-collision-with-emits.md +162 -0
  78. package/skills/vue-debug-guides/reference/no-passive-with-prevent.md +141 -0
  79. package/skills/vue-debug-guides/reference/no-v-if-with-v-for.md +136 -0
  80. package/skills/vue-debug-guides/reference/perf-computed-object-stability.md +157 -0
  81. package/skills/vue-debug-guides/reference/perf-props-stability-update-optimization.md +140 -0
  82. package/skills/vue-debug-guides/reference/plugin-global-properties-sparingly.md +109 -0
  83. package/skills/vue-debug-guides/reference/plugin-install-before-mount.md +124 -0
  84. package/skills/vue-debug-guides/reference/plugin-prefer-provide-inject-over-global-properties.md +120 -0
  85. package/skills/vue-debug-guides/reference/plugin-typescript-type-augmentation.md +157 -0
  86. package/skills/vue-debug-guides/reference/prop-defineprops-scope-limitation.md +161 -0
  87. package/skills/vue-debug-guides/reference/provide-inject-debugging-challenges.md +203 -0
  88. package/skills/vue-debug-guides/reference/provide-inject-default-value-factory.md +244 -0
  89. package/skills/vue-debug-guides/reference/provide-inject-reactivity-not-automatic.md +226 -0
  90. package/skills/vue-debug-guides/reference/provide-inject-synchronous-setup.md +235 -0
  91. package/skills/vue-debug-guides/reference/reactive-destructuring.md +89 -0
  92. package/skills/vue-debug-guides/reference/reactivity-debugging-hooks.md +132 -0
  93. package/skills/vue-debug-guides/reference/reactivity-markraw-for-non-reactive.md +149 -0
  94. package/skills/vue-debug-guides/reference/reactivity-proxy-identity-hazard.md +96 -0
  95. package/skills/vue-debug-guides/reference/reactivity-same-tick-batching.md +166 -0
  96. package/skills/vue-debug-guides/reference/ref-value-access.md +61 -0
  97. package/skills/vue-debug-guides/reference/refs-in-collections-need-value.md +81 -0
  98. package/skills/vue-debug-guides/reference/render-function-avoid-internal-vnode-properties.md +151 -0
  99. package/skills/vue-debug-guides/reference/render-function-vnodes-must-be-unique.md +133 -0
  100. package/skills/vue-debug-guides/reference/rendering-render-function-h-import-vue3.md +148 -0
  101. package/skills/vue-debug-guides/reference/rendering-render-function-return-from-setup.md +148 -0
  102. package/skills/vue-debug-guides/reference/rendering-render-function-slots-as-functions.md +168 -0
  103. package/skills/vue-debug-guides/reference/rendering-resolve-component-for-string-names.md +231 -0
  104. package/skills/vue-debug-guides/reference/select-initial-value-ios-bug.md +91 -0
  105. package/skills/vue-debug-guides/reference/self-referencing-component-name.md +157 -0
  106. package/skills/vue-debug-guides/reference/sfc-named-exports-forbidden.md +184 -0
  107. package/skills/vue-debug-guides/reference/sfc-scoped-css-child-component-styling.md +156 -0
  108. package/skills/vue-debug-guides/reference/sfc-scoped-css-dynamic-content.md +193 -0
  109. package/skills/vue-debug-guides/reference/sfc-scoped-css-slot-content.md +242 -0
  110. package/skills/vue-debug-guides/reference/sfc-script-setup-reactivity.md +195 -0
  111. package/skills/vue-debug-guides/reference/slot-forwarding-to-child-components.md +143 -0
  112. package/skills/vue-debug-guides/reference/slot-implicit-default-content.md +155 -0
  113. package/skills/vue-debug-guides/reference/slot-name-reserved-prop.md +109 -0
  114. package/skills/vue-debug-guides/reference/slot-named-scoped-explicit-default.md +95 -0
  115. package/skills/vue-debug-guides/reference/slot-render-scope-parent-only.md +135 -0
  116. package/skills/vue-debug-guides/reference/slot-v-slot-on-components-or-templates-only.md +122 -0
  117. package/skills/vue-debug-guides/reference/ssr-hydration-mismatch-causes.md +280 -0
  118. package/skills/vue-debug-guides/reference/ssr-platform-specific-apis.md +256 -0
  119. package/skills/vue-debug-guides/reference/state-ssr-cross-request-pollution.md +276 -0
  120. package/skills/vue-debug-guides/reference/suspense-no-builtin-error-handling.md +127 -0
  121. package/skills/vue-debug-guides/reference/suspense-ssr-hydration-issues.md +159 -0
  122. package/skills/vue-debug-guides/reference/tailwind-dynamic-class-generation.md +144 -0
  123. package/skills/vue-debug-guides/reference/teleport-scoped-styles-limitation.md +191 -0
  124. package/skills/vue-debug-guides/reference/teleport-ssr-hydration.md +152 -0
  125. package/skills/vue-debug-guides/reference/teleport-target-must-exist.md +113 -0
  126. package/skills/vue-debug-guides/reference/template-expressions-restrictions.md +114 -0
  127. package/skills/vue-debug-guides/reference/template-functions-no-side-effects.md +187 -0
  128. package/skills/vue-debug-guides/reference/template-ref-null-with-v-if.md +123 -0
  129. package/skills/vue-debug-guides/reference/template-ref-unwrapping-top-level.md +104 -0
  130. package/skills/vue-debug-guides/reference/template-ref-v-for-order.md +172 -0
  131. package/skills/vue-debug-guides/reference/textarea-no-interpolation.md +72 -0
  132. package/skills/vue-debug-guides/reference/transition-group-flip-inline-elements.md +152 -0
  133. package/skills/vue-debug-guides/reference/transition-group-move-animation-position-absolute.md +130 -0
  134. package/skills/vue-debug-guides/reference/transition-group-no-default-wrapper-vue3.md +152 -0
  135. package/skills/vue-debug-guides/reference/transition-js-hooks-done-callback.md +251 -0
  136. package/skills/vue-debug-guides/reference/transition-nested-duration.md +182 -0
  137. package/skills/vue-debug-guides/reference/transition-reusable-scoped-style.md +245 -0
  138. package/skills/vue-debug-guides/reference/transition-router-view-appear.md +193 -0
  139. package/skills/vue-debug-guides/reference/transition-type-when-mixed.md +172 -0
  140. package/skills/vue-debug-guides/reference/transition-unmount-hook-timing.md +149 -0
  141. package/skills/vue-debug-guides/reference/ts-defineprops-boolean-default-false.md +225 -0
  142. package/skills/vue-debug-guides/reference/ts-defineprops-imported-types-limitations.md +281 -0
  143. package/skills/vue-debug-guides/reference/ts-event-handler-explicit-typing.md +213 -0
  144. package/skills/vue-debug-guides/reference/ts-reactive-no-generic-argument.md +196 -0
  145. package/skills/vue-debug-guides/reference/ts-shallowref-for-dynamic-components.md +218 -0
  146. package/skills/vue-debug-guides/reference/ts-template-ref-null-handling.md +249 -0
  147. package/skills/vue-debug-guides/reference/ts-template-type-casting.md +214 -0
  148. package/skills/vue-debug-guides/reference/ts-withdefaults-mutable-factory-function.md +171 -0
  149. package/skills/vue-debug-guides/reference/undeclared-emits-double-firing.md +195 -0
  150. package/skills/vue-debug-guides/reference/use-template-ref-vue35.md +158 -0
  151. package/skills/vue-debug-guides/reference/v-else-must-follow-v-if.md +136 -0
  152. package/skills/vue-debug-guides/reference/v-for-component-props.md +95 -0
  153. package/skills/vue-debug-guides/reference/v-for-computed-reverse-sort.md +86 -0
  154. package/skills/vue-debug-guides/reference/v-for-key-attribute.md +90 -0
  155. package/skills/vue-debug-guides/reference/v-for-range-starts-at-one.md +66 -0
  156. package/skills/vue-debug-guides/reference/v-if-null-check-order.md +171 -0
  157. package/skills/vue-debug-guides/reference/v-model-ignores-html-attributes.md +83 -0
  158. package/skills/vue-debug-guides/reference/v-model-ime-composition.md +83 -0
  159. package/skills/vue-debug-guides/reference/v-model-number-modifier-behavior.md +124 -0
  160. package/skills/vue-debug-guides/reference/v-show-template-limitation.md +124 -0
  161. package/skills/vue-debug-guides/reference/watch-async-cleanup.md +180 -0
  162. package/skills/vue-debug-guides/reference/watch-async-creation-memory-leak.md +176 -0
  163. package/skills/vue-debug-guides/reference/watch-deep-same-object-reference.md +165 -0
  164. package/skills/vue-debug-guides/reference/watch-flush-timing.md +189 -0
  165. package/skills/vue-debug-guides/reference/watch-reactive-property-getter.md +108 -0
  166. package/skills/vue-debug-guides/reference/watcheffect-async-dependency-tracking.md +173 -0
  167. package/skills/vue-debug-guides/reference/watcheffect-flush-post-for-refs.md +176 -0
  168. package/skills/vue-jsx-best-practices/SKILL.md +12 -0
  169. package/skills/vue-jsx-best-practices/reference/render-function-jsx-vue-vs-react.md +141 -0
  170. package/skills/vue-options-api-best-practices/SKILL.md +23 -0
  171. package/skills/vue-options-api-best-practices/reference/no-arrow-functions-in-lifecycle-hooks.md +95 -0
  172. package/skills/vue-options-api-best-practices/reference/no-arrow-functions-in-methods.md +68 -0
  173. package/skills/vue-options-api-best-practices/reference/stateful-methods-lifecycle.md +61 -0
  174. package/skills/vue-options-api-best-practices/reference/ts-options-api-arrow-functions-validators.md +141 -0
  175. package/skills/vue-options-api-best-practices/reference/ts-options-api-computed-return-types.md +192 -0
  176. package/skills/vue-options-api-best-practices/reference/ts-options-api-proptype-complex-types.md +212 -0
  177. package/skills/vue-options-api-best-practices/reference/ts-options-api-provide-inject-limitations.md +135 -0
  178. package/skills/vue-options-api-best-practices/reference/ts-options-api-type-event-handlers.md +202 -0
  179. package/skills/vue-options-api-best-practices/reference/ts-options-api-use-definecomponent.md +172 -0
  180. package/skills/vue-options-api-best-practices/reference/ts-strict-mode-options-api.md +197 -0
  181. package/skills/vue-pinia-best-practices/SKILL.md +21 -0
  182. package/skills/vue-pinia-best-practices/reference/pinia-no-active-pinia-error.md +248 -0
  183. package/skills/vue-pinia-best-practices/reference/pinia-setup-store-return-all-state.md +227 -0
  184. package/skills/vue-pinia-best-practices/reference/pinia-store-destructuring-breaks-reactivity.md +193 -0
  185. package/skills/vue-pinia-best-practices/reference/state-url-for-ephemeral-filters.md +238 -0
  186. package/skills/vue-pinia-best-practices/reference/state-use-pinia-for-large-apps.md +262 -0
  187. package/skills/vue-pinia-best-practices/reference/store-method-binding-parentheses.md +191 -0
  188. package/skills/vue-router-best-practices/SKILL.md +23 -0
  189. package/skills/vue-router-best-practices/reference/router-beforeenter-no-param-trigger.md +167 -0
  190. package/skills/vue-router-best-practices/reference/router-beforerouteenter-no-this.md +176 -0
  191. package/skills/vue-router-best-practices/reference/router-guard-async-await-pattern.md +227 -0
  192. package/skills/vue-router-best-practices/reference/router-navigation-guard-infinite-loop.md +187 -0
  193. package/skills/vue-router-best-practices/reference/router-navigation-guard-next-deprecated.md +150 -0
  194. package/skills/vue-router-best-practices/reference/router-param-change-no-lifecycle.md +181 -0
  195. package/skills/vue-router-best-practices/reference/router-simple-routing-cleanup.md +209 -0
  196. package/skills/vue-router-best-practices/reference/router-use-vue-router-for-production.md +183 -0
  197. package/skills/vue-testing-best-practices/SKILL.md +29 -0
  198. package/skills/vue-testing-best-practices/reference/async-component-testing.md +163 -0
  199. package/skills/vue-testing-best-practices/reference/teleport-testing-complexity.md +158 -0
  200. package/skills/vue-testing-best-practices/reference/testing-async-await-flushpromises.md +175 -0
  201. package/skills/vue-testing-best-practices/reference/testing-browser-vs-node-runners.md +208 -0
  202. package/skills/vue-testing-best-practices/reference/testing-component-blackbox-approach.md +144 -0
  203. package/skills/vue-testing-best-practices/reference/testing-composables-helper-wrapper.md +238 -0
  204. package/skills/vue-testing-best-practices/reference/testing-e2e-playwright-recommended.md +242 -0
  205. package/skills/vue-testing-best-practices/reference/testing-no-snapshot-only.md +197 -0
  206. package/skills/vue-testing-best-practices/reference/testing-pinia-store-setup.md +228 -0
  207. package/skills/vue-testing-best-practices/reference/testing-suspense-async-components.md +229 -0
  208. package/skills/vue-testing-best-practices/reference/testing-vitest-recommended-for-vue.md +204 -0
@@ -0,0 +1,205 @@
1
+ ---
2
+ name: vue-debug-guides
3
+ description: Vue 3 debugging and error handling for runtime errors, warnings, async failures, and SSR/hydration issues. Use when diagnosing or fixing Vue issues.
4
+ license: MIT
5
+ metadata:
6
+ author: github.com/Pythoughts-labs
7
+ ---
8
+
9
+ Vue 3 debugging and error handling for runtime issues, warnings, async failures, and hydration bugs.
10
+ For development best practices and common gotchas, use `vue-best-practices`.
11
+
12
+ ### Reactivity
13
+ - Tracing unexpected re-renders and state updates → See [reactivity-debugging-hooks](reference/reactivity-debugging-hooks.md)
14
+ - Ref values not updating due to missing .value access → See [ref-value-access](reference/ref-value-access.md)
15
+ - State stops updating after destructuring reactive objects → See [reactive-destructuring](reference/reactive-destructuring.md)
16
+ - Refs inside arrays, Maps, or Sets not unwrapping → See [refs-in-collections-need-value](reference/refs-in-collections-need-value.md)
17
+ - Nested refs rendering as [object Object] in templates → See [template-ref-unwrapping-top-level](reference/template-ref-unwrapping-top-level.md)
18
+ - Reactive proxy identity comparisons always return false → See [reactivity-proxy-identity-hazard](reference/reactivity-proxy-identity-hazard.md)
19
+ - Third-party instances breaking when proxied → See [reactivity-markraw-for-non-reactive](reference/reactivity-markraw-for-non-reactive.md)
20
+ - Watchers only firing once per tick unexpectedly → See [reactivity-same-tick-batching](reference/reactivity-same-tick-batching.md)
21
+
22
+ ### Computed
23
+ - Computed getter triggers mutations or requests unexpectedly → See [computed-no-side-effects](reference/computed-no-side-effects.md)
24
+ - Mutating computed values causes changes to disappear → See [computed-return-value-readonly](reference/computed-return-value-readonly.md)
25
+ - Computed value never updates after conditional logic → See [computed-conditional-dependencies](reference/computed-conditional-dependencies.md)
26
+ - Sorting or reversing arrays breaks original state → See [computed-array-mutation](reference/computed-array-mutation.md)
27
+ - Passing parameters to computed properties fails → See [computed-no-parameters](reference/computed-no-parameters.md)
28
+
29
+ ### Watchers
30
+ - Async operations overwriting with stale data → See [watch-async-cleanup](reference/watch-async-cleanup.md)
31
+ - Creating watchers inside async callbacks → See [watch-async-creation-memory-leak](reference/watch-async-creation-memory-leak.md)
32
+ - Watcher never triggers for reactive object properties → See [watch-reactive-property-getter](reference/watch-reactive-property-getter.md)
33
+ - Async watchEffect misses dependencies after await → See [watcheffect-async-dependency-tracking](reference/watcheffect-async-dependency-tracking.md)
34
+ - DOM reads are stale inside watcher callbacks → See [watch-flush-timing](reference/watch-flush-timing.md)
35
+ - Deep watchers report identical old/new values → See [watch-deep-same-object-reference](reference/watch-deep-same-object-reference.md)
36
+ - watchEffect runs before template refs update → See [watcheffect-flush-post-for-refs](reference/watcheffect-flush-post-for-refs.md)
37
+
38
+ ### Components
39
+ - Child component throws "component not found" error → See [local-components-not-in-descendants](reference/local-components-not-in-descendants.md)
40
+ - Click listener doesn't fire on custom component → See [click-events-on-components](reference/click-events-on-components.md)
41
+ - Parent can't access child ref data in script setup → See [component-ref-requires-defineexpose](reference/component-ref-requires-defineexpose.md)
42
+ - HTML template parsing breaks Vue component syntax → See [in-dom-template-parsing-caveats](reference/in-dom-template-parsing-caveats.md)
43
+ - Wrong component renders due to naming collisions → See [component-naming-conflicts](reference/component-naming-conflicts.md)
44
+ - Parent styles don't apply to multi-root component → See [multi-root-component-class-attrs](reference/multi-root-component-class-attrs.md)
45
+
46
+ ### Props & Emits
47
+ - Variables referenced in defineProps cause errors → See [prop-defineprops-scope-limitation](reference/prop-defineprops-scope-limitation.md)
48
+ - Component emits undeclared event causing warnings → See [declare-emits-for-documentation](reference/declare-emits-for-documentation.md)
49
+ - defineEmits used inside function or conditional → See [defineEmits-must-be-top-level](reference/defineEmits-must-be-top-level.md)
50
+ - defineEmits has both type and runtime arguments → See [defineEmits-no-runtime-and-type-mixed](reference/defineEmits-no-runtime-and-type-mixed.md)
51
+ - Native event listeners not responding to clicks → See [native-event-collision-with-emits](reference/native-event-collision-with-emits.md)
52
+ - Component event fires twice when clicking → See [undeclared-emits-double-firing](reference/undeclared-emits-double-firing.md)
53
+
54
+ ### Templates
55
+ - Getting template compilation errors with statements → See [template-expressions-restrictions](reference/template-expressions-restrictions.md)
56
+ - "Cannot read property of undefined" runtime errors → See [v-if-null-check-order](reference/v-if-null-check-order.md)
57
+ - Dynamic directive arguments not working properly → See [dynamic-argument-constraints](reference/dynamic-argument-constraints.md)
58
+ - v-else elements rendering unconditionally always → See [v-else-must-follow-v-if](reference/v-else-must-follow-v-if.md)
59
+ - 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)
60
+ - Template function calls mutating state cause unpredictable re-render bugs → See [template-functions-no-side-effects](reference/template-functions-no-side-effects.md)
61
+ - Child components in loops showing undefined data → See [v-for-component-props](reference/v-for-component-props.md)
62
+ - Array order changing after sorting or reversing → See [v-for-computed-reverse-sort](reference/v-for-computed-reverse-sort.md)
63
+ - List items disappearing or swapping state unexpectedly → See [v-for-key-attribute](reference/v-for-key-attribute.md)
64
+ - Getting off-by-one errors with range iteration → See [v-for-range-starts-at-one](reference/v-for-range-starts-at-one.md)
65
+ - v-show or v-else not working on template elements → See [v-show-template-limitation](reference/v-show-template-limitation.md)
66
+
67
+ ### Template Refs
68
+ - Ref becomes null when element is conditionally hidden → See [template-ref-null-with-v-if](reference/template-ref-null-with-v-if.md)
69
+ - Ref array indices don't match data array in loops → See [template-ref-v-for-order](reference/template-ref-v-for-order.md)
70
+ - Refactoring template ref names breaks silently in code → See [use-template-ref-vue35](reference/use-template-ref-vue35.md)
71
+
72
+ ### Forms & v-model
73
+ - Initial form values not showing when using v-model → See [v-model-ignores-html-attributes](reference/v-model-ignores-html-attributes.md)
74
+ - Textarea content changes not updating the ref → See [textarea-no-interpolation](reference/textarea-no-interpolation.md)
75
+ - iOS users cannot select dropdown first option → See [select-initial-value-ios-bug](reference/select-initial-value-ios-bug.md)
76
+ - Parent and child components have different values → See [define-model-default-value-sync](reference/define-model-default-value-sync.md)
77
+ - Object property changes not syncing to parent → See [definemodel-object-mutation-no-emit](reference/definemodel-object-mutation-no-emit.md)
78
+ - Real-time search/validation broken for Chinese/Japanese input → See [v-model-ime-composition](reference/v-model-ime-composition.md)
79
+ - Number input returns empty string instead of zero → See [v-model-number-modifier-behavior](reference/v-model-number-modifier-behavior.md)
80
+ - Custom checkbox values not submitted in forms → See [checkbox-true-false-value-form-submission](reference/checkbox-true-false-value-form-submission.md)
81
+
82
+ ### Events & Modifiers
83
+ - Chaining multiple event modifiers produces unexpected results → See [event-modifier-order-matters](reference/event-modifier-order-matters.md)
84
+ - Keyboard shortcuts don't fire with system modifier keys → See [keyup-modifier-timing](reference/keyup-modifier-timing.md)
85
+ - Keyboard shortcuts fire with unintended modifier combinations → See [exact-modifier-for-precise-shortcuts](reference/exact-modifier-for-precise-shortcuts.md)
86
+ - Combining passive and prevent modifiers breaks event behavior → See [no-passive-with-prevent](reference/no-passive-with-prevent.md)
87
+
88
+ ### Lifecycle
89
+ - Memory leaks from unremoved event listeners → See [cleanup-side-effects](reference/cleanup-side-effects.md)
90
+ - DOM access fails before component mounts → See [lifecycle-dom-access-timing](reference/lifecycle-dom-access-timing.md)
91
+ - DOM reads return stale values after state changes → See [dom-update-timing-nexttick](reference/dom-update-timing-nexttick.md)
92
+ - SSR rendering differs from client hydration → See [lifecycle-ssr-awareness](reference/lifecycle-ssr-awareness.md)
93
+ - Lifecycle hooks registered asynchronously never run → See [lifecycle-hooks-synchronous-registration](reference/lifecycle-hooks-synchronous-registration.md)
94
+
95
+ ### Slots
96
+ - Accessing child component data in slot content returns undefined values → See [slot-render-scope-parent-only](reference/slot-render-scope-parent-only.md)
97
+ - Mixing named and scoped slots together causes compilation errors → See [slot-named-scoped-explicit-default](reference/slot-named-scoped-explicit-default.md)
98
+ - 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)
99
+ - Unexpected content placement from implicit default slot behavior → See [slot-implicit-default-content](reference/slot-implicit-default-content.md)
100
+ - Scoped slot props missing expected name property → See [slot-name-reserved-prop](reference/slot-name-reserved-prop.md)
101
+ - Wrapper components breaking child slot functionality → See [slot-forwarding-to-child-components](reference/slot-forwarding-to-child-components.md)
102
+
103
+ ### Provide/Inject
104
+ - Calling provide after async operations fails silently → See [provide-inject-synchronous-setup](reference/provide-inject-synchronous-setup.md)
105
+ - Tracing where provided values come from → See [provide-inject-debugging-challenges](reference/provide-inject-debugging-challenges.md)
106
+ - Injected values not updating when provider changes → See [provide-inject-reactivity-not-automatic](reference/provide-inject-reactivity-not-automatic.md)
107
+ - Multiple components share same default object → See [provide-inject-default-value-factory](reference/provide-inject-default-value-factory.md)
108
+
109
+ ### Attrs
110
+ - Both internal and fallthrough event handlers execute → See [attrs-event-listener-merging](reference/attrs-event-listener-merging.md)
111
+ - Explicit attributes overwritten by fallthrough values → See [fallthrough-attrs-overwrite-vue3](reference/fallthrough-attrs-overwrite-vue3.md)
112
+ - Attributes applying to wrong element in wrappers → See [inheritattrs-false-for-wrapper-components](reference/inheritattrs-false-for-wrapper-components.md)
113
+
114
+ ### Composables
115
+ - Composable called outside setup context or asynchronously → See [composable-call-location-restrictions](reference/composable-call-location-restrictions.md)
116
+ - Composable reactive dependency not updating when input changes → See [composable-tovalue-inside-watcheffect](reference/composable-tovalue-inside-watcheffect.md)
117
+ - Composable mutates external state unexpectedly → See [composable-avoid-hidden-side-effects](reference/composable-avoid-hidden-side-effects.md)
118
+ - Destructuring composable returns breaks reactivity unexpectedly → See [composable-naming-return-pattern](reference/composable-naming-return-pattern.md)
119
+
120
+ ### Composition API
121
+ - Lifecycle hooks failing silently after async operations → See [composition-api-script-setup-async-context](reference/composition-api-script-setup-async-context.md)
122
+ - Parent component refs unable to access exposed properties → See [define-expose-before-await](reference/define-expose-before-await.md)
123
+ - Functional-programming patterns break expected Vue reactivity behavior → See [composition-api-not-functional-programming](reference/composition-api-not-functional-programming.md)
124
+ - React Hook mental model causes incorrect Composition API usage → See [composition-api-vs-react-hooks-differences](reference/composition-api-vs-react-hooks-differences.md)
125
+
126
+ ### Animation
127
+ - Animations fail to trigger when DOM nodes are reused → See [animation-key-for-rerender](reference/animation-key-for-rerender.md)
128
+ - TransitionGroup list updates feel laggy under load → See [animation-transitiongroup-performance](reference/animation-transitiongroup-performance.md)
129
+
130
+ ### TypeScript
131
+ - Mutable prop defaults leak state between component instances → See [ts-withdefaults-mutable-factory-function](reference/ts-withdefaults-mutable-factory-function.md)
132
+ - reactive() generic typing causes ref unwrapping mismatches → See [ts-reactive-no-generic-argument](reference/ts-reactive-no-generic-argument.md)
133
+ - Template refs throw null access errors before mount or after v-if unmount → See [ts-template-ref-null-handling](reference/ts-template-ref-null-handling.md)
134
+ - Optional boolean props behave as false instead of undefined → See [ts-defineprops-boolean-default-false](reference/ts-defineprops-boolean-default-false.md)
135
+ - Imported defineProps types fail with unresolvable or complex type references → See [ts-defineprops-imported-types-limitations](reference/ts-defineprops-imported-types-limitations.md)
136
+ - Untyped DOM event handlers fail under strict TypeScript settings → See [ts-event-handler-explicit-typing](reference/ts-event-handler-explicit-typing.md)
137
+ - Dynamic component refs trigger reactive component warnings → See [ts-shallowref-for-dynamic-components](reference/ts-shallowref-for-dynamic-components.md)
138
+ - Union-typed template expressions fail type checks without narrowing → See [ts-template-type-casting](reference/ts-template-type-casting.md)
139
+
140
+ ### Async Components
141
+ - Route components misconfigured with defineAsyncComponent lazy loading → See [async-component-vue-router](reference/async-component-vue-router.md)
142
+ - Network failures or timeouts loading components → See [async-component-error-handling](reference/async-component-error-handling.md)
143
+ - Template refs undefined after component reactivation → See [async-component-keepalive-ref-issue](reference/async-component-keepalive-ref-issue.md)
144
+
145
+ ### Render Functions
146
+ - Render function output stays static after state changes → See [rendering-render-function-return-from-setup](reference/rendering-render-function-return-from-setup.md)
147
+ - Reused vnode instances render incorrectly → See [render-function-vnodes-must-be-unique](reference/render-function-vnodes-must-be-unique.md)
148
+ - String component names render as HTML elements → See [rendering-resolve-component-for-string-names](reference/rendering-resolve-component-for-string-names.md)
149
+ - Accessing vnode internals breaks on Vue updates → See [render-function-avoid-internal-vnode-properties](reference/render-function-avoid-internal-vnode-properties.md)
150
+ - Vue 2 render function patterns crash in Vue 3 → See [rendering-render-function-h-import-vue3](reference/rendering-render-function-h-import-vue3.md)
151
+ - Slot content not rendering from h() → See [rendering-render-function-slots-as-functions](reference/rendering-render-function-slots-as-functions.md)
152
+
153
+ ### KeepAlive
154
+ - Child components mount twice with nested Vue Router routes → See [keepalive-router-nested-double-mount](reference/keepalive-router-nested-double-mount.md)
155
+ - Memory grows when combining KeepAlive with Transition animations → See [keepalive-transition-memory-leak](reference/keepalive-transition-memory-leak.md)
156
+
157
+ ### Transitions
158
+ - JavaScript transition hooks hang without done callback → See [transition-js-hooks-done-callback](reference/transition-js-hooks-done-callback.md)
159
+ - Move animations fail on inline list elements → See [transition-group-flip-inline-elements](reference/transition-group-flip-inline-elements.md)
160
+ - List items jump instead of smoothly animating → See [transition-group-move-animation-position-absolute](reference/transition-group-move-animation-position-absolute.md)
161
+ - Vue 2 to Vue 3 TransitionGroup wrapper changes break layout → See [transition-group-no-default-wrapper-vue3](reference/transition-group-no-default-wrapper-vue3.md)
162
+ - Nested transitions cut off before finishing → See [transition-nested-duration](reference/transition-nested-duration.md)
163
+ - Scoped styles stop working in reusable transition wrappers → See [transition-reusable-scoped-style](reference/transition-reusable-scoped-style.md)
164
+ - RouterView transitions animate unexpectedly on first render → See [transition-router-view-appear](reference/transition-router-view-appear.md)
165
+ - Mixing CSS transitions and animations causes timing issues → See [transition-type-when-mixed](reference/transition-type-when-mixed.md)
166
+ - Cleanup hooks missed during rapid transition swaps → See [transition-unmount-hook-timing](reference/transition-unmount-hook-timing.md)
167
+
168
+ ### Teleport
169
+ - Teleport target element not found in DOM → See [teleport-target-must-exist](reference/teleport-target-must-exist.md)
170
+ - Teleported content breaks SSR hydration → See [teleport-ssr-hydration](reference/teleport-ssr-hydration.md)
171
+ - Scoped styles not applying to teleported content → See [teleport-scoped-styles-limitation](reference/teleport-scoped-styles-limitation.md)
172
+
173
+ ### Suspense
174
+ - Need to handle async errors from Suspense components → See [suspense-no-builtin-error-handling](reference/suspense-no-builtin-error-handling.md)
175
+ - Using Suspense with server-side rendering → See [suspense-ssr-hydration-issues](reference/suspense-ssr-hydration-issues.md)
176
+ - Async component loading/error UI ignored under Suspense → See [async-component-suspense-control](reference/async-component-suspense-control.md)
177
+
178
+ ### SSR
179
+ - HTML differs between server and client renders → See [ssr-hydration-mismatch-causes](reference/ssr-hydration-mismatch-causes.md)
180
+ - User state leaks between requests from shared singleton stores → See [state-ssr-cross-request-pollution](reference/state-ssr-cross-request-pollution.md)
181
+ - Browser-only APIs crash server rendering in universal code paths → See [ssr-platform-specific-apis](reference/ssr-platform-specific-apis.md)
182
+
183
+ ### Performance
184
+ - List children re-render unnecessarily because parent passes unstable props → See [perf-props-stability-update-optimization](reference/perf-props-stability-update-optimization.md)
185
+ - Computed objects retrigger effects despite equivalent values → See [perf-computed-object-stability](reference/perf-computed-object-stability.md)
186
+
187
+ ### SFC (Single File Components)
188
+ - Trying to use named exports from component script blocks → See [sfc-named-exports-forbidden](reference/sfc-named-exports-forbidden.md)
189
+ - Variables not updating in template after changes → See [sfc-script-setup-reactivity](reference/sfc-script-setup-reactivity.md)
190
+ - Scoped styles not applying to child component elements → See [sfc-scoped-css-child-component-styling](reference/sfc-scoped-css-child-component-styling.md)
191
+ - Scoped styles not applying to dynamic v-html content → See [sfc-scoped-css-dynamic-content](reference/sfc-scoped-css-dynamic-content.md)
192
+ - Scoped styles not applying to slot content → See [sfc-scoped-css-slot-content](reference/sfc-scoped-css-slot-content.md)
193
+ - Tailwind classes missing when built dynamically → See [tailwind-dynamic-class-generation](reference/tailwind-dynamic-class-generation.md)
194
+ - Recursive components not rendering due to name conflicts → See [self-referencing-component-name](reference/self-referencing-component-name.md)
195
+
196
+ ### Plugins
197
+ - Debugging why global properties cause naming conflicts → See [plugin-global-properties-sparingly](reference/plugin-global-properties-sparingly.md)
198
+ - Plugin not working or inject returns undefined → See [plugin-install-before-mount](reference/plugin-install-before-mount.md)
199
+ - Plugin global properties are unavailable in setup-based components → See [plugin-prefer-provide-inject-over-global-properties](reference/plugin-prefer-provide-inject-over-global-properties.md)
200
+ - Plugin type augmentation mistakes break ComponentCustomProperties typing → See [plugin-typescript-type-augmentation](reference/plugin-typescript-type-augmentation.md)
201
+
202
+ ### App Configuration
203
+ - App configuration methods not working after mount call → See [configure-app-before-mount](reference/configure-app-before-mount.md)
204
+ - Chaining app config off mount() fails because mount returns component instance → See [mount-return-value](reference/mount-return-value.md)
205
+ - require.context-based component auto-registration fails in Vite → See [dynamic-component-registration-vite](reference/dynamic-component-registration-vite.md)
@@ -0,0 +1,160 @@
1
+ ---
2
+ title: Use Key Attribute to Force Re-render Animations
3
+ impact: MEDIUM
4
+ impactDescription: Without key attributes, Vue reuses DOM elements and animation libraries like AutoAnimate cannot detect changes to animate
5
+ type: gotcha
6
+ tags: [vue3, animation, key, autoanimate, rerender, dom]
7
+ ---
8
+
9
+ # Use Key Attribute to Force Re-render Animations
10
+
11
+ **Impact: MEDIUM** - Vue optimizes performance by reusing DOM elements when possible. However, this optimization can prevent animation libraries (like AutoAnimate) from detecting changes, because the element is updated in place rather than re-created. Adding a `:key` attribute forces Vue to treat changed elements as new, triggering proper animations.
12
+
13
+ ## Task Checklist
14
+
15
+ - [ ] Add `:key` to elements that should animate when their content changes
16
+ - [ ] Use unique, changing values for keys (not indices)
17
+ - [ ] For route transitions, add `:key="$route.fullPath"` to `<router-view>`
18
+ - [ ] Apply `v-auto-animate` to the parent element of keyed children
19
+
20
+ **Problematic Code:**
21
+ ```vue
22
+ <template>
23
+ <!-- BAD: Text changes but no animation occurs -->
24
+ <div v-auto-animate>
25
+ <p>{{ message }}</p> <!-- No key - element is reused -->
26
+ </div>
27
+
28
+ <!-- BAD: Image source changes but no animation -->
29
+ <div v-auto-animate>
30
+ <img :src="imageUrl" /> <!-- No key - element is reused -->
31
+ </div>
32
+
33
+ <!-- BAD: Route changes don't animate -->
34
+ <router-view v-auto-animate /> <!-- No key -->
35
+ </template>
36
+
37
+ <script setup>
38
+ import { ref } from 'vue'
39
+
40
+ const message = ref('Hello')
41
+ const imageUrl = ref('/images/photo1.jpg')
42
+
43
+ // Changing these won't trigger animations because
44
+ // Vue updates the existing elements rather than replacing them
45
+ </script>
46
+ ```
47
+
48
+ **Correct Code:**
49
+ ```vue
50
+ <template>
51
+ <!-- GOOD: Key forces re-render, triggering animation -->
52
+ <div v-auto-animate>
53
+ <p :key="message">{{ message }}</p>
54
+ </div>
55
+
56
+ <!-- GOOD: Image animates when source changes -->
57
+ <div v-auto-animate>
58
+ <img :key="imageUrl" :src="imageUrl" />
59
+ </div>
60
+
61
+ <!-- GOOD: Route changes animate properly -->
62
+ <router-view :key="$route.fullPath" v-auto-animate />
63
+ </template>
64
+
65
+ <script setup>
66
+ import { ref } from 'vue'
67
+
68
+ const message = ref('Hello')
69
+ const imageUrl = ref('/images/photo1.jpg')
70
+
71
+ // Now changing these will trigger animations
72
+ function updateMessage() {
73
+ message.value = 'World' // Triggers enter animation for new <p>
74
+ }
75
+ </script>
76
+ ```
77
+
78
+ ## Why This Works
79
+
80
+ When Vue sees a `:key` change:
81
+ 1. It considers the old element and new element as different
82
+ 2. The old element is removed (triggering leave animation)
83
+ 3. A new element is created (triggering enter animation)
84
+
85
+ Without `:key`:
86
+ 1. Vue sees the same element type in the same position
87
+ 2. It updates the element's properties in place
88
+ 3. No DOM addition/removal occurs, so no animation triggers
89
+
90
+ ## Common Use Cases
91
+
92
+ ### Animating Text Content Changes
93
+
94
+ ```vue
95
+ <template>
96
+ <div v-auto-animate>
97
+ <h1 :key="title">{{ title }}</h1>
98
+ <p :key="description">{{ description }}</p>
99
+ </div>
100
+ </template>
101
+ ```
102
+
103
+ ### Animating Dynamic Components
104
+
105
+ ```vue
106
+ <template>
107
+ <div v-auto-animate>
108
+ <component :is="currentComponent" :key="currentComponent" />
109
+ </div>
110
+ </template>
111
+ ```
112
+
113
+ ### Animating Route Transitions
114
+
115
+ ```vue
116
+ <template>
117
+ <router-view v-slot="{ Component, route }">
118
+ <div v-auto-animate>
119
+ <component :is="Component" :key="route.fullPath" />
120
+ </div>
121
+ </router-view>
122
+ </template>
123
+ ```
124
+
125
+ ## With Vue's Built-in Transition
126
+
127
+ The same principle applies to Vue's `<Transition>` component:
128
+
129
+ ```vue
130
+ <template>
131
+ <!-- GOOD: Key triggers transition on content change -->
132
+ <Transition name="fade" mode="out-in">
133
+ <p :key="message">{{ message }}</p>
134
+ </Transition>
135
+
136
+ <!-- GOOD: Different keys for conditional content -->
137
+ <Transition name="fade" mode="out-in">
138
+ <div v-if="isLoading" key="loading">Loading...</div>
139
+ <div v-else key="content">{{ content }}</div>
140
+ </Transition>
141
+ </template>
142
+ ```
143
+
144
+ ## Caution: Performance Implications
145
+
146
+ Using `:key` forces full component re-creation. For frequently changing data:
147
+ - The entire component tree under the keyed element is destroyed and recreated
148
+ - Any component state is lost
149
+ - Consider whether the animation is worth the performance cost
150
+
151
+ ```vue
152
+ <!-- Be cautious with complex components -->
153
+ <ComplexDashboard :key="refreshTrigger" />
154
+ <!-- This destroys and recreates the entire dashboard! -->
155
+ ```
156
+
157
+ ## Reference
158
+ - [Vue.js Animation Techniques](https://vuejs.org/guide/extras/animation.html)
159
+ - [AutoAnimate with Vue](https://auto-animate.formkit.com/#usage-vue)
160
+ - [Vue.js v-for with key](https://vuejs.org/guide/essentials/list.html#maintaining-state-with-key)
@@ -0,0 +1,241 @@
1
+ ---
2
+ title: TransitionGroup Performance with Large Lists and CSS Frameworks
3
+ impact: MEDIUM
4
+ impactDescription: TransitionGroup can cause noticeable DOM update lag when animating list changes, especially with CSS frameworks
5
+ type: gotcha
6
+ tags: [vue3, transition-group, animation, performance, list, css-framework]
7
+ ---
8
+
9
+ # TransitionGroup Performance with Large Lists and CSS Frameworks
10
+
11
+ **Impact: MEDIUM** - Vue's `<TransitionGroup>` can experience significant DOM update lag when animating list changes, particularly when:
12
+ - Using CSS frameworks (Tailwind, Bootstrap, etc.)
13
+ - Performing array operations like `slice()` that change multiple items
14
+ - Working with larger lists
15
+
16
+ Without TransitionGroup, DOM updates occur instantly. With it, there can be noticeable delay before the UI reflects changes.
17
+
18
+ ## Task Checklist
19
+
20
+ - [ ] For frequently updated lists, consider if transition animations are necessary
21
+ - [ ] Use CSS `content-visibility: auto` for long lists to reduce render cost
22
+ - [ ] Minimize CSS framework classes on list items during transitions
23
+ - [ ] Consider virtual scrolling for very large animated lists
24
+ - [ ] Profile with Vue DevTools to identify transition bottlenecks
25
+
26
+ **Problematic Pattern:**
27
+ ```vue
28
+ <template>
29
+ <!-- Potentially slow with large lists or complex CSS -->
30
+ <TransitionGroup name="list" tag="ul">
31
+ <li
32
+ v-for="item in items"
33
+ :key="item.id"
34
+ class="p-4 m-2 rounded-lg shadow-md bg-gradient-to-r from-blue-500 to-purple-600
35
+ hover:shadow-lg transition-all duration-300 ease-in-out transform hover:scale-105
36
+ border border-gray-200 flex items-center justify-between"
37
+ >
38
+ {{ item.name }}
39
+ </li>
40
+ </TransitionGroup>
41
+ </template>
42
+
43
+ <script setup>
44
+ import { ref } from 'vue'
45
+
46
+ const items = ref([/* many items */])
47
+
48
+ // Operations like slice can cause visible lag
49
+ function removeItems() {
50
+ items.value = items.value.slice(5) // May lag with TransitionGroup
51
+ }
52
+ </script>
53
+
54
+ <style>
55
+ .list-move,
56
+ .list-enter-active,
57
+ .list-leave-active {
58
+ transition: all 0.5s ease;
59
+ }
60
+ </style>
61
+ ```
62
+
63
+ **Optimized Approach:**
64
+ ```vue
65
+ <template>
66
+ <!-- Simpler classes, shorter transitions -->
67
+ <TransitionGroup name="list" tag="ul" class="relative">
68
+ <li
69
+ v-for="item in items"
70
+ :key="item.id"
71
+ class="list-item"
72
+ >
73
+ {{ item.name }}
74
+ </li>
75
+ </TransitionGroup>
76
+ </template>
77
+
78
+ <script setup>
79
+ import { ref, computed } from 'vue'
80
+
81
+ const items = ref([/* items */])
82
+
83
+ // For large batch operations, consider disabling animations temporarily
84
+ const isAnimating = ref(true)
85
+ </script>
86
+
87
+ <style>
88
+ /* Keep transition CSS simple and specific */
89
+ .list-item {
90
+ /* Minimal styles during animation */
91
+ padding: 1rem;
92
+ }
93
+
94
+ .list-move {
95
+ transition: transform 0.3s ease; /* Shorter duration */
96
+ }
97
+
98
+ .list-enter-active,
99
+ .list-leave-active {
100
+ transition: opacity 0.2s ease, transform 0.2s ease;
101
+ }
102
+
103
+ .list-enter-from,
104
+ .list-leave-to {
105
+ opacity: 0;
106
+ transform: translateX(-20px);
107
+ }
108
+
109
+ /* Use will-change sparingly */
110
+ .list-enter-active {
111
+ will-change: opacity, transform;
112
+ }
113
+
114
+ /* Absolute positioning for leaving elements prevents layout thrashing */
115
+ .list-leave-active {
116
+ position: absolute;
117
+ width: 100%;
118
+ }
119
+ </style>
120
+ ```
121
+
122
+ ## Performance Optimization Strategies
123
+
124
+ ### 1. Skip Animations for Bulk Operations
125
+
126
+ ```vue
127
+ <template>
128
+ <TransitionGroup v-if="animationsEnabled" name="list" tag="ul">
129
+ <li v-for="item in items" :key="item.id">{{ item.name }}</li>
130
+ </TransitionGroup>
131
+
132
+ <!-- Instant update without animations -->
133
+ <ul v-else>
134
+ <li v-for="item in items" :key="item.id">{{ item.name }}</li>
135
+ </ul>
136
+ </template>
137
+
138
+ <script setup>
139
+ import { ref, nextTick } from 'vue'
140
+
141
+ const animationsEnabled = ref(true)
142
+
143
+ async function bulkUpdate(newItems) {
144
+ // Disable animations for bulk operations
145
+ animationsEnabled.value = false
146
+ items.value = newItems
147
+ await nextTick()
148
+ animationsEnabled.value = true
149
+ }
150
+ </script>
151
+ ```
152
+
153
+ ### 2. Virtual Scrolling for Large Lists
154
+
155
+ ```vue
156
+ <template>
157
+ <!-- Use a virtual list library for large datasets -->
158
+ <RecycleScroller
159
+ :items="items"
160
+ :item-size="50"
161
+ key-field="id"
162
+ v-slot="{ item }"
163
+ >
164
+ <div class="list-item">{{ item.name }}</div>
165
+ </RecycleScroller>
166
+ </template>
167
+
168
+ <script setup>
169
+ import { RecycleScroller } from 'vue-virtual-scroller'
170
+ </script>
171
+ ```
172
+
173
+ ### 3. Reduce CSS Complexity During Transitions
174
+
175
+ ```vue
176
+ <style>
177
+ /* Move complex styles to a stable wrapper */
178
+ .list-item-wrapper {
179
+ @apply p-4 m-2 rounded-lg shadow-md bg-gradient-to-r from-blue-500 to-purple-600;
180
+ }
181
+
182
+ /* Keep animated element styles minimal */
183
+ .list-item {
184
+ /* Only essential layout styles */
185
+ }
186
+
187
+ .list-move,
188
+ .list-enter-active,
189
+ .list-leave-active {
190
+ /* Only animate transform/opacity - GPU accelerated */
191
+ transition: transform 0.3s ease, opacity 0.3s ease;
192
+ }
193
+ </style>
194
+ ```
195
+
196
+ ### 4. Use CSS content-visibility
197
+
198
+ ```css
199
+ /* For very long lists, defer rendering of off-screen items */
200
+ .list-item {
201
+ content-visibility: auto;
202
+ contain-intrinsic-size: 0 50px; /* Estimated height */
203
+ }
204
+ ```
205
+
206
+ ## When to Avoid TransitionGroup
207
+
208
+ Consider alternatives when:
209
+ - List updates are frequent (real-time data)
210
+ - List contains 100+ items
211
+ - Items have complex CSS or nested components
212
+ - Performance is critical (mobile, low-end devices)
213
+
214
+ ```vue
215
+ <!-- Simple alternative: CSS-only animations on individual items -->
216
+ <ul>
217
+ <li
218
+ v-for="item in items"
219
+ :key="item.id"
220
+ class="animate-in"
221
+ >
222
+ {{ item.name }}
223
+ </li>
224
+ </ul>
225
+
226
+ <style>
227
+ @keyframes fadeIn {
228
+ from { opacity: 0; transform: translateY(-10px); }
229
+ to { opacity: 1; transform: translateY(0); }
230
+ }
231
+
232
+ .animate-in {
233
+ animation: fadeIn 0.3s ease forwards;
234
+ }
235
+ </style>
236
+ ```
237
+
238
+ ## Reference
239
+ - [Vue.js TransitionGroup](https://vuejs.org/guide/built-ins/transition-group.html)
240
+ - [GitHub Issue: transition-group DOM update lag](https://github.com/vuejs/vue/issues/5845)
241
+ - [Vue Virtual Scroller](https://github.com/Akryum/vue-virtual-scroller)