mcpField
V
vueuse-shared-skilld

vueuse-shared-skilld

github.com/skilld-devDevelopment184135 installsUpdated 3w ago
Repository

About vueuse-shared-skilld

A skill covering @vueuse/shared reactive utilities for Vue developers. It documents common helpers and v15 behavior, including timing, watchers, state sharing, and migration notes.

Key features

  1. 01Debounce and throttle functions
  2. 02Watch helpers and async condition waiting
  3. 03Reactive reference and synchronization utilities
  4. 04Global, shared, and injected state patterns
  5. 05v15 changes and deprecated API guidance

Use cases

  1. 01Rate-limiting scroll or resize handlers
  2. 02Waiting for reactive conditions with a timeout
  3. 03Sharing state across components
  4. 04Updating code for v15 defaults and aliases

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/skilld-dev/vue-ecosystem-skills --skill vueuse-shared-skilld

After installing, type/vueuse-shared-skilldin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

references/
api-surface.md
debounce-throttle.md
migration-v15.md
reactivity-utilities.md
state-sharing.md
timers-and-utils.md
watch-utilities.md

Details

From the project README

@vueuse/shared 15.0.0

Framework-agnostic reactive utilities for Vue. Peer dependency vue ^3.5.0 (package.json:40). ESM-only: "type": "module" and no CJS build in dist (package.json:2). Requires Node.js >= 22 (package.json:37).

Source citations like dist/index.js:904 refer to the prepared package source. Function docs: https://vueuse.org/<functionName>.

Critical v15 rules

  • useThrottleFn default trailing changed from false to true in v15.0.0. Defaults are now ms = 200, trailing = true, leading = true, rejectOnCancel = false (dist/index.js:904). Release: https://github.com/vueuse/vueuse/releases/tag/v15.0.0 To get v14 leading-edge-only behavior, pass trailing = false explicitly.
  • computedEager / eagerComputed are deprecated and slated for removal. Use Vue 3.4+ computed instead (dist/index.d.ts:5-18).
  • watchPausable / pausableWatch are deprecated on every overload. Use Vue's built-in watch, whose handle already has pause() and resume() (dist/index.js:1021, dist/index.d.ts:1459-1466).
  • Prefer primary names over deprecated aliases; see the table in migration-v15.
  • Timer composables are no-ops on the server: useIntervalFn and useTimeoutFn only start timers when isClient (dist/index.js:1654, dist/index.js:1726-1729).

Common tasks

import { useDebounceFn, useThrottleFn } from '@vueuse/shared'

// Debounced fn: returns a promise; cancel/flush/isPending attached
const search = useDebounceFn(query => fetchApi(query), 300, { maxWait: 1000 })

// Rate-limit scroll/resize; v15 fires on BOTH edges by default
const onScroll = useThrottleFn(handler, 200)          // leading + trailing
const onScrollV14 = useThrottleFn(handler, 200, false) // trailing=false, v14 style
import { until, whenever } from '@vueuse/shared'

// One-shot async flow control instead of manual watchers
await until(isReady).toBe(true, { timeout: 5000, throwOnTimeout: true })

// Runs only while truthy; { once: true } auto-stops after the first run
whenever(isReady, data => render(data), { once: true })
import { createInjectionState } from '@vueuse/shared'

// Typed provide/inject pair without manual InjectionKey
const [useProvideStore, useStore] = createInjectionState(() => {
  const count = ref(0)
  return { count, inc: () => count.value++ }
}, { defaultValue: { count: ref(0), inc: () => {} } })
import { refManualReset, syncRef } from '@vueuse/shared'

const message = refManualReset('idle')   // message.reset() restores 'idle'
const num = ref(10), str = ref('10')
syncRef(num, str, {                       // transform is required when
  transform: {                            // types differ (type-level check)
    ltr: v => String(v),
    rtl: v => Number(v),
  },
})

More worked patterns: reactivity-utilities, watch-utilities.

Choosing state-sharing tools

ToolLifetimeUse when
createGlobalStateApp lifetime, never disposed (dist/index.js:169-180)App-wide singleton state
createSharedComposableDisposed when last subscriber leaves (dist/index.js:583-605)One shared instance of a composable, e.g. one useMouse
createInjectionStateTied to component treeTyped provider/consumer stores
provideLocal / injectLocalSame component or scopeProvide and inject within one component

SSR: createSharedComposable falls back to the plain composable on the server, so every request gets fresh state (dist/index.js:584). Details: state-sharing.

References

Comments

Markdown supported