カスタム★ 推奨
useAutoKana Composable
composables/useAutoKana.ts composables/useAutoKana.ts に IME の compositionupdate イベントをラップ。依存ゼロ・Vue ネイティブ。使う側はたった1行。
出力形式:
実装コード
composables/useAutoKana.ts
export function useAutoKana(
inputRef: Ref<HTMLInputElement | null>,
options: { output?: MaybeRef<'hiragana' | 'katakana'> } = {}
) {
const kana = ref('')
const isKana = (s: string) => /^[-ゟ゠-ヿㇰ-ㇿー\s ]*$/.test(s)
let segments: string[] = []
let currentSegment = ''
const handlers = {
compositionstart: () => { currentSegment = '' },
compositionupdate: (e: CompositionEvent) => {
if (isKana(e.data ?? '')) { currentSegment = e.data ?? ''; flush() }
},
compositionend: () => { segments.push(currentSegment); currentSegment = ''; flush() },
input: (e: Event) => {
if ((e as InputEvent).isComposing) return
if (!(e.target as HTMLInputElement).value) {
segments = []; currentSegment = ''; kana.value = ''
}
},
}
onMounted(() => { if (inputRef.value) attach(inputRef.value) })
onUnmounted(() => { if (inputRef.value) detach(inputRef.value) })
return { kana: readonly(kana) }
}pages/auto-kana/composable.vue
const outputMode = ref<'hiragana' | 'katakana'>('hiragana')
const nameRef = ref<HTMLInputElement | null>(null)
const { kana } = useAutoKana(nameRef, { output: outputMode })
// <input ref="nameRef" type="text" />
// <input :value="kana" readonly />- ✅ 依存ゼロ — npm インストール不要
- ✅ compositionupdate で IME 読みを取得(漢字確定前のひらがな)
- ✅ 候補選択で漢字になっても読みは上書きされない(isKana チェック)
- ✅ output オプションがリアクティブ(MaybeRef 対応)
- ✅ 複数セグメント(名前を複数回変換しても結合)
- ✅ 入力クリアで自動リセット