home / skills / onmax / nuxt-skills / vueuse

vueuse skill

/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 vueuse

Review the files below or copy the command above to add this skill to your agents.

Files (267)
SKILL.md
4.2 KB
---
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)
})
```

Overview

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.

How this skill works

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.

When to use it

  • You need persistent or reactive state with minimal boilerplate (useLocalStorage, useSessionStorage).
  • You want to read browser or sensor APIs reactively (useMouse, useDeviceOrientation, useClipboard).
  • You need robust SSR-safe behavior in Nuxt or Vue apps.
  • You want utilities for animation, timing, or throttled/debounced watchers.
  • You are implementing common patterns and prefer composable reuse over custom solutions.

Best practices

  • Check VueUse first to avoid reinventing common composables.
  • Prefer SSR-safe composables or guard browser-only code with isClient or onMounted.
  • Use createSharedComposable to share singletons across components when needed.
  • For component refs, convert to element refs with unrefElement or access .$el inside onMounted.
  • Keep imports minimal in Nuxt by using @vueuse/nuxt so composables are auto-imported.

Example use cases

  • Persist user preferences: const prefs = useLocalStorage('prefs', {...}) to survive reloads.
  • Reactive sensor data: const { x, y } = useMouse() to build interactive UIs.
  • Debounced search: const debounced = refDebounced(query, 300) to limit API calls.
  • Server-safe rendering: wrap window-size logic in isClient or use SSR-safe VueUse composables.
  • Shared state across pages: const useShared = createSharedComposable(useSomeComposable) for singletons.

FAQ

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.