Catalog
vuejs-ai/create-adaptable-composable

vuejs-ai

create-adaptable-composable

Create a library-grade Vue composable that accepts maybe-reactive inputs (MaybeRef / MaybeRefOrGetter) so callers can pass a plain value, ref, or getter. Normalize inputs with toValue()/toRef() inside reactive effects (watch/watchEffect) to keep behavior predictable and reactive. Use this skill when user asks for creating adaptable or reusable composables.

globalRequires Vue 3 (or above) or Nuxt 3 (or above) project
author:github.com/vuejs-ai
version:17.0.0
New~619
v1.0Saved Jul 11, 2026

Create Adaptable Composable

Adaptable composables are reusable functions that can accept both reactive and non-reactive inputs. This allows developers to use the composable in a variety of contexts without worrying about the reactivity of the inputs.

Steps to design an adaptable composable in Vue.js:

  1. Confirm the composable's purpose and API design and expected inputs/outputs.
  2. Identify inputs params that should be reactive (MaybeRef / MaybeRefOrGetter).
  3. Use toValue() or toRef() to normalize inputs inside reactive effects.
  4. Implement the core logic of the composable using Vue's reactivity APIs.

Core Type Concepts

Type Utilities

/**
 * value or writable ref (value/ref/shallowRef/writable computed)
 */
export type MaybeRef<T = any> = T | Ref<T> | ShallowRef<T> | WritableComputedRef<T>;

/**
 * MaybeRef<T> + ComputedRef<T> + () => T
 */
export type MaybeRefOrGetter<T = any> = MaybeRef<T> | ComputedRef<T> | (() => T);

Policy and Rules

  • Read-only, computed-friendly input: use MaybeRefOrGetter
  • Needs to be writable / two-way input: use MaybeRef
  • Parameter might be a function value (callback/predicate/comparator): do not use MaybeRefOrGetter, or you may accidentally invoke it as a getter.
  • DOM/Element targets: if you want computed/derived targets, use MaybeRefOrGetter.

When MaybeRefOrGetter or MaybeRef is used:

  • resolve reactive value using toRef() (e.g. watcher source)
  • resolve non-reactive value using toValue()

Examples

Adaptable useDocumentTitle Composable: read-only title parameter

import { watch, toRef } from 'vue'
import type { MaybeRefOrGetter } from 'vue'

export function useDocumentTitle(title: MaybeRefOrGetter<string>) {
  watch(toRef(title), (t) => {
    document.title = t
  }, { immediate: true })
}

Adaptable useCounter Composable: two-way writable count parameter

import { watch, toRef } from 'vue'
import type { MaybeRef } from 'vue'

function useCounter(count: MaybeRef<number>) {
  const countRef = toRef(count)
  function add() {
    countRef.value++
  }
  return { add }
}
Files1
1 files · 1.1 KB

Select a file to preview

Overall Score

82/100

Grade

B

Good

Safety

95

Quality

80

Clarity

82

Completeness

72

Summary

This skill teaches developers how to create adaptable Vue 3 composables that accept inputs in multiple reactive forms (plain values, refs, getters). It provides type definitions, design rules, and practical examples for normalizing inputs with toValue()/toRef() inside reactive effects to maintain predictable behavior.

Detected Capabilities

code analysis and generationvue composable pattern guidancetypescript type definitionsreactive effect implementation

Trigger Keywords

Phrases that MCP clients use to match this skill to user intent.

create adaptable composablemaybe-reactive inputsvue composable reusabilitynormalize reactive valuestwo-way composable binding

Referenced Domains

External domains referenced in skill content, detected by static analysis.

github.com

Use Cases

  • Build a reusable composable that accepts plain values, refs, or getters without forcing callers to wrap inputs
  • Design a composable with read-only computed-friendly input using MaybeRefOrGetter type
  • Create a composable with writable two-way binding using MaybeRef type
  • Implement document title synchronization that reacts to both reactive and non-reactive title sources
  • Build a counter composable that can increment a ref or plain number value

Quality Notes

  • Clear policy section explicitly states when to use MaybeRef vs MaybeRefOrGetter with decision rules
  • Concrete examples (useDocumentTitle, useCounter) demonstrate both read-only and writable patterns
  • Type utilities are well-documented with JSDoc comments explaining each type's purpose
  • Design steps (1-4) provide a logical workflow for creating adaptable composables
  • Caution about callbacks/predicates vs getters is a valuable edge case that prevents common mistakes
  • Skill scope is tightly focused on Vue 3 composable patterns — no unrelated content
Model: claude-haiku-4-5-20251001Analyzed: Jul 11, 2026

Reviews

Add this skill to your library to leave a review.

No reviews yet

Be the first to share your experience.

Add vuejs-ai/create-adaptable-composable to your library

Command Palette

Search for a command to run...