Astroの構文
HTMLを知っていれば、最初のAstroコンポーネントを書くには十分です。
Astroコンポーネントの構文はHTMLのスーパーセットです。この構文はHTMLやJSXを書いたことのある人にとって親しみやすいように設計され、コンポーネントやJavaScriptの式がサポートされています。
JSXライクな式
セクションタイトル: JSXライクな式Astroコンポーネントのフロントマターのコードフェンス(---
)の間に、JavaScriptのローカル変数を定義できます。そして、JSXライクな式を使って、変数をコンポーネントのHTMLテンプレートに注入できます。
この方法により、フロントマターで計算された動的な値をテンプレートに含めることができます。しかし、一度含められたこれらの値はリアクティブではなく、変化することはありません。Astroコンポーネントは、レンダリングの際に一度だけ実行されるテンプレートです。
以下でAstroとJSXの違いに関する例をいくつか紹介します。
ローカル変数は、波括弧の構文を使ってHTMLに追加できます。
動的属性
セクションタイトル: 動的属性ローカル変数を波括弧で囲むことで、HTML要素とコンポーネントの両方に属性値を渡せます。
HTML属性は文字列に変換されるため、関数やオブジェクトをHTML要素に渡すことはできません。たとえば、Astroコンポーネント内のHTML要素にイベントハンドラを割り当てることはできません。
代わりに、通常のJavaScriptと同じように、クライアントサイドスクリプトを使用してイベントハンドラを追加します。
動的HTML
セクションタイトル: 動的HTMLローカル変数をJSXのような関数で使用して、動的に生成されるHTML要素を作成できます。
Astroは、JSXと同様に論理演算子と三項演算子を使用して、HTMLを条件に応じて表示できます。
動的タグ
セクションタイトル: 動的タグHTMLタグ名またはインポートされたコンポーネントを変数に設定することで、動的タグも使用できます。
動的タグを使用する場合は、以下の点に注意してください。
-
変数名は大文字で始める必要があります。 たとえば、
element
ではなくElement
を使用します。そうしないと、Astroは変数名をそのままHTMLタグとしてレンダリングしようとします。 -
ハイドレーションディレクティブは使えません。
client:*
ハイドレーションディレクティブを使用する場合、Astroはバンドルする対象のコンポーネントを知る必要がありますが、動的タグパターンではこれが機能しなくなるためです。 -
define:vars ディレクティブ はサポートされていません。 もし、子要素を追加の要素(例えば
<div>
)でラップすることができない場合は、style={``--myVar:${value}``}
を手動で要素に追加することができます。
フラグメント
セクションタイトル: フラグメントAstroでは、<Fragment> </Fragment>
または短縮形の<> </>
を使用できます。
フラグメントは、次の例のように、set:*
ディレクティブを使用する際にラッパー要素を避けるために役立ちます。
AstroとJSXの違い
セクションタイトル: AstroとJSXの違いAstroコンポーネントの構文はHTMLのスーパーセットです。HTMLやJSXを書いたことのある人にとって親しみやすいように設計されてはいますが、.astro
ファイルとJSXの間にはいくつかの重要な違いがあります。
Astroでは、JSXで使用されているcamelCase
ではなく、すべてのHTML属性に標準のkebab-case
形式を使用します。これは、Reactではサポートされていないclass
でも同様です。
複数の要素
セクションタイトル: 複数の要素Astroコンポーネントテンプレートは複数の要素をレンダリングできます。その際、JavaScriptやJSXとは異なり、全体を単一の<div>
や<>
で囲む必要はありません。
コメント
セクションタイトル: コメントAstroでは、標準のHTMLコメントまたはJavaScriptスタイルのコメントを使用できます。
HTMLスタイルのコメントはブラウザのDOMに含まれますが、JSのコメントはスキップされます。TODOメッセージやその他の開発専用の説明を残したい場合は、JavaScriptスタイルのコメントを使用することをお勧めします。