Description: The x-text directive allows you to display reactive data from your x-data scope as the text content of an HTML element. This text content updates automatically whenever the underlying data changes. For Python developers, this is conceptually similar to using template variables like {{ my_variable }} in Django or Flask, but x-text operates entirely on the client-side, providing instant updates without page reloads.
x-text="propertyName"This is the most direct way to use x-text. It instructs AlpineJS to take the value of propertyName from your component's data (defined in x-data) and set it as the textContent of the HTML element. If propertyName's value changes, the displayed text updates automatically.
<div x-data="{ message: 'Hello from Alpine!' }">
<p x-text="message"></p> <!-- Displays: Hello from Alpine! -->
</div>
When message is updated (e.g., this.message = 'New text!'), the content of the <p> tag will change instantly.
x-text="'Hello, ' + name"x-text can evaluate any valid JavaScript expression. The result of this expression becomes the element's textContent. This is powerful for concatenating strings, performing simple calculations, calling JavaScript methods, or accessing nested object properties directly within your HTML attribute.
Remember that string literals within the JavaScript expression must be enclosed in quotes (e.g., 'Hello, ' or "Hello, ").
<div x-data="{ user: { firstName: 'Jane', lastName: 'Doe' }, itemCount: 5 }">
<p x-text="'Welcome, ' + user.firstName + '!' "></p>
<!-- Displays: Welcome, Jane! -->
<p x-text="'You have ' + (itemCount * 2) + ' bonus points.'"></p>
<!-- Displays: You have 10 bonus points. -->
<p x-text="`User: ${user.firstName} ${user.lastName}`"></p>
<!-- Displays (using template literal): User: Jane Doe -->
</div>
x-text sets the textContent property of an element. This means any HTML tags within the data will be displayed as literal strings, not rendered as HTML. For example, if greeting = "<strong>Hi!</strong>", then <p x-text="greeting"></p> will literally show "<strong>Hi!</strong>" on the page.
This is a security measure to prevent accidental Cross-Site Scripting (XSS). If you explicitly need to render HTML from a trusted source, use the x-html directive instead, but be aware of the security implications.
<div x-data="{ myHtmlSnippet: '<em>This is italic.</em>' }">
<p>Using x-text:</p>
<div x-text="myHtmlSnippet" class="border p-1 my-1"></div>
<!-- Output: <em>This is italic.</em> (literal text) -->
<p class="mt-2">Using x-html (for trusted HTML):</p>
<div x-html="myHtmlSnippet" class="border p-1 my-1"></div>
<!-- Output: This is italic. (rendered HTML) -->
</div>
When combining reactive data with static text in an x-text expression, JavaScript string concatenation rules apply. Literal strings must be enclosed in single (') or double (") quotes. If you write x-text="User: + username", JavaScript will try to find a variable named User, which will likely lead to an error (e.g., "User is not defined") or unexpected output if User happens to be defined elsewhere with a numeric value (leading to NaNusername).
The correct way is: x-text="'User: ' + username" or using template literals: x-text="`User: ${username}`".
<div x-data="{ username: 'Alice' }">
<!-- Correct -->
<p x-text="'Username: ' + username"></p> <!-- Displays: Username: Alice -->
<!-- Incorrect (potential error) -->
<!-- <p x-text="Username: + username"></p> -->
<!-- This would try to interpret 'Username:' as a variable or label, not a string. -->
</div>
x-text displays data "as is". It doesn't automatically format dates, numbers, currencies, etc. If you need specific formatting, you must handle it explicitly:
x-data: Use JavaScript methods or getters within your component to prepare the formatted string..toFixed(2), .toLocaleDateString(), Intl.NumberFormat) directly in the x-text expression.<div x-data="{
rawDate: new Date('2023-07-15T14:30:00Z'),
price: 29.955,
get formattedPrice() {
return '$' + this.price.toFixed(2);
}
}">
<p x-text="rawDate.toString()"></p>
<!-- Displays: Sat Jul 15 2023 14:30:00 GMT... (default full string) -->
<p x-text="rawDate.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' })"></p>
<!-- Displays: July 15, 2023 -->
<p x-text="'Price: ' + price.toFixed(2)"></p>
<!-- Displays: Price: 29.96 -->
<p x-text="'Formatted Price: ' + formattedPrice"></p>
<!-- Displays: Formatted Price: $29.96 (using getter) -->
</div>
x-textCurrent count:
Your message:
Combined output:
Counter value doubled:
Message in uppercase:
x-text and HTML ContentThe data property htmlStringContent in our Alpine component holds the value: This is <strong>bold</strong> text.
When displayed with x-text="htmlStringContent":
Notice how the HTML tags (e.g., <strong>) are displayed as plain text, not rendered as HTML elements. This is because x-text sets the textContent. If you needed to render this string as HTML, you would use x-html="htmlStringContent" (and ensure the content is safe!).