Description: The x-bind directive allows you to dynamically set HTML element attributes such as class, style, disabled, src, or value based on the reactive data in your Alpine component. This enables you to create responsive and interactive user interfaces by changing element properties in real-time.
The fundamental way to use `x-bind` is by prefixing the HTML attribute you want to bind with x-bind:. The value of this directive is a JavaScript expression or a property name from your Alpine component's data.
<img x-bind:src="imageUrl" x-bind:alt="imageAltText">
<div x-bind:id="dynamicId">Content</div>
In this example, the src and alt attributes of the image, and the id of the div, will be dynamically set based on the values of imageUrl, imageAltText, and dynamicId properties in your Alpine component's data.
AlpineJS offers a convenient shorthand for `x-bind` by simply using a colon (:) before the attribute name. This is the most common way you'll see `x-bind` used.
<img :src="imageUrl" :alt="imageAltText">
<button :disabled="isSubmitting">Submit</button>
This is functionally identical to the x-bind: syntax but is more concise.
Binding classes conditionally is a very common task. AlpineJS provides a powerful object syntax for the :class directive. You provide an object where keys are class names and values are boolean expressions. If an expression evaluates to true, the corresponding class is applied; otherwise, it's not.
<div :class="{ 'text-red-500': hasError, 'bg-blue-200': isActive, 'font-bold': isImportant }">
This text might be red, have a blue background, or be bold.
</div>
You can also mix this with static classes:
<div class="base-styles" :class="{ 'active': isActive }">...</div>
AlpineJS is smart enough to merge static classes with dynamically bound ones. You can also bind an array of classes or a string directly.
Similar to classes, you can dynamically bind inline styles using the :style directive. It accepts a JavaScript object where keys are CSS property names (either camelCase like backgroundColor or kebab-case in quotes like 'background-color') and values are their corresponding CSS values.
<div :style="{ color: userColor, fontSize: userFontSize + 'px', 'padding-top': '10px' }">
My style is dynamic!
</div>
In this example, userColor and userFontSize would be properties in your Alpine component's data.
x-bind:value (or :value) is for one-way binding. It sets an input element's value attribute from your Alpine data. If the user types into the input, the Alpine data property is not automatically updated.
<!-- Data flows from 'message' to input's value -->
<input type="text" :value="message">
If you need two-way binding for form inputs (where user input also updates the Alpine data property, and changes to the property update the input), you should use x-model instead.
<!-- Data flows both ways between 'message' and input's value -->
<input type="text" x-model="message">
Choose :value when you only need to display data and don't need to capture user changes back into the same data property directly through that input. For most interactive forms, x-model is what you'll want for inputs.
The object syntax for conditional classes (:class="{ 'my-class': condition }") is powerful but requires correct syntax. A common mistake is trying to use a colon inside the class string or not using the object format for conditions:
<!-- INCORRECT -->
<div class="my-class: condition">...</div>
<div :class="'my-class' if condition else ''">...</div> <!-- This works but object syntax is cleaner for multiple classes -->
<!-- CORRECT & PREFERRED for multiple conditional classes -->
<div :class="{ 'my-class': condition, 'another-class': otherCondition }">...</div>
Ensure the condition (the value in the key-value pair) evaluates to a boolean (true or false). The key is the class name string.
For HTML boolean attributes (like disabled, required, checked, readonly, open), Alpine handles them in a specific way:
true (or any "truthy" value like a non-empty string or a number other than 0), Alpine will add the attribute to the element (e.g., <button disabled>).false, null, or undefined, Alpine will remove the attribute entirely from the element (e.g., <button>).disabled="false" literally rendered in the HTML.
<!-- If 'isSubmitting' is true: -->
<button :disabled="isSubmitting">Becomes <button disabled></button>
<!-- If 'isSubmitting' is false: -->
<button :disabled="isSubmitting">Becomes <button></button>
Edit this to see `message` property change.
x-bind:disabled or :disabledButton is now disabled.
Button is enabled.
:class (Object Syntax)Current classes:
:styleStyle:
:src and :altAlt:
:value (One-Way Binding)This input's value is bound from the 'message' property using :value. It's set to readonly here for clarity, but if it were editable, user changes wouldn't update 'message' without x-model or explicit event handling.
Current 'message' property: ""