Main Site ↗

vue

by antfu4.4k90GitHub

Vue.js progressive JavaScript framework. Use when building Vue components, working with reactivity (ref, reactive, computed, watch), or implementing Vue Composition API patterns.

Unlock Deep Analysis

Use AI to visualize the workflow and generate a realistic output preview for this skill.

Powered by Fastest LLM

Development
Compatible Agents
Claude Code
Claude Code
~/.claude/skills/
Codex CLI
Codex CLI
~/.codex/skills/
Gemini CLI
Gemini CLI
~/.gemini/skills/
O
OpenCode
~/.opencode/skills/
O
OpenClaw
~/.openclaw/skills/
GitHub Copilot
GitHub Copilot
~/.copilot/skills/
Cursor
Cursor
~/.cursor/skills/
W
Windsurf
~/.codeium/windsurf/skills/
C
Cline
~/.cline/skills/
R
Roo Code
~/.roo/skills/
K
Kiro
~/.kiro/skills/
J
Junie
~/.junie/skills/
A
Augment Code
~/.augment/skills/
W
Warp
~/.warp/skills/
G
Goose
~/.config/goose/skills/
SKILL.md

When to Use

User needs Vue expertise — from Composition API patterns to production optimization. Agent handles reactivity, component design, state management, and performance.

Quick Reference

TopicFile
Reactivity patternsreactivity.md
Component patternscomponents.md
Composables designcomposables.md
Performance optimizationperformance.md

Composition API Philosophy

  • Composition API is not about replacing Options API—it's about better code organization
  • Group code by feature, not by option type—related logic stays together
  • Extract reusable logic into composables—the main win of Composition API
  • <script setup> is the recommended syntax—cleaner and better performance

Reactivity Traps

  • ref for primitives—access with .value in script, auto-unwrapped in template
  • reactive can't reassign whole object—state = {...} breaks reactivity
  • Destructuring reactive loses reactivity—use toRefs(state) to preserve
  • Array index assignment reactive in Vue 3—arr[0] = x works, unlike Vue 2
  • Nested refs unwrap inside reactive—reactive({count: ref(0)}).count is number, not ref

Watch vs Computed

  • computed for derived state—cached, recalculates only when dependencies change
  • watch for side effects—when you need to DO something in response to changes
  • computed should be pure—no side effects, no async
  • watchEffect for immediate reaction with auto-tracked dependencies

Watch Traps

  • Watching reactive object needs deep: true—or watch a getter function
  • watch is lazy by default—use immediate: true for initial run
  • Watch callback receives old/new—watch(source, (newVal, oldVal) => {})
  • watchEffect can't access old value—use watch if you need old/new comparison
  • Stop watchers with returned function—const stop = watch(...); stop()

Props and Emits Traps

  • defineProps for type-safe props—defineProps<{ msg: string }>()
  • Props are readonly—don't mutate, emit event to parent
  • defineEmits for type-safe events—defineEmits<{ (e: 'update', val: string): void }>()
  • v-model is :modelValue + @update:modelValue—custom v-model with defineModel()
  • Default value for objects must be factory function—default: () => ({})

Template Ref Traps

  • ref="name" + const name = ref(null)—names must match exactly
  • Template refs available after mount—access in onMounted, not during setup
  • ref on component gives component instance—ref on element gives DOM element
  • Template ref with v-for becomes array of refs

Lifecycle Traps

  • onMounted for DOM access—component mounted to DOM
  • onUnmounted for cleanup—subscriptions, timers, event listeners
  • onBeforeMount runs before DOM insert—rarely needed but exists
  • Hooks must be called synchronously in setup—not inside callbacks or conditionals
  • Async setup needs <Suspense> wrapper

Provide/Inject Traps

  • provide('key', value) in parent—inject('key') in any descendant
  • Reactive if value is ref/reactive—otherwise static snapshot
  • Default value: inject('key', defaultVal)—third param for factory function
  • Symbol keys for type safety—avoid string key collisions

Vue Router Traps

  • useRoute for current route—reactive, use in setup
  • useRouter for navigation—router.push('/path')
  • Navigation guards: beforeEach, beforeResolve, afterEach—return false to cancel
  • <RouterView> with named views—multiple views per route

Common Mistakes

  • v-if vs v-show—v-if removes from DOM, v-show toggles display
  • Key on v-for required—v-for="item in items" :key="item.id"
  • Event modifiers order matters—.prevent.stop vs .stop.prevent
  • Teleport for modals—<Teleport to="body"> renders outside component tree

Source: https://github.com/antfu/skills#skills-vue

Content curated from original sources, copyright belongs to authors

Grade B
-AI Score
Best Practices
Checking...
Try this Skill

User Rating

USER RATING

0UP
0DOWN
Loading files...

WORKS WITH

Claude Code
Claude
Codex CLI
Codex
Gemini CLI
Gemini
O
OpenCode
O
OpenClaw
GitHub Copilot
Copilot
Cursor
Cursor
W
Windsurf
C
Cline
R
Roo
K
Kiro
J
Junie
A
Augment
W
Warp
G
Goose