
Create Adaptable Composable
SkillGuides the agent in writing library-grade Vue composables whose inputs accept a plain value, ref or getter: choose MaybeRefOrGetter or MaybeRef depending on whether the input is read-only or writable, and normalize with toValue() and toRef() inside watchers. Requires Vue 3 or Nuxt 3+.
name: create-adaptable-composable
description: 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.
license: MIT
metadata:
author: github.com/vuejs-ai
version: "17.0.0"
compatibility: Requires Vue 3 (or above) or Nuxt 3 (or above) project
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:
- Confirm the composable's purpose and API design and expected inputs/outputs.
- Identify inputs params that should be reactive (MaybeRef / MaybeRefOrGetter).
- Use
toValue()ortoRef()to normalize inputs inside reactive effects. - 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 }
}
Похожие ресурсы

Vue Best Practices
SkillDefault workflow for Vue work: standardizes on Vue 3, the Composition API and script setup with TypeScript, reads core references on reactivity, SFCs, data flow and composables, plans component boundaries first, loads topics like slots, transitions and performance only when needed, then self-checks.
vuejs-ai/skills2.9k
Antfu Conventions
SkillApplies Anthony Fu's conventions for JavaScript and TypeScript projects: file organization, explicit imports, Vitest style, @antfu/ni, @antfu/eslint-config with antislop, Knip, tsdown and a single ci script, mirroring the antfu/starter-ts template for new projects.
antfu/skills6k
Nuxt
SkillReference for Nuxt 5, the full-stack Vue framework: directory layout, file-based routing, useFetch, auto-imports, server routes, rendering modes, SSR and hydration pitfalls, modules and layers, with notes on the move to Nitro v3 and Vite 8. Generated by Anthony Fu from the official docs.
antfu/skills6k
Pinia
SkillReference for Pinia v4, Vue's official state library: defining stores with state, getters and actions, plugins, composables, composing stores, testing with @pinia/testing, SSR, Nuxt and HMR. Recommends setup stores and storeToRefs. Generated by Anthony Fu from the official docs.
antfu/skills6k
Vue
SkillReference for Vue 3.5: script setup and macros such as defineProps, defineEmits and defineModel, reactivity, watchers and lifecycle, and built-ins like Transition, Teleport, Suspense and KeepAlive. Prefers the Composition API with TypeScript. Generated by Anthony Fu from the official docs.
antfu/skills6k
Vue Options API Best Practices
SkillFor Vue 3 projects on the Options API (data(), methods, this): how to get TypeScript inference with defineComponent and type props, event handlers and computed values, plus gotchas like avoiding arrow functions in methods and lifecycle hooks and not sharing debounced state across instances.
vuejs-ai/skills2.9k