ReactのuseIdと同等の仕組みがあるライブラリ・フレームワークを調査する
そもそもuseIdとは何か?
ReactにおけるHooksの1つで、ハイドレーション時の不整合を防ぎつつクライアントとサーバとで一意のIDを生成できるもの。React18より提供されたAPIである。
主にUIのアクセシビリティ向上のために用いられて、例としてはフォームに紐づけるにラベルと同一のIDを振るために使われる。
import { useId } from 'react';
export default function Form() {
const id = useId();
return (
<form>
<label htmlFor={id + '-firstName'}>First Name:</label>
<input id={id + '-firstName'} type="text" />
<hr />
<label htmlFor={id + '-lastName'}>Last Name:</label>
<input id={id + '-lastName'} type="text" />
</form>
);
}
出力結果として以下のようになる
<form>
<label for=":r1:-firstName">First Name:</label>
<input id=":r1:-firstName" type="text">
<hr>
<label for=":r1:-lastName">Last Name:</label>
<input id=":r1:-lastName" type="text"></form>
</form>
ほかのフロントエンドライブラリ・フレームワークでは同一の仕組みがあるのかが気になったので調査してみる。
Nuxt / Vue.js
Vue.jsによるアプリケーションフレームワークのNuxtではuseId
のコンポーザルブル関数が提供されている。これはv3.10より利用できるようになっている。
<script setup lang="ts">
const id = useId()
</script>
<template>
<div>
<label :for="id">Email</label>
<input :id="id" name="email" type="email" />
</div>
</template>
Vue.js単体ではEvan Youにより実装されており、v3.5にてリリースされそうになっている。
feat(runtime-core): useId() by yyx990803 · Pull Request #11404 · vuejs/core
Nuxt側ではそれを受けてVue.jsのuseIdを使ってリファクタリングしようとしている。
refactor(nuxt): update to vue v3.5 + native useId
by danielroe · Pull Request #28285 · nuxt/nuxt
Nuxtのリファクタリング分は3.13.1でリリースされた。
Preact
Hooksという仕組みにおいて、useIdのHooksが使用できるようになっている。Preact 10.11.0とそれに必要なpreact-render-to-string 5.2.4で動作できるようになっている。
const App = props => {
const mainId = useId();
const inputId = useId();
useLayoutEffect(() => {
document.getElementById(inputId).focus()
}, [])
// Display an input with a unique ID.
return (
<main id={mainId}>
<input id={inputId}>
</main>
)
};
SolidJS
名前自体は違うが同等の挙動として一意のIDを生成するcreateUniqueIdというAPIを提供している。v1.1.0から使用可能になっている。
import { createUniqueId } from "solid-js";
const id = createUniqueId();
まだ実装されていないライブラリ・フレームワーク
Svelte
Svelteでは実装されていないが、SSRで一意なIDを設定できるような関数を作ってほしい提案がされている。
SSR-safe ID generation · Issue #7517 · sveltejs/svelte
Angular
Angularでは実装されていないが、一意なIDを設定できるような機能を作ってほしい提案がされている。
Unique ID generation for component instances · Issue #55062 · angular/angular
Simple scope
Astroのためのシンプルツール群であるSimple StackにおいてSimple scopeというライブラリが存在する。
import { scope } from 'simple:scope';
function Form() {
return (
<form>
<label htmlFor={scope('email')}>Email</label>
<input id={scope('email')} name="email" />
</form>
);
}
Astroで使用できるほか、Viteを活用していればVueやSvelteでも使用可能となっている。