Closed7

ReactのuseIdと同等の仕組みがあるライブラリ・フレームワークを調査する

yamanokuyamanoku

そもそも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>

関連:useId – React


ほかのフロントエンドライブラリ・フレームワークでは同一の仕組みがあるのかが気になったので調査してみる。

yamanokuyamanoku

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>

関連:useId · Nuxt Composables


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

yamanokuyamanoku

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>
  )
};

関連:Hooks – Preact Guide

yamanokuyamanoku

SolidJS

名前自体は違うが同等の挙動として一意のIDを生成するcreateUniqueIdというAPIを提供している。v1.1.0から使用可能になっている。

import { createUniqueId } from "solid-js";

const id = createUniqueId();

関連:createUniqueId - SolidDocs

yamanokuyamanoku

まだ実装されていないライブラリ・フレームワーク

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

このスクラップは4ヶ月前にクローズされました