インライン
Inline Events
useAutoKana と同じロジックを Composable に分離せず、コンポーネント内に直接書いた版。動作は同じですが、コードの冗長性が増します。
実装コード
pages/auto-kana/inline.vue
const nameRef = ref<HTMLInputElement | null>(null)
const furigana = ref('')
let segments: string[] = []
let currentSegment = ''
const isKana = (s: string) => /^[-ゟ゠-ヿㇰ-ㇿー\s ]*$/.test(s)
const flush = () => (furigana.value = [...segments, currentSegment].join(''))
onMounted(() => {
const el = nameRef.value
if (!el) return
el.addEventListener('compositionstart', () => { currentSegment = '' })
el.addEventListener('compositionupdate', (e: CompositionEvent) => {
if (isKana(e.data ?? '')) { currentSegment = e.data ?? ''; flush() }
})
el.addEventListener('compositionend', () => {
segments.push(currentSegment); currentSegment = ''; flush()
})
el.addEventListener('input', (e) => {
if ((e as InputEvent).isComposing) return
if (!el.value) { segments = []; currentSegment = ''; furigana.value = '' }
})
})
// ↑ composables/useAutoKana.ts に移動したのが Composable 版- ✅ 動作は useAutoKana Composable と完全に同じ
- ⚠️ addEventListener のセットアップを毎回コンポーネントに書く必要がある
- ⚠️ 複数フォームで使う場合にコピペが発生する
- ℹ️ このコードをそのまま composables/useAutoKana.ts に移動したのが Composable 版