コンテンツへスキップ

useEventListener

カテゴリ
エクスポートサイズ
467 B
最終変更日
先週

簡単に`addEventListener`を使用します。マウント時に`addEventListener`を使用して登録し、アンマウント時に`removeEventListener`を自動的に使用します。addEventListener removeEventListener

使用方法

js
import { useEventListener } from '@vueuse/core'

useEventListener(document, 'visibilitychange', (evt) => {
  console.log(evt)
})

イベントターゲットとしてrefを渡すこともできます。useEventListenerは、ターゲットを変更すると、以前のイベントの登録を解除し、新しいイベントを登録します。

ts
import { useEventListener } from '@vueuse/core'

const element = ref<HTMLDivElement>()
useEventListener(element, 'keydown', (e) => {
  console.log(e.key)
})
js
import { useEventListener } from '@vueuse/core'
const element = ref()
useEventListener(element, 'keydown', (e) => {
  console.log(e.key)
})
vue
<template>
  <div v-if="cond" ref="element">
    Div1
  </div>
  <div v-else ref="element">
    Div2
  </div>
</template>

返された関数を呼び出してリスナーの登録を解除することもできます。

ts
import { useEventListener } from '@vueuse/core'

const cleanup = useEventListener(document, 'keydown', (e) => {
  console.log(e.key)
})

cleanup() // This will unregister the listener.

コンポーネントがSSR(サーバーサイドレンダリング)でも実行される場合、`document`や`window`などのDOM APIはNode.jsでは使用できないため、`document is not defined`などのエラーが発生する可能性があります。これを回避するには、ロジックを`onMounted`フック内に配置します。

ts
// onMounted will only be called in the client side, so it guarantees the DOM APIs are available.
onMounted(() => {
  useEventListener(document, 'keydown', (e) => {
    console.log(e.key)
  })
})

型宣言

型宣言を表示
typescript
interface InferEventTarget<Events> {
  addEventListener: (event: Events, fn?: any, options?: any) => any
  removeEventListener: (event: Events, fn?: any, options?: any) => any
}
export type WindowEventName = keyof WindowEventMap
export type DocumentEventName = keyof DocumentEventMap
export interface GeneralEventListener<E = Event> {
  (evt: E): void
}
/**
 * Register using addEventListener on mounted, and removeEventListener automatically on unmounted.
 *
 * Overload 1: Omitted Window target
 *
 * @see https://vueuse.dokyumento.jp/useEventListener
 * @param event
 * @param listener
 * @param options
 */
export declare function useEventListener<E extends keyof WindowEventMap>(
  event: Arrayable<E>,
  listener: Arrayable<(this: Window, ev: WindowEventMap[E]) => any>,
  options?: MaybeRefOrGetter<boolean | AddEventListenerOptions>,
): Fn
/**
 * Register using addEventListener on mounted, and removeEventListener automatically on unmounted.
 *
 * Overload 2: Explicitly Window target
 *
 * @see https://vueuse.dokyumento.jp/useEventListener
 * @param target
 * @param event
 * @param listener
 * @param options
 */
export declare function useEventListener<E extends keyof WindowEventMap>(
  target: Window,
  event: Arrayable<E>,
  listener: Arrayable<(this: Window, ev: WindowEventMap[E]) => any>,
  options?: MaybeRefOrGetter<boolean | AddEventListenerOptions>,
): Fn
/**
 * Register using addEventListener on mounted, and removeEventListener automatically on unmounted.
 *
 * Overload 3: Explicitly Document target
 *
 * @see https://vueuse.dokyumento.jp/useEventListener
 * @param target
 * @param event
 * @param listener
 * @param options
 */
export declare function useEventListener<E extends keyof DocumentEventMap>(
  target: DocumentOrShadowRoot,
  event: Arrayable<E>,
  listener: Arrayable<(this: Document, ev: DocumentEventMap[E]) => any>,
  options?: MaybeRefOrGetter<boolean | AddEventListenerOptions>,
): Fn
/**
 * Register using addEventListener on mounted, and removeEventListener automatically on unmounted.
 *
 * Overload 4: Explicitly HTMLElement target
 *
 * @see https://vueuse.dokyumento.jp/useEventListener
 * @param target
 * @param event
 * @param listener
 * @param options
 */
export declare function useEventListener<E extends keyof HTMLElementEventMap>(
  target: MaybeRefOrGetter<HTMLElement | null | undefined>,
  event: Arrayable<E>,
  listener: (this: HTMLElement, ev: HTMLElementEventMap[E]) => any,
  options?: boolean | AddEventListenerOptions,
): () => void
/**
 * Register using addEventListener on mounted, and removeEventListener automatically on unmounted.
 *
 * Overload 5: Custom event target with event type infer
 *
 * @see https://vueuse.dokyumento.jp/useEventListener
 * @param target
 * @param event
 * @param listener
 * @param options
 */
export declare function useEventListener<
  Names extends string,
  EventType = Event,
>(
  target: MaybeRefOrGetter<InferEventTarget<Names> | null | undefined>,
  event: Arrayable<Names>,
  listener: Arrayable<GeneralEventListener<EventType>>,
  options?: MaybeRefOrGetter<boolean | AddEventListenerOptions>,
): Fn
/**
 * Register using addEventListener on mounted, and removeEventListener automatically on unmounted.
 *
 * Overload 6: Custom event target fallback
 *
 * @see https://vueuse.dokyumento.jp/useEventListener
 * @param target
 * @param event
 * @param listener
 * @param options
 */
export declare function useEventListener<EventType = Event>(
  target: MaybeRefOrGetter<EventTarget | null | undefined>,
  event: Arrayable<string>,
  listener: Arrayable<GeneralEventListener<EventType>>,
  options?: MaybeRefOrGetter<boolean | AddEventListenerOptions>,
): Fn

ソース

ソースドキュメント

コントリビューター

Anthony Fu
丶远方
Anthony Fu
Forrest Li
陪我去看海吧
Julien Le Coupanec
Michael J. Roberts
James Garbutt
vaakian X
sun0day
Alejandro Arevalo
Jelf
Alex Kozack
lstoeferle
Antério Vieira

変更ログ

v12.0.0-beta.1 2024/11/21
0a9ed - feat!: Vue 2サポートの削除、バンドルの最適化、クリーンアップ (#4349)
v11.0.0-beta.2 2024/7/17
edab6 - fix: イベントターゲットは空のref/ゲッターにすることができます (#4014)
v10.8.0 2024/2/20
a086e - fix: より厳格な型
v10.4.1 2023年8月28日
3ef59 - 修正: 削除時のイミュータブルなオプション、クローズ #2825 (#3346)
v10.3.0 2023年7月30日
4f414 - 修正: useEventListener のオーバーロードを改善 (#3246)
v10.0.0-beta.5 2023年4月13日
cb644 - リファクタリング!: isFunctionisString のユーティリティ関数を削除
v10.0.0-beta.4 2023年4月13日
4d757 - 機能追加(型): MaybeComputedRefMaybeRefOrGetter に名前変更
0a72b - 機能追加(toValue): resolveUnreftoValue に名前変更
v9.13.0 2023年2月18日
103d6 - 機能追加: リアクティブなオプションをサポート
v9.10.0 2023年1月3日
07f20 - 機能追加(useActiveElement): シャドウルートをサポート (#2592)
v9.5.0 2022年11月9日
ab0ee - 機能追加: 複数のeventsまたはlistenersを受け入れる (#2180)

MITライセンスの下でリリースされています。