📱 $el - The Active App
An app can change its own properties. The button below is inside the "App" component and uses $el to modify its own container.
This is the main content area of the app.
Status:
Code Example:
<div x-data="activeAppDemo">
<!-- ... -->
<button @click="toggleTheme()">Toggle My Theme</button>
</div>
<script>
Alpine.data('activeAppDemo', () => ({
toggleTheme() {
// this.$el refers to the div[x-data="activeAppDemo"]
this.$el.classList.toggle('bg-gray-800');
this.$el.querySelector('.app-content').classList.toggle('border-gray-600');
}
}))
</script>
🧩 $refs - Named Widgets
The "Home Screen" component can interact with specific "Widgets" (elements) by name. The control panel below uses $refs to target and modify individual widgets.
🎵 Music: Playing
☀️ Weather: Sunny
🗓️ Calendar: OK
Home Screen Controls
Status:
Code Example:
<div x-data="homeScreenDemo">
<div x-ref="musicWidget">...</div>
<button @click="toggleMusic()">Toggle Music</button>
</div>
<script>
Alpine.data('homeScreenDemo', () => ({
toggleMusic() {
// this.$refs.musicWidget refers to the div[x-ref="musicWidget"]
this.$refs.musicWidget.textContent = '🎵 Music: Muted';
this.$refs.musicWidget.classList.add('opacity-50');
}
}))
</script>
📱 $root - The Entire Phone
A deeply nested control can affect the entire component. The button below is inside a nested <div> but uses $root to modify the main phone frame (the component's top-level element).
Deeply Nested Controls
Status:
Code Example:
<div x-data="phoneInterface" id="phone-frame">
<div> <!-- Deeply nested -->
<button @click="toggleDnd()">Toggle DND</button>
</div>
</div>
<script>
Alpine.data('phoneInterface', () => ({
toggleDnd() {
// this.$root refers to the div#phone-frame
this.$root.classList.toggle('ring-4');
this.$root.classList.toggle('ring-red-500');
}
}))
</script>