React v16.8+ のお話。 hooks を利用して、 Function Component のインスタンスごとに一意な値を割り当てる方法。
import React from 'react'
let counter = 0
const useInstanceId = (): number => {
const ref = React.useRef<number | null>(null)
if (ref.current === null) {
ref.current = counter += 1
}
return ref.current
}
import React from 'react'
import { useInstanceId } from './useInstanceId'
const Example = () => {
const id = useInstanceId()
return <span>{id}</span>
}
こうすると DemoComponent
コンポーネントのインスタンスごとに一意な id
が割り振られる。 Ref
を用いることで再描画が発生しても id
は変わらない。
この方法はインスタンス変数を使う方法として公式ドキュメントに載っていた。
React.useRef()
で返るオブジェクトは MutableRefObject
として定義されており、 current
プロパティが読み書き可能になっている。 そこに値をセットして使うというもの。
let counter
が気になる気がしないでもないが、まあしゃーなし。
ユースケースとしてはこんな感じ。
import React from 'react'
import { useInstanceId } from './useInstanceId'
const ExamplePanel = (props: { children: React.ReactNode }) => {
const id = useInstanceId()
return (
<>
<button aria-controls={'demo-pane-' + id}>トグルする</button>
<div id={'demo-pane-' + id}>{props.children}</div>
</>
)
}
実装はいろいろ省略しているが、 汎用的なコンポーネント内で id
属性を使う場合は値の重複を避けたい。 そんなときに使える。