useFocusTrap
useFocusTrap
focus-trap のリアクティブラッパー。
渡すことができるオプションの詳細については、focus-trap のドキュメント内の createOptions を参照してください。
インストール
npm i focus-trap@^7
使用法
基本的な使用法
<script setup lang="ts">
import { useFocusTrap } from '@vueuse/integrations/useFocusTrap'
import { useTemplateRef } from 'vue'
const target = useTemplateRef<HTMLDivElement>('target')
const { hasFocus, activate, deactivate } = useFocusTrap(target)
</script>
<template>
<div>
<button @click="activate()">
Activate
</button>
<div ref="target">
<span>Has Focus: {{ hasFocus }}</span>
<input type="text">
<button @click="deactivate()">
Deactivate
</button>
</div>
</div>
</template>
複数の参照
<script setup lang="ts">
import { useFocusTrap } from '@vueuse/integrations/useFocusTrap'
import { useTemplateRef } from 'vue'
const targetOne = useTemplateRef<HTMLDivElement>('targetOne')
const targetTwo = useTemplateRef<HTMLDivElement>('targetTwo')
const { hasFocus, activate, deactivate } = useFocusTrap([targetOne, targetTwo])
</script>
<template>
<div>
<button @click="activate()">
Activate
</button>
<div ref="targetOne">
<span>Has Focus: {{ hasFocus }}</span>
<input type="text">
</div>
...
<div ref="targetTow">
<p>Another target here</p>
<input type="text">
<button @click="deactivate()">
Deactivate
</button>
</div>
</div>
</template>
動的フォーカスターゲット
<script setup lang="ts">
import { useFocusTrap } from '@vueuse/integrations/useFocusTrap'
import { computed, shallowRef, useTemplateRef } from 'vue'
const left = useTemplateRef('left')
const right = useTemplateRef('right')
const currentRef = shallowRef<'left' | 'right'>('left')
const target = computed(() =>
currentRef.value === 'left'
? left
: currentRef.value === 'right'
? right
: null,
)
const { activate } = useFocusTrap(target)
</script>
<template>
<div>
<div ref="left" class="left">
...
</div>
<div ref="right" class="right">
...
</div>
</div>
</template>
自動フォーカス
<script setup lang="ts">
import { useFocusTrap } from '@vueuse/integrations/useFocusTrap'
import { useTemplateRef } from 'vue'
const target = useTemplateRef<HTMLDivElement>('target')
const { hasFocus, activate, deactivate } = useFocusTrap(target, { immediate: true })
</script>
<template>
<div>
<div ref="target">
...
</div>
</div>
</template>
条件付きレンダリング
この関数は、v-if を使用した条件付きレンダリングの要素に対して適切にフォーカスをアクティブにすることができません。これは、フォーカスのアクティベーション時にそれらがDOMに存在しないためです。これを解決するには、次のティックでアクティベートする必要があります。
<script setup lang="ts">
import { useFocusTrap } from '@vueuse/integrations/useFocusTrap'
import { nextTick, useTemplateRef } from 'vue'
const target = useTemplateRef<HTMLDivElement>('target')
const { activate, deactivate } = useFocusTrap(target, { immediate: true })
const show = ref(false)
async function reveal() {
show.value = true
await nextTick()
activate()
}
</script>
<template>
<div>
<div v-if="show" ref="target">
...
</div>
<button @click="reveal">
Reveal and Focus
</button>
</div>
</template>
コンポーネントの使用
UseFocusTrap コンポーネントを使用すると、このコンポーネントのマウント時にフォーカストラップが自動的にアクティブになり、アンマウント時に非アクティブになります。
<script setup lang="ts">
import { UseFocusTrap } from '@vueuse/integrations/useFocusTrap/component'
import { shallowRef } from 'vue'
const show = shallowRef(false)
</script>
<template>
<UseFocusTrap v-if="show" :options="{ immediate: true }">
<div class="modal">
...
</div>
</UseFocusTrap>
</template>
© 2019–PRESENT Anthony Fu https://github.com/antfu
※このページは Nuxt.js 公式ドキュメントの翻訳ページです。
公式ドキュメントの該当ページはこちら:
#