Spear のコンポーネント

Spear はコンポーネントをサポートしています。これは他の Vue や Astro と似た機能です。

簡単な使い方例

簡単なコンポーネントの例です。

  • /src/components/test-component.spear
<div>
  <h1>This is test component</h1>
</div>
  • /src/index.html
<body>
  <test-component></test-component>
</body>

生成された HTML は以下のようになります。

  • /dist/index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>{{projectName}}</title>
</head>
<body>
  <div>
    <h1>This is test component</h1>
  </div>
</body>
</html>

コンポーネントの基本

Spear のコンポーネントの拡張子は .spear です。そして、このコンポーネントファイルは src/components ディレクトリに保存する必要があります。
プロジェクト構造を変更するには spear.config.mjs を変更する必要があります。

設定ファイルの詳細については、インストールガイドを参照してください。

コンポーネントスロット

Spear はスロット機能を提供しています。

スロットとは?

スロットは親ページとコンポーネント間でコミュニケーションをする手段です。例えば、イメージギャラリーを表示する事を想像してみてください。

各画像で表示すべき HTML はほとんど同じものになります。

<div>
  <figure>
    <image src="/galleries/image-1.png" alt="image 1">
  </figure>
</div>

もし10個の画像を表示する場合、この同じような HTML を10回実装する必要があります。このような場合で、スロット機能を使うことができます。

もし以下のようなコンポーネントを実装すれば、重複するコードを削減することができます。

  • /src/components/gallery-image.spear
<div>
  <figure>
    <slot>
  </figure>
<div>
  • /src/galleries.html
...
<div>
  <gallery-image><image src="/garraries/image-1.png" alt="image 1"></gallery-image>
  <gallery-image><image src="/garraries/image-2.png" alt="image 2"></gallery-image>
...  <gallry-image><image src="/garraries/image-10.png" alt="image 10"></gallery-image>
</div>

名前付きスロット

簡単なサイトであれば、1つのスロットで十分かもしれません。しかし、現実世界は複雑です。
Spear は1つのコンポーネント内に複数スロットをサポートしています。この場合、渡ってきたスロットの HTML はどこに挿入すべきか分からなくなるため、各スロットに名前をつける必要があります。

  • /src/components/multi-slot.spear
<div>
  <ul>
    <li><slot name="first"></slot></li>
    <li><slot name="second"></slot></li>
    <li><slot name="third"></slot></li>
  </ul>
</div>
  • /src/index.html
<div>
  <main-component>
    <div slot="first">This is first description</div>
    <div slot="second">This is second description</div>
    <div slot="third">This is third description</div>
  </main-component>
</div>

上記サンプルでは、 スロットの name 属性値と親ページの slot 属性値はリンクしています。

開発予定の機能 🚀

Props

  • 現在、Spear はコンポーネントの属性値の Props をサポートしていません。
    • 詳細については、この Issue を参照してください。