Alpine.js In-Depth: x-data "state" & x-text "echo"
The simplest Alpine.js application is the following HTML file. It loads Alpine.js version 2+ from the JSDelivr CDN using a script tag and has an Alpine.js component with x-data="{ msg: 'Hello Alpine.js' }" and a p element with x-text="msg".
<script
src="https://cdn.jsdelivr.net/gh/alpinejs/[email protected]/dist/alpine.min.js"
defer
></script>
<div x-data="{ msg: 'Hello Alpine.js' }">
<p x-text="msg"></p>
</div>
Which displays the following in your browser:

We can further break down the Alpine.js application/component/widget (I’ll use the words interchangeably).
The x-data directive “Declares a new component scope” (per the Alpine.js README). Any HTML element with an x-data attribute will be initialised by Alpine.js as a component. The attribute’s value, in this case "{ msg: 'Hello Alpine.js' }" is evaluated as JavaScript, in this case that string will yield the following an object with a single key, msg whose value is 'Hello Alpine.js'.
That means <div x-data="{ msg: 'Hello Alpine.js' }"> will create an Alpine.js component with div as the root element with the object { msg: 'Hello Alpine.js' } as the Alpine.js state.
Alpine.js directives will only work:
- on an element with
x-datasince it’s the component root element - on an element which is a child of an element that has
x-data
For example: <p x-data="{ msg: 'Hello Alpine.js' }" x-text="msg"></p> will display the same as the example where x-text is on a p element inside of the div which has the x-data.
The other Alpine.js directive which is crucial to getting a quickstart is x-text. x-text is reminiscent of echo in PHP, it’s a way to interpolate JavaScript variables and expressions to the HTML document. For JavaScript developers, x-text="value" is very similar to using el.textContent = value where value is a variable.
In the case of our example, we’ve got a msg property on the Alpine.js state, which we want to show, hence we use x-text="msg".
We’ve now seen how to create a very basic read-only Alpine.js component using x-data and x-text.
You can find the examples for this post at Alpine.js Handbook Examples - 1.1 x-data & x-text
That’s it for this post, you can check out the Alpine.js tag on Code with Hugo for more in-depth Alpine.js guides.
If you’re interested in Alpine.js, Subscribe to Alpine.js Weekly. A free, once–weekly email roundup of Alpine.js news and articles.
Photo by Vidar Nordli-Mathisen on Unsplash
Interested in Alpine.js?
Power up your debugging with the Alpine.js Devtools Extension for Chrome and Firefox. Trusted by over 15,000 developers (rated 4.5 ⭐️).