Components
Astro components are the basic building blocks of any Astro project. They are HTML-only templating components with no client-side runtime.
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. You can spot an Astro component by its file extension: .astro
.
Astro components are extremely flexible. Often, an Astro component will contain some reusable UI on the page, like a header or a profile card. At other times, an Astro component may contain a smaller snippet of HTML, like a collection of common <meta>
tags that make SEO easy to work with. Astro components can even contain an entire page layout.
The most important thing to know about Astro components is that they render to HTML during your build. Even if you run JavaScript code inside of your components, it will all run ahead of time, stripped from the final page that you send to your users. The result is a faster site, with zero JavaScript footprint added by default.
Component Structure
Section titled Component StructureAn Astro component is made up of two main parts: the Component Script and the Component Template. Each part performs a different job, but together they aim to provide a framework that is both easy to use and expressive enough to handle whatever you might want to build.
You can use components inside of other components, to build more and more advanced UI. For example, a Button
component could be used to create a ButtonGroup
component like so:
The Component Script
Section titled The Component ScriptAstro uses a code fence (---
) to identify the component script in your Astro component. If you’ve ever written Markdown before, you may already be familiar with a similar concept called frontmatter. Astro’s idea of a component script was directly inspired by this concept.
You can use the component script to write any JavaScript code that you need to render your template. This can include:
- importing other Astro components
- importing other framework components, like React
- importing data, like a JSON file
- fetching content from an API or database
- creating variables that you will reference in your template
The code fence is designed to guarantee that the JavaScript that you write in it is “fenced in.” It won’t escape into your frontend application, or fall into your users hands. You can safely write code here that is expensive or sensitive (like a call to your private database) without worrying about it ever ending up in your user’s browser.
The Component Template
Section titled The Component TemplateBelow the component script, sits the component template. The component template decides the HTML output of your component.
If you write plain HTML here, your component will render that HTML in any Astro page it is imported and used.
However, Astro’s component template syntax also supports JavaScript expressions, imported components and special Astro directives. Data and values defined (at page build time) in the component script can be used in the component template to produce dynamically-created HTML.
JSX-like Expressions
Section titled JSX-like ExpressionsYou can define local JavaScript variables inside of the frontmatter component script within 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:
Dynamic Attributes
Section titled Dynamic AttributesLocal variables can be used in curly braces to pass attribute values to both HTML elements and components:
Dynamic HTML
Section titled Dynamic HTMLLocal variables can be used in JSX-like functions to produce dynamically-generated HTML elements:
Astro can conditionally display HTML using JSX logical operators and ternary expressions.
Dynamic Tags
Section titled Dynamic TagsYou can also use dynamic tags by setting a variable to an HTML tag name or a component import:
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 & Multiple Elements
Section titled Fragments & Multiple ElementsAn Astro component template can render multiple elements with no need to wrap everything in a single <div>
or <>
, unlike JavaScript or JSX.
However, when using an expression to dynamically create multiple elements, you should wrap these elements inside a fragment as you would in JavaScript or JSX. Astro supports using either <Fragment> </Fragment>
or the shorthand <> </>
.
Fragments can also be useful to avoid wrapper elements when adding set:*
directives, as in the following example:
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.
Comments
Section titled CommentsIn Astro, you can use standard HTML comments where JSX would use JavaScript style comments.
Component Props
Section titled Component PropsAn Astro component can define and accept props. These props then become available to the component template for rendering HTML. Props are available on the Astro.props
global in your frontmatter script.
Here is an example of a component that receives a greeting
prop and a name
prop. Notice that the props to be received are destructured from the global Astro.props
object.
This component, when imported and rendered in other Astro components, layouts or pages, can be passed these props as attributes:
You can also define your props with TypeScript with a Props
type interface. Astro will automatically pick up the Props
interface in your frontmatter and give type warnings/errors. These props can also be given default values when destructured from Astro.props
.
Component props can be given default values to use when none are provided.
Slots
Section titled SlotsThe <slot />
element is a placeholder for external HTML content, allowing you to inject (or “slot”) child elements from other files into your component template.
By default, all child elements passed to a component will be rendered in its <slot />
This pattern is the basis of an Astro layout component: an entire page of HTML content can be “wrapped” with <Layout></Layout>
tags and sent to the Layout component to render inside of common page elements.
Named Slots
Section titled Named SlotsAn Astro component can also have named slots. This allows you to pass only HTML elements with the corresponding slot name into a slot’s location.
Use a slot="my-slot"
attribute on the child element that you want to pass through to a matching <slot name="my-slot" />
placeholder in your component.
Fallback Content for Slots
Section titled Fallback Content for SlotsSlots can also render fallback content. When there are no matching children passed to a slot, a <slot />
element will render its own placeholder children.
CSS Styles
Section titled CSS StylesCSS <style>
tags are also supported inside of the component template.
They can be used to style your components, and all style rules are automatically scoped to the component itself to prevent CSS conflicts in large apps.
📚 See our Styling Guide for more information on applying styles.
Client-Side Scripts
Section titled Client-Side ScriptsAstro components support adding client-side interactivity using standard HTML <script>
tags.
Scripts can be used to add event listeners, send analytics data, play animations, and everything else JavaScript can do on the web.
By default, Astro processes and bundles <script>
tags, adding support for importing npm modules, writing TypeScript, and more.
📚 See our Scripting Guide for more details.
HTML Components
Section titled HTML ComponentsAstro supports importing and using .html
files as components or placing these files within the src/pages
subdirectory as pages. You may want to use HTML components if you’re reusing code from an existing site built without a framework, or if you want to ensure that your component has no dynamic features.
HTML components must contain only valid HTML, and therefore lack key Astro component features:
- They don’t support frontmatter, server-side imports, or dynamic expressions.
- Any
<script>
tags are left unbundled, treated as if they hadis:inline
. - They can only reference assets that are in the
public/
folder.
Next Steps
Section titled Next Steps📚 Read about Astro’s built-in components.
📚 Learn about using JavaScript framework components in your Astro project.