Astro Syntax
If you know HTML, you already know enough to write your first Astro component.
Astro component syntax is a superset of HTML. The syntax was designed to feel familiar to anyone with experience writing HTML or JSX, and adds support for including components and JavaScript expressions.
JSX-like Expressions
Section titled JSX-like ExpressionsYou can define local JavaScript variables inside of the frontmatter component script between the two code fences (---
) of an Astro component. You can then inject these variables into the component’s HTML template using JSX-like expressions!
Variables
Section titled VariablesLocal variables can be added into the HTML using the curly braces syntax:
---const name = "Astro";---<div> <h1>Hello {name}!</h1> <!-- Outputs <h1>Hello Astro!</h1> --></div>
Dynamic Attributes
Section titled Dynamic AttributesLocal variables can be used in curly braces to pass attribute values to both HTML elements and components:
---const name = "Astro";---<h1 class={name}>Attribute expressions are supported</h1>
<MyComponent templateLiteralNameAttribute={`MyNameIs${name}`} />
Dynamic HTML
Section titled Dynamic HTMLLocal variables can be used in JSX-like functions to produce dynamically-generated HTML elements:
---const items = ["Dog", "Cat", "Platypus"];---<ul> {items.map((item) => ( <li>{item}</li> ))}</ul>
Astro can conditionally display HTML using JSX logical operators and ternary expressions.
---const visible = true;---{visible && <p>Show me!</p>}
{visible ? <p>Show me!</p> : <p>Else show me!</p>}
Dynamic Tags
Section titled Dynamic TagsYou can also use dynamic tags by setting a variable to an HTML tag name or a component import:
---import MyComponent from "./MyComponent.astro";const Element = 'div'const Component = MyComponent;---<Element>Hello!</Element> <!-- renders as <div>Hello!</div> --><Component /> <!-- renders as <MyComponent /> -->
When using dynamic tags:
-
Variable names must be capitalized. For example, use
Element
, notelement
. Otherwise, Astro will try to render your variable name as a literal HTML tag. -
Hydration directives are not supported. When using
client:*
hydration directives, Astro needs to know which components to bundle for production, and the dynamic tag pattern prevents this from working.
Fragments
Section titled FragmentsAstro supports using either <Fragment> </Fragment>
or the shorthand <> </>
.
Fragments can be useful to avoid wrapper elements when adding set:*
directives, as in the following example:
---const htmlString = '<p>Raw HTML content</p>';---<Fragment set:html={htmlString} />
Differences between Astro and JSX
Section titled Differences between Astro and JSXAstro component syntax is a superset of HTML. It was designed to feel familiar to anyone with HTML or JSX experience, but there are a couple of key differences between .astro
files and JSX.
Attributes
Section titled AttributesIn Astro, you use the standard kebab-case
format for all HTML attributes instead of the camelCase
used in JSX. This even works for class
, which is not supported by React.
<div className="box" dataValue="3" /><div class="box" data-value="3" />
Multiple Elements
Section titled Multiple ElementsAn Astro component template can render multiple elements with no need to wrap everything in a single <div>
or <>
, unlike JavaScript or JSX.
---// Template with multiple elements---<p>No need to wrap elements in a single containing element.</p><p>Astro supports multiple root elements in a template.</p>
Comments
Section titled CommentsIn Astro, you can use standard HTML comments or JavaScript-style comments.
------<!-- HTML comment syntax is valid in .astro files -->{/* JS comment syntax is also valid */}