Skip to main content
Vuetify0 is now in alpha!
Vuetify0 Logo
Theme
Mode
Palettes
Accessibility
Vuetify One
Sign in to Vuetify One

Access premium tools across the Vuetify ecosystem — Bin, Play, Studio, and more.

Not a subscriber? See what's included

useMutationObserver

A composable for detecting DOM changes using the Mutation Observer API with automatic cleanup.

Usage

The useMutationObserver composable wraps the Mutation Observer API to detect changes to the DOM tree. It’s useful for monitoring attribute changes, child element modifications, and character data updates.

Tip

Why wrap MutationObserver? The native MutationObserver has no awareness of Vue’s effectScope lifecycle. If you create one inside a composable, it won’t automatically disconnect when the scope is disposed. useMutationObserver integrates onScopeDispose for automatic cleanup, defers creation until after hydration for SSR safety, and adds reactive target tracking — things the native API can’t do on its own.

vue
<script setup lang="ts">
  import { useMutationObserver } from '@vuetify/v0'
  import { ref, useTemplateRef } from 'vue'

  const target = useTemplateRef('target')
  const mutationCount = ref(0)

  useMutationObserver(target, (mutations) => {
    mutationCount.value += mutations.length
    mutations.forEach(mutation => {
      console.log('Type:', mutation.type)
      console.log('Added nodes:', mutation.addedNodes)
      console.log('Removed nodes:', mutation.removedNodes)
    })
  }, {
    childList: true,
    attributes: true,
    attributeOldValue: true
  })
</script>

<template>
  <div>
    <div ref="target">
      <p>Mutations detected: {{ mutationCount }}</p>
    </div>
  </div>
</template>

Architecture

useMutationObserver wraps the native MutationObserver API with Vue reactivity:

Mutation Observer Hierarchy

Use controls to zoom and pan. Click outside or press Escape to close.

Mutation Observer Hierarchy

Options

OptionTypeDefaultNotes
immediatebooleanfalseFire the callback immediately on mount before any mutation
oncebooleanfalseStop observing after the first callback fires
childListbooleantrueObserve child node additions and removals
attributesbooleanfalseObserve attribute changes
characterDatabooleanfalseObserve text content changes
subtreebooleanfalseExtend observation to all descendant nodes
attributeFilterstring[]Limit attribute observation to specific attribute names
characterDataOldValuebooleanfalseRecord previous text value in mutation records

Reactivity

Property/MethodReactiveNotes
isActiveComputed from observer ref
isPausedShallowRef, readonly
targetAccepts MaybeRef, watched for changes
pause()Temporarily stop observing without disconnecting
resume()Resume after pause()
stop()Disconnect the observer permanently

Examples

DOM Mutation Logger

Add and remove child elements, toggle attributes, and observe the mutation log in real time, with pause/resume and clear controls.

Add children to observe mutations
Mutation Log (0)
No mutations recorded yet

API Reference

The following API details are for the useMutationObserver composable.

Functions

useMutationObserver

(target: MaybeElementRef, callback: (entries: MutationObserverRecord[]) => void, options?: UseMutationObserverOptions) => UseMutationObserverReturn

A composable that uses the Mutation Observer API to detect changes in the DOM.

Options

immediate

boolean | undefined

once

boolean | undefined

childList

boolean | undefined

attributes

boolean | undefined

characterData

boolean | undefined

subtree

boolean | undefined

attributeOldValue

boolean | undefined

characterDataOldValue

boolean | undefined

attributeFilter

string[] | undefined

Properties

isActive

Readonly<Ref<boolean, boolean>>

Whether the observer is currently active (created and observing)

isPaused

Readonly<Ref<boolean, boolean>>

Whether the observer is currently paused

Methods

pause

() => void

Pause observation (disconnects observer but keeps it alive)

resume

() => void

Resume observation

stop

() => void

Stop observation and clean up (destroys observer)

Was this page helpful?

© 2016-1970 Vuetify, LLC
Ctrl+/