1. $el: The Current Book
$el refers to the root element of the current component. In our library, it's like picking up a single book. Any action you take with $el affects only that specific book you're holding.
Ready to be read
The Art of Alpine.js
(Click me)
<div x-data="elDemo" @click="toggleReadState()">
...
</div>
Alpine.data('elDemo', () => ({
beingRead: false,
status: 'Ready to be read',
toggleReadState() {
this.beingRead = !this.beingRead;
// this.$el is the component's root div
this.$el.style.borderColor = this.beingRead ? '#3B82F6' : '';
this.status = this.beingRead ? 'You are reading this book.' : 'Ready to be read';
}
}))
2. $refs: Named Library Sections
$refs lets you access any element within your component that you've given a name to via x-ref. This is like having a map of the library that points directly to named sections like "Fiction" or "History".
<div x-ref="fiction">...</div>
<button @click="goToSection('fiction')">...</button>
Alpine.data('refsDemo', () => ({
activeSection: null,
goToSection(name) {
// Reset all sections first
Object.values(this.$refs).forEach(el => {
el.classList.remove('ring-2', 'ring-green-500');
});
// Highlight the chosen one
this.$refs[name].classList.add('ring-2', 'ring-green-500');
this.activeSection = name;
}
}))
3. $root: The Entire Library
$root refers to the root element of the *nearest parent* component. This is useful in nested components. Think of it as a librarian at a desk (child component) making an announcement that affects the entire library building (parent component).
Welcome to the Grand Library!
Info Desk (Nested Component)
My $el is this box. My $root is the entire library card.
<div x-data="libraryDemo">
<!-- Nested Component -->
<div x-data="deskDemo">
<button @click="announceClosing()">...</button>
</div>
</div>
Alpine.data('deskDemo', () => ({
announceClosing() {
// this.$root is the libraryDemo div
// We access its Alpine instance to change state
this.$root.__x.$data.isClosing = true;
}
}))