Svelte コンポーネント内のマークアップは、HTML++ と考えることができます。 ## Tags 小文字のタグ (`
` のようなもの) は通常の HTML 要素を表します。一方、大文字で始まるタグやドット表記を使用したタグ (`` や `` など) は _コンポーネント_ を表します。 ```svelte
``` ## Element attributes デフォルトでは、属性は HTML のそれと同じように動作します。 ```svelte
``` HTML と同様に、値は引用符なしでも指定することができます。 ```svelte ``` 属性値には JavaScript の式を含めることができます。 ```svelte page {p} ``` または、それ自体を JavaScript の式にすることも可能です。 ```svelte ``` Boolean の属性は、その値が [truthy](https://developer.mozilla.org/ja/docs/Glossary/Truthy) であれば要素に含まれ、[falsy](https://developer.mozilla.org/ja/docs/Glossary/Falsy) であれば除外されます。 その他の属性は、値が [nullish](https://developer.mozilla.org/ja/docs/Glossary/Nullish) (`null` または `undefined`) でない限り含まれます。 ```svelte
This div has no title attribute
``` > [!NOTE] 単一の式を引用符で囲むことは値のパース方法に影響しませんが、Svelte 6 では値が文字列に変換されるようになります: > > > ```svelte > > ``` 属性名と値が一致する場合 (`name={name}`)、`{name}` という形で簡略化できます。 ```svelte ``` ## Component props 慣習として、コンポーネントに渡される値は、DOM の機能である _属性_ ではなく、_プロパティ_ または _props_ と呼ばれます。 要素の場合と同様に、`name={name}` は `{name}` の短縮形に置き換えることができます。 ```svelte ``` ## Spread attributes _スプレッド属性(Spread attributes)_ を使用すると、複数の属性やプロパティを一度に要素やコンポーネントに渡すことができます。 要素やコンポーネントは複数のスプレッド属性を置くことができますし、通常の属性と一緒に使用することもできます。順序が重要です。`things.a` が存在する場合、`a="b"` より優先されますが、`c="d"` は `things.c` より優先されます。 ```svelte ``` ## Events DOM イベントを監視するには、要素に `on` で始まる属性を追加します。例えば、`click` イベントを監視するには、ボタンに `onclick` 属性を追加します: ```svelte ``` イベント属性は大文字小文字を区別します。`onclick` は `click` イベントを監視し、`onClick` は異なる `Click` イベントを監視します。これにより、大文字を含むカスタムイベントを監視することが可能になります。 イベントは単なる属性であるため、属性と同じルールが適用されます: - 短縮形を使用できます: `` - スプレッドも使用できます: `` タイミング的に、イベント属性は常にバインディングのイベントの後に発火します (例えば、`oninput` は `bind:value` の更新後に発火します)。内部では、一部のイベントハンドラーは `addEventListener` を使用して直接アタッチされ、その他は _委任(delegate)_ されます。 `ontouchstart` や `ontouchmove` イベント属性を使用する場合、ハンドラーは [passive](https://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener#パッシブリスナーの使用) として動作し、パフォーマンスが向上します。これにより、イベントハンドラーが `event.preventDefault()` を呼び出すかどうかを待つのではなく、ブラウザが即座にドキュメントをスクロールできるようになり、レスポンシブ性が大幅に改善されます。 これらのイベントのデフォルト動作を防ぐ必要がある非常に稀な場合には、代わりに [`on`](svelte-events#on) を使用するべきです (例えば action 内で)。 ### Event delegation メモリ消費を減らし、パフォーマンスを向上させるため、Svelte はイベントデリゲーション (event delegation) というテクニックを使用しています。これは、以下のリストにある特定のイベントについては、アプリケーションルートの単一のイベントリスナーがイベントのパス上のハンドラーを実行する役割を担うことを意味します。 注意すべきポイントがいくつかあります: - 委任されたリスナー(delegated listener)でイベントを手動でディスパッチする場合、`{ bubbles: true }` オプションを設定してください。さもないとアプリケーションルートに到達しません。 - `addEventListener` を直接使用する場合、`stopPropagation` を呼び出さないようにしてください。そうしないと、イベントがアプリケーションルートに到達せず、ハンドラーが実行されなくなります。同様に、アプリケーションルート内に手動で追加されたハンドラーは、DOM の深い場所に宣言的に追加されたハンドラー (例えば `onclick={...}` など) よりも _前に_ 実行されます (キャプチャおよびバブリングフェーズの両方で)。これらの理由から、`addEventListener` よりも `svelte/events` からインポートされる `on` 関数を使用する方が、順序が保持され、`stopPropagation` が正しく処理されるため推奨されます。 以下のイベントハンドラーが委任(delegate)されます: - `beforeinput` - `click` - `change` - `dblclick` - `contextmenu` - `focusin` - `focusout` - `input` - `keydown` - `keyup` - `mousedown` - `mousemove` - `mouseout` - `mouseover` - `mouseup` - `pointerdown` - `pointermove` - `pointerout` - `pointerover` - `pointerup` - `touchend` - `touchmove` - `touchstart` ## Text expressions JavaScript 式は中括弧 `{}` で囲むことでテキストとして含めることができます。 ```svelte {expression} ``` `null` や `undefined` となる式は省略されます; それ以外はすべて [String](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String#string_coercion) に変換されます。 中括弧は、その [HTML エンティティ](https://developer.mozilla.org/ja/docs/Glossary/Entity) 文字列を使用することで Svelte テンプレート内に含めることができます。`{` の場合は `{`, `{`, または `{`、`}` の場合は `}`, `}`, または `}` を使用します。 正規表現 (`RegExp`) の [リテラル表記](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp#リテラル記法とコンストラクター) を使用する場合、それを括弧で囲む必要があります。 ```svelte

Hello {name}!

{a} + {b} = {a + b}.

{(/^[A-Za-z ]+$/).test(value) ? x : y}
``` 式は文字列化され、コードインジェクションを防ぐためにエスケープされます。HTML をレンダリングしたい場合は、代わりに `{@html}` タグを使用してください。 ```svelte {@html potentiallyUnsafeHtmlString} ``` > [!NOTE] 渡される文字列をエスケープするか、または自分がコントロールできる値でのみ埋めるようにして、[XSS 攻撃](https://owasp.org/www-community/attacks/xss/) を防止してください。 ## Comments コンポーネント内で HTML コメントを使用することができます。 ```svelte

Hello world

``` `svelte-ignore` で始まるコメントは、その次にくるマークアップブロックに対する警告を無効にします。通常、これらはアクセシビリティに関する警告であることが多いですが、適切な理由がある場合にのみ無効化するようにしてください。 ```svelte ``` `@component` で始まる特別なコメントを追加することで、他のファイルでコンポーネント名にカーソルを合わせたときに表示されるコメントを作成できます。 ````svelte

Hello, {name}

````