@vueuse/integrations 15.0.0
Add-on to VueUse: reactive wrappers for 12 utility libraries. Requires Vue (^3.5.0) and ships @vueuse/core + @vueuse/shared 15.0.0 as dependencies (package.json:55-70,108-111). ESM-only since v13. Node >= 22 since v15 (package.json:52-54).
References
- Full API surface — every export, signature, option, and default, verified against
dist/. - Usage patterns — per-function recipes and gotchas.
- Migration v14 to v15 — breaking changes and update steps.
Install
npm i @vueuse/integrations
Each wrapper needs its own optional peer dependency installed, otherwise the import fails at runtime:
| Composable | Peer dependency |
|---|---|
useAsyncValidator | async-validator@^4 |
useAxios | axios@^1 |
useChangeCase | change-case@^5 |
useCookies | `universal-cookie@^7 |
useDrauu | `drauu@^1 |
useFocusTrap | `focus-trap@^7 |
useFuse | fuse.js@^7 |
useIDBKeyval | idb-keyval@^6 |
useJwt | jwt-decode@^4 |
useNProgress | nprogress@^0.2 |
useQRCode | qrcode@^1.5 |
useSortable | sortablejs@^1 |
Source: package.json:55-69.
Import rule: use submodules
Import from per-function submodules for tree-shaking (README.md:33-42):
// Preferred
import { useAxios } from '@vueuse/integrations/useAxios'
// Avoid
import { useAxios } from '@vueuse/integrations'
Components import from /component subpaths:
import { UseFocusTrap } from '@vueuse/integrations/useFocusTrap/component'
import { UseSortable } from '@vueuse/integrations/useSortable/component'
import { UseAsyncValidator } from '@vueuse/integrations/useAsyncValidator/component'
Alias exports were deprecated in v14.0.0; use the original names (https://github.com/vueuse/vueuse/issues/5009).
v15 breaking changes (from v14)
useIDBKeyvalreturns an object{ data, isFinished, isSupported, set }, not a ref (dist/useIDBKeyval.d.ts:46-51).const count = useIDBKeyval('k', 0)no longer compiles; destructuredatainstead.useIDBKeyvalsyncs across tabs viaBroadcastChannelby default; disable withlistenToStorageChanges: false(dist/useIDBKeyval.js:60-76, https://github.com/vueuse/vueuse/pull/5338).- Node.js 20 dropped; requires Node >= 22 (https://github.com/vueuse/vueuse/releases/tag/v15.0.0).
drauupeer range widened to^1 || ^0.4(https://github.com/vueuse/vueuse/pull/5595).
Details and migration code: migration reference.
Quick examples
useAxios
import { useAxios } from '@vueuse/integrations/useAxios'
// Awaits the whole result; rejects on error
const { data, error } = await useAxios('/api/posts')
// Manual trigger without firing immediately
const { execute } = useAxios('/api/posts', { method: 'GET' }, { immediate: false })
// Typed data via initialData (data becomes Ref<T> instead of Ref<T | undefined>)
const { data } = useAxios<User[]>('/api/users', undefined, { initialData: [] })
execute() accepts url, config, or both. Default options: immediate (true only when a url string is passed), shallow: true, abortPrevious: true, resetOnExecute: false (dist/useAxios.js:13-17,35).
useIDBKeyval
import { useIDBKeyval } from '@vueuse/integrations/useIDBKeyval'
const { data: count, set } = useIDBKeyval('my-count', 0)
count.value++ // watched, persisted automatically
await set(10) // explicit write, resolves after the IDB transaction
count.value = null // deletes the key
useSortable
import { useSortable } from '@vueuse/integrations/useSortable'
const list = ref(['a', 'b', 'c'])
const { start, stop, option } = useSortable(el, list, {
watchElement: true, // reinitialize when el appears/disappears (v-if)
})
The default onUpdate handler moves the array element for you (dist/useSortable.js:14-16). Pass your own onUpdate to override; use moveArrayElement(list, from, to, e) for manual moves.
useFocusTrap
import { useFocusTrap } from '@vueuse/integrations/useFocusTrap'
const target = useTemplateRef<HTMLElement>('modal')
const { activate, deactivate, hasFocus } = useFocusTrap(target, { immediate: true })
async function open() {
show.value = true
await nextTick() // wait for v-if to render the element
activate()
}
Container element changes are tracked automatically; the returned object is { hasFocus, isPaused, activate, deactivate, pause, unpause } with no updateContainerElements (dist/useFocusTrap.js:37-66).
useCookies
import { useCookies } from '@vueuse/integrations/useCookies'
const { get, set, remove } = useCookies(['token'], { autoUpdateDependencies: true })
For SSR, build the composable from the request with createCookies(req) (dist/useCookies.d.ts:4-9). In Nuxt, import explicitly to avoid clashing with Nuxt's useCookie.
useFuse
import { useFuse } from '@vueuse/integrations/useFuse'
const search = ref('')
const { results } = useFuse(search, data, {
fuseOptions: { keys: ['title'] },
resultLimit: 10,
matchAllWhenSearchEmpty: true,
})
Remaining wrappers
useChangeCase('hello world', 'camelCase') // writable computed; type must match a change-case *Case export
useDrauu(svgEl, { brush: { color: 'red' } }) // target must be an <svg> element
useJwt(token) // { header, payload } with fallbackValue on decode error
useNProgress() // { isLoading, progress, start, done, remove }
useQRCode('https://vueuse.org') // ShallowRef<string> of a data URL
useAsyncValidator(form, rules, { manual: true }) // thenable; { pass, errors, execute }
See usage patterns before writing non-trivial code with useDrauu, useNProgress, useQRCode, or useAsyncValidator.
Environment limits
- Vue
^3.5.0peer (package.json:68). - ESM-only; no CommonJS build since v13.0.0 (https://github.com/vueuse/vueuse/releases/tag/v13.0.0).
- Node >= 22 (package.json:53).
useQRCoderenders only in the browser (isClientguard, dist/useQRCode.js:16).useIDBKeyvaltab sync needsBroadcastChannel;isSupportedreports it (dist/useIDBKeyval.js:18).