vueuse
onmax/nuxt-skills
Essential Vue Composition utilities for common browser APIs and state management patterns.
What is vueuse?
VueUse is a collection of composable functions for Vue 3 that provide reactive wrappers around browser APIs and common patterns. Use it to avoid writing custom composables for tasks like mouse tracking, localStorage management, network detection, and debouncing—most patterns are already implemented and battle-tested.
- Track mouse position, keyboard input, and device orientation reactively
- Manage localStorage, sessionStorage, and ref history for state persistence
- Detect network status, handle fetch requests, and manage WebSocket connections
- Debounce and throttle values with watchDebounced, watchThrottled, and refDebounced
- Access browser APIs like clipboard, fullscreen, and media queries reactively
- Handle component refs, virtual lists, and template ref collections
How to install vueuse
npx skills add https://github.com/onmax/nuxt-skills --skill vueuse- Vue 3.5+ or Nuxt 3.x
- pnpm, npm, or yarn package manager
- For Nuxt: add @vueuse/nuxt module to nuxt.config.ts
How to use vueuse
- 1.Install @vueuse/core (or @vueuse/nuxt for Nuxt projects)
- 2.For Nuxt, add @vueuse/nuxt to modules in nuxt.config.ts
- 3.Import composables directly (auto-imported in Nuxt) or from @vueuse/core
- 4.Use composables in your component setup or script setup blocks
- 5.For SSR, wrap browser-only code in onMounted or check isClient flag
- 6.Reference composables.md when searching for a specific utility by category
Use cases
- Building interactive dashboards that respond to mouse movement or window resizing
- Persisting user preferences and form state to localStorage without manual serialization
- Detecting network connectivity changes and handling offline scenarios
- Implementing search inputs with debounced API calls to reduce server load
- Creating responsive layouts that adapt to media query changes
- Vue 3 developers building interactive applications
- Nuxt developers (auto-imports available via @vueuse/nuxt module)
- Frontend engineers avoiding reinventing common composable patterns
- Teams building SSR applications needing safe browser API wrappers
vueuse FAQ
No. The @vueuse/nuxt module auto-imports all composables, so you can use them directly without explicit imports.
Many composables return safe defaults on the server (e.g., useMouse returns {x: 0, y: 0}). For browser-only code, wrap it in onMounted() or check isClient before using.
Yes, but component refs need special handling. Use unrefElement() helper or access .$el directly in onMounted to get the underlying DOM element.
Use createSharedComposable() to wrap any composable and ensure only one instance exists across your application.
Load references/composables.md which lists all composables organized by category (State, Elements, Browser, Sensors, Network, Animation, etc.).
Full instructions (SKILL.md)
Source of truth, from onmax/nuxt-skills.
name: vueuse description: Use when working with VueUse composables - track mouse position with useMouse, manage localStorage with useStorage, detect network status with useNetwork, debounce values with refDebounced, and access browser APIs reactively. Check VueUse before writing custom composables - most patterns already implemented. license: MIT
VueUse
Collection of essential Vue Composition utilities. Check VueUse before writing custom composables - most patterns already implemented.
Current stable: VueUse 14.x for Vue 3.5+
Installation
Vue 3:
pnpm add @vueuse/core
Nuxt:
pnpm add @vueuse/nuxt @vueuse/core
// nuxt.config.ts
export default defineNuxtConfig({
modules: ['@vueuse/nuxt'],
})
Nuxt module auto-imports composables - no import needed.
Categories
| Category | Examples |
|---|---|
| State | useLocalStorage, useSessionStorage, useRefHistory |
| Elements | useElementSize, useIntersectionObserver, useResizeObserver |
| Browser | useClipboard, useFullscreen, useMediaQuery |
| Sensors | useMouse, useKeyboard, useDeviceOrientation |
| Network | useFetch, useWebSocket, useEventSource |
| Animation | useTransition, useInterval, useTimeout |
| Component | useVModel, useVirtualList, useTemplateRefsList |
| Watch | watchDebounced, watchThrottled, watchOnce |
| Reactivity | createSharedComposable, toRef, toReactive |
| Array | useArrayFilter, useArrayMap, useSorted |
| Time | useDateFormat, useNow, useTimeAgo |
| Utilities | useDebounce, useThrottle, useMemoize |
Quick Reference
Load composable files based on what you need:
| Working on... | Load file |
|---|---|
| Finding a composable | references/composables.md |
| Specific composable | composables/<name>.md |
Loading Files
Consider loading these reference files based on your task:
- references/composables.md - if searching for VueUse composables by category or functionality
DO NOT load all files at once. Load only what's relevant to your current task.
Common Patterns
State persistence:
const state = useLocalStorage('my-key', { count: 0 })
Mouse tracking:
const { x, y } = useMouse()
Debounced ref:
const search = ref('')
const debouncedSearch = refDebounced(search, 300)
Shared composable (singleton):
const useSharedMouse = createSharedComposable(useMouse)
SSR Gotchas
Many VueUse composables use browser APIs unavailable during SSR.
Check with isClient:
import { isClient } from '@vueuse/core'
if (isClient) {
// Browser-only code
const { width } = useWindowSize()
}
Wrap in onMounted:
const width = ref(0)
onMounted(() => {
// Only runs in browser
const { width: w } = useWindowSize()
width.value = w.value
})
Use SSR-safe composables:
// These check isClient internally
const mouse = useMouse() // Returns {x: 0, y: 0} on server
const storage = useLocalStorage('key', 'default') // Uses default on server
@vueuse/nuxt auto-handles SSR - composables return safe defaults on server.
Target Element Refs
When targeting component refs instead of DOM elements:
import type { MaybeElementRef } from '@vueuse/core'
// Component ref needs .$el to get DOM element
const compRef = ref<ComponentInstance>()
const { width } = useElementSize(compRef) // ❌ Won't work
// Use MaybeElementRef pattern
import { unrefElement } from '@vueuse/core'
const el = computed(() => unrefElement(compRef)) // Gets .$el
const { width } = useElementSize(el) // ✅ Works
Or access $el directly:
const compRef = ref<ComponentInstance>()
onMounted(() => {
const el = compRef.value?.$el as HTMLElement
const { width } = useElementSize(el)
})
Related skills
More from onmax/nuxt-skills and the wider catalog.

document-writer
Writing guide for Nuxt documentation and blog posts with style standards, content patterns, and MDC component usage.

motion
Production-ready Vue 3/Nuxt animation library with gestures, scroll effects, and spring physics

nuxt-better-auth
Guides authentication in Nuxt apps using @nuxtjs/better-auth with client/server APIs, route protection, and session management.

nuxt-content
Build typed, content-driven Nuxt applications with collections, queries, and Markdown rendering.

claude-to-im
Bridge Claude Code/Codex to Telegram, Discord, Feishu, QQ, or WeChat for mobile chat access.

document-illustrator
>