Files
email-organizer/offline-docs/alpinejs/directives/bind.md
2025-08-13 09:33:19 -07:00

5.7 KiB

Alpine.js Documentation - Directives

Alpine directives are attributes that you can add to HTML elements to give them special behavior.

x-bind

x-bind allows you to set HTML attributes on elements based on the result of JavaScript expressions.

For example, here's a component where we will use x-bind to set the placeholder value of an input.

<div x-data="{ placeholder: 'Type here...' }">


n<input type="text" x-bind:placeholder="placeholder">


n</div>

Shorthand syntax

If x-bind: is too verbose for your liking, you can use the shorthand: :. For example, here is the same input element as above, but refactored to use the shorthand syntax.

<input type="text" :placeholder="placeholder">

Despite not being included in the above snippet, x-bind cannot be used if no parent element has x-data defined. → Read more about x-data

Binding classes

x-bind is most often useful for setting specific classes on an element based on your Alpine state.

Here's a simple example of a simple dropdown toggle, but instead of using x-show, we'll use a "hidden" class to toggle an element.

<div x-data="{ open: false }">


n<button x-on:click="open = ! open">Toggle Dropdown</button>


n<div :class="open ? '' : 'hidden'">


nDropdown Contents...


n</div>


n</div>

Now, when open is false, the "hidden" class will be added to the dropdown.

Shorthand conditionals

In cases like these, if you prefer a less verbose syntax you can use JavaScript's short-circuit evaluation instead of standard conditionals:

<div :class="show ? '' : 'hidden'">


n<!-- Is equivalent to: -->


n<div :class="show || 'hidden'">

The inverse is also available to you. Suppose instead of open, we use a variable with the opposite value: closed.

<div :class="closed ? 'hidden' : ''">


n<!-- Is equivalent to: -->


n<div :class="closed && 'hidden'">

Class object syntax

Alpine offers an additional syntax for toggling classes if you prefer. By passing a JavaScript object where the classes are the keys and booleans are the values, Alpine will know which classes to apply and which to remove. For example:

<div :class="{ 'hidden': ! show }">

This technique offers a unique advantage to other methods. When using object-syntax, Alpine will NOT preserve original classes applied to an element's class attribute.

For example, if you wanted to apply the "hidden" class to an element before Alpine loads, AND use Alpine to toggle its existence you can only achieve that behavior using object-syntax:

<div class="hidden" :class="{ 'hidden': ! show }">

In case that confused you, let's dig deeper into how Alpine handles x-bind:class differently than other attributes.

Special behavior

x-bind:class behaves differently than other attributes under the hood.

Consider the following case.

<div class="opacity-50" :class="hide && 'hidden'">

If "class" were any other attribute, the :class binding would overwrite any existing class attribute, causing opacity-50 to be overwritten by either hidden or ''.

However, Alpine treats class bindings differently. It's smart enough to preserve existing classes on an element.

For example, if hide is true, the above example will result in the following DOM element:

<div class="opacity-50 hidden">

If hide is false, the DOM element will look like:

<div class="opacity-50">

This behavior should be invisible and intuitive to most users, but it is worth mentioning explicitly for the inquiring developer or any special cases that might crop up.

Binding styles

Similar to the special syntax for binding classes with JavaScript objects, Alpine also offers an object-based syntax for binding style attributes.

Just like the class objects, this syntax is entirely optional. Only use it if it affords you some advantage.

<div :style="{ color: 'red', display: 'flex' }">


n<!-- Will render: -->


n<div style="color: red; display: flex;" ...>

Conditional inline styling is possible using expressions just like with x-bind:class. Short circuit operators can be used here as well by using a styles object as the second operand.

<div x-bind:style="true && { color: 'red' }">


n<!-- Will render: -->


n<div style="color: red;">

One advantage of this approach is being able to mix it in with existing styles on an element:

<div style="padding: 1rem;" :style="{ color: 'red', display: 'flex' }">


n<!-- Will render: -->


n<div style="padding: 1rem; color: red; display: flex;" ...>

And like most expressions in Alpine, you can always use the result of a JavaScript expression as the reference:

<div x-data="{ styles: { color: 'red', display: 'flex' }}">


n<div :style="styles">


n</div>


n<!-- Will render: -->


n<div ...>


n<div style="color: red; display: flex;" ...>


n</div>

Binding Alpine Directives Directly

x-bind allows you to bind an object of directives to an element.

For example, you can use it to dynamically bind a directive like @click:

<div x-data="{ open: false }">


n<button :@click="open = ! open">Toggle Dropdown</button>


n<div x-show="open">


nDropdown Contents...


n</div>


n</div>

In this example, :click is bound to the open variable. When you click the button, it will toggle the value of open.

This feature can also be used with the shorthand syntax:

<button :@click="open = ! open">Toggle Dropdown</button>

→ Read more about x-on

Code highlighting provided by Torchlight