PluginBench
Skill
Pass
Audit score 90

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
Prerequisites
  • Vue 3.5+ or Nuxt 3.x
  • pnpm, npm, or yarn package manager
  • For Nuxt: add @vueuse/nuxt module to nuxt.config.ts
Claude Code
Cursor
Windsurf
Cline

How to use vueuse

  1. 1.Install @vueuse/core (or @vueuse/nuxt for Nuxt projects)
  2. 2.For Nuxt, add @vueuse/nuxt to modules in nuxt.config.ts
  3. 3.Import composables directly (auto-imported in Nuxt) or from @vueuse/core
  4. 4.Use composables in your component setup or script setup blocks
  5. 5.For SSR, wrap browser-only code in onMounted or check isClient flag
  6. 6.Reference composables.md when searching for a specific utility by category

Use cases

Good for
  • 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
Who it's for
  • 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

Do I need to import VueUse composables in Nuxt?

No. The @vueuse/nuxt module auto-imports all composables, so you can use them directly without explicit imports.

How do I use VueUse composables safely in SSR applications?

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.

Can I use VueUse composables with component refs instead of DOM elements?

Yes, but component refs need special handling. Use unrefElement() helper or access .$el directly in onMounted to get the underlying DOM element.

What if I need a singleton composable shared across components?

Use createSharedComposable() to wrap any composable and ensure only one instance exists across your application.

Where do I find all available composables?

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

CategoryExamples
StateuseLocalStorage, useSessionStorage, useRefHistory
ElementsuseElementSize, useIntersectionObserver, useResizeObserver
BrowseruseClipboard, useFullscreen, useMediaQuery
SensorsuseMouse, useKeyboard, useDeviceOrientation
NetworkuseFetch, useWebSocket, useEventSource
AnimationuseTransition, useInterval, useTimeout
ComponentuseVModel, useVirtualList, useTemplateRefsList
WatchwatchDebounced, watchThrottled, watchOnce
ReactivitycreateSharedComposable, toRef, toReactive
ArrayuseArrayFilter, useArrayMap, useSorted
TimeuseDateFormat, useNow, useTimeAgo
UtilitiesuseDebounce, useThrottle, useMemoize

Quick Reference

Load composable files based on what you need:

Working on...Load file
Finding a composablereferences/composables.md
Specific composablecomposables/<name>.md

Loading Files

Consider loading these reference files based on your task:

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)
})