よりひろい フロントエンド
Author : Kazuhiro Hara
Author : Kazuhiro Hara
Thu Dec 12 2024

Elementaryでカスタム属性を使う

サーバーサイド Swift で使えるテンプレートパッケージ Elementary は HTML を厳格に生成するために、属性においてもあらかじめ定義されているメソッドにて指定していく形になる。そのため、定義されていない属性を使うことができなそうにみえる。

例えば、こんな風に属性を定義する。

h1(.class("my-h1-class")) {
  "Hello Elementary!"
}

上記は h1 要素に class 属性を指定している。Implicit Member Expression を使って書くのが標準的な書き方だ。

そのため、この中に存在しない属性を書くことは工夫が必要そうにみえる。Elementary の HtmlAttributes に関するドキュメントを見てみる。

その中にこういうメソッドがあることが確認できた。

static func custom(name: String, value: String) -> Self {
    HTMLAttribute(name: name, value: value)
}

custom メソッドに属性名と値を指定することでカスタム属性を定義することができそうだ。例えば x-data 属性に hello という値を指定したい場合は .custom(name: "x-data", value: "hello") という書き方で書くことができる。

ということでこんな感じでカスタム属性を定義できるので、例えば Alpine.js のように独自属性を描く必要があるライブラリを利用する場合は custom メソッドを使うことで対応できそうだ。

import Elementary
import Vapor
import VaporElementary

...

struct ElementaryPage: HTMLDocument {
    ...

    var body: some HTML {
        main {
            h1(.id("my-h1-id"), .class("my-h1-class"), .custom(name: "x-data", value: "hello")) {
                "Hello Elementary!"
            }
        }
    }
}

上記のコードを実行させると以下のような HTML Response を得ることができる。

<!DOCTYPE html>
<html>
  <head>
    <title>Elementary</title>
    <meta charset="UTF-8" />
  </head>
  <body>
    <main>
      <h1 id="my-h1-id" class="my-h1-class" x-data="hello">
        Hello Elementary!
      </h1>
    </main>
  </body>
</html>
ElementarySwiftVapor

Share

About site

「よりひろいフロントエンド」はじめました

いろいろやっている自分を一言で表す言葉として「より広いフロントエンド」を思いつきました。このサイトではこの言葉を中心に ウェブ、XR、UI デザイン、バックエンド、インフラストラクチャーやその周辺のことを興味の赴くまま広くディスカバリーしていきます

About Me

カンソクインダストリーズのロゴ

「よりひろいフロントエンド」運営元 カンソクインダストリーズ では、フロントエンドを中心によろずご相談お受けいたします。お気軽にお問い合わせください。