home / skills / onmax / nuxt-skills / vueuse
This skill helps you leverage VueUse composables for reactive state, browser APIs, and sensors, reducing custom code and ensuring SSR safety.
npx playbooks add skill onmax/nuxt-skills --skill vueuseReview the files below or copy the command above to add this skill to your agents.
---
name: vueuse
description: Use when working with VueUse composables - provides reactive utilities for state, browser APIs, sensors, network, animations. 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:**
```bash
pnpm add @vueuse/core
```
**Nuxt:**
```bash
pnpm add @vueuse/nuxt @vueuse/core
```
```ts
// 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](references/composables.md) |
| Specific composable | `composables/<name>.md` |
## Loading Files
**Start with [references/composables.md](references/composables.md)** to find the right composable.
Then load the specific composable file for detailed usage: `composables/use-mouse.md`, `composables/use-local-storage.md`, etc.
**DO NOT load all files at once** - wastes context on irrelevant patterns.
## Common Patterns
**State persistence:**
```ts
const state = useLocalStorage('my-key', { count: 0 })
```
**Mouse tracking:**
```ts
const { x, y } = useMouse()
```
**Debounced ref:**
```ts
const search = ref('')
const debouncedSearch = refDebounced(search, 300)
```
**Shared composable (singleton):**
```ts
const useSharedMouse = createSharedComposable(useMouse)
```
## SSR Gotchas
Many VueUse composables use browser APIs unavailable during SSR.
**Check with `isClient`:**
```ts
import { isClient } from '@vueuse/core'
if (isClient) {
// Browser-only code
const { width } = useWindowSize()
}
```
**Wrap in onMounted:**
```ts
const width = ref(0)
onMounted(() => {
// Only runs in browser
const { width: w } = useWindowSize()
width.value = w.value
})
```
**Use SSR-safe composables:**
```ts
// 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:
```ts
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:**
```ts
const compRef = ref<ComponentInstance>()
onMounted(() => {
const el = compRef.value?.$el as HTMLElement
const { width } = useElementSize(el)
})
```
This skill helps you leverage VueUse, a collection of battle-tested Vue Composition utilities for state, browser APIs, sensors, network, animations, and more. I recommend checking VueUse before building custom composables because many common patterns are already implemented. It supports Vue 3.5+ and offers Nuxt integration with auto-imported composables.
The skill surfaces common composables (useMouse, useLocalStorage, useFetch, useElementSize, etc.) and shows how to wire them into Vue and Nuxt projects. It explains SSR safety, element ref patterns, and shared-singleton composables, plus installation and integration tips. Examples demonstrate typical patterns like persisted state, debounced refs, and client-only usage.
Do I need to guard every composable for SSR?
Not always. Many VueUse composables return safe defaults on the server, but browser-only APIs still require isClient or onMounted guards when accessing real DOM or window objects.
How does Nuxt integration change usage?
With @vueuse/nuxt, composables are auto-imported and the module handles SSR safety for many utilities, reducing manual guards and imports.
Can I use VueUse with component refs?
Yes. Convert component refs to DOM elements using unrefElement or access the component's .$el inside onMounted before passing to element-focused composables.