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+ **Vue 3:**
pnpm add @vueuse/corepnpm add @vueuse/nuxt @vueuse/core// nuxt.config.ts export default defineNuxtConfig({ modules: ['@vueuse/nuxt'], })
composables/<name>.mdconst state = useLocalStorage('my-key', { count: 0 })const { x, y } = useMouse()const search = ref('') const debouncedSearch = refDebounced(search, 300) `**Shared composable (singleton):**` const useSharedMouse = createSharedComposable(useMouse)
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.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) })