Skip to content

Composables Best Practices

Composables are the recommended way to share stateful logic between Vue components. They leverage the Composition API to encapsulate reactive state, computed properties, watchers, and lifecycle hooks into reusable functions.

Individual Rules

Patterns & Techniques

These are useful patterns that are not formal rules but worth knowing:

Options object pattern

When a composable accepts multiple optional parameters, use a single options object instead of positional arguments. This is a generic JavaScript pattern that applies especially well to composables.

typescript
interface UseIntervalOptions {
  immediate?: boolean
  interval?: number
}

export function useInterval(
  callback: () => void,
  options: UseIntervalOptions = {},
) {
  const { immediate = false, interval = 1000 } = options
  // ...
}

Async + sync dual support

Some composables can support both synchronous initial data and asynchronous fetching, making them flexible for SSR or cached scenarios.

typescript
export function useUser(initialData?: User) {
  const user = ref<User | null>(initialData ?? null)
  const isLoading = ref(!initialData)

  if (!initialData) {
    fetchUser().then((data) => {
      user.value = data
      isLoading.value = false
    })
  }

  return { user, isLoading }
}

Source