Mutation Observer
<sl-mutation-observer> | SlMutationObserver
The Mutation Observer component offers a thin, declarative interface to the
MutationObserver API
.
The mutation observer will report changes to the content it wraps through the
sl-mutation
event. When emitted, a collection of
MutationRecord
objects will be attached to event.detail
that contains information about how it changed.
👆 Click the button and watch the console
<div class="mutation-overview"> <sl-mutation-observer attr="variant"> <sl-button variant="primary">Click to mutate</sl-button> </sl-mutation-observer> <br /> 👆 Click the button and watch the console <script> const container = document.querySelector('.mutation-overview'); const mutationObserver = container.querySelector('sl-mutation-observer'); const button = container.querySelector('sl-button'); const variants = ['primary', 'success', 'neutral', 'warning', 'danger']; let clicks = 0; // Change the button's variant attribute button.addEventListener('click', () => { clicks++; button.setAttribute('variant', variants[clicks % variants.length]); }); // Log mutations mutationObserver.addEventListener('sl-mutation', event => { console.log(event.detail); }); </script> <style> .mutation-overview sl-button { margin-bottom: 1rem; } </style> </div>
When you create a mutation observer, you must indicate what changes it should respond to by including at
least one of attr
, child-list
, or char-data
. If you don’t specify
at least one of these attributes, no mutation events will be emitted.
Examples
Child List
Use the child-list
attribute to watch for new child elements that are added or removed.
<div class="mutation-child-list"> <sl-mutation-observer child-list> <div class="buttons"> <sl-button variant="primary">Add button</sl-button> </div> </sl-mutation-observer> 👆 Add and remove buttons and watch the console <script> const container = document.querySelector('.mutation-child-list'); const mutationObserver = container.querySelector('sl-mutation-observer'); const buttons = container.querySelector('.buttons'); const button = container.querySelector('sl-button[variant="primary"]'); let i = 0; // Add a button button.addEventListener('click', () => { const button = document.createElement('sl-button'); button.textContent = ++i; buttons.append(button); }); // Remove a button buttons.addEventListener('click', event => { const target = event.target.closest('sl-button:not([variant="primary"])'); event.stopPropagation(); if (target) { target.remove(); } }); // Log mutations mutationObserver.addEventListener('sl-mutation', event => { console.log(event.detail); }); </script> <style> .mutation-child-list .buttons { display: flex; gap: 0.25rem; flex-wrap: wrap; margin-bottom: 1rem; } </style> </div>
Slots
Name | Description |
---|---|
(default) | The content to watch for mutations. |
Learn more about using slots.
Properties
Name | Description | Reflects | Type | Default |
---|---|---|---|---|
attr
|
Watches for changes to attributes. To watch only specific attributes, separate them by a space, e.g.
attr="class id title" . To watch all attributes, use * .
|
|
string
|
- |
attrOldValue
attr-old-value
|
Indicates whether or not the attribute’s previous value should be recorded when monitoring changes. |
|
boolean
|
false
|
charData
char-data
|
Watches for changes to the character data contained within the node. |
|
boolean
|
false
|
charDataOldValue
char-data-old-value
|
Indicates whether or not the previous value of the node’s text should be recorded. |
|
boolean
|
false
|
childList
child-list
|
Watches for the addition or removal of new child nodes. |
|
boolean
|
false
|
disabled
|
Disables the observer. |
|
boolean
|
false
|
updateComplete |
A read-only promise that resolves when the component has finished updating. |
Learn more about attributes and properties.
Events
Name | React Event | Description | Event Detail |
---|---|---|---|
sl-mutation |
|
Emitted when a mutation occurs. |
{ mutationList: MutationRecord[] }
|
Learn more about events.