Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Apply VueUse composables in Vue 3/Nuxt projects to replace custom implementations with battle-tested utilities.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/onClickOutside.md
1---2category: Sensors3---45# onClickOutside67Listen for clicks outside of an element. Useful for modals or dropdowns.89## Usage1011```vue12<script setup lang="ts">13import { onClickOutside } from '@vueuse/core'14import { useTemplateRef } from 'vue'1516const target = useTemplateRef('target')1718onClickOutside(target, event => console.log(event))19</script>2021<template>22<div ref="target">23Hello world24</div>25<div>Outside element</div>26</template>27```2829### Return Value3031By default, `onClickOutside` returns a `stop` function to remove the event listeners.3233```ts34const stop = onClickOutside(target, handler)3536// Later, stop listening37stop()38```3940### Controls4142If you need more control over triggering the handler, you can use the `controls` option. This returns an object with `stop`, `cancel`, and `trigger` functions.4344```ts45const { stop, cancel, trigger } = onClickOutside(46modalRef,47(event) => {48modal.value = false49},50{ controls: true },51)5253// cancel prevents the next click from triggering the handler54cancel()5556// trigger manually fires the handler57trigger(event)5859// stop removes all event listeners60stop()61```6263### Ignore Elements6465Use the `ignore` option to prevent certain elements from triggering the handler. Provide elements as an array of Refs or CSS selectors.6667```ts68const ignoreElRef = useTemplateRef('ignoreEl')6970onClickOutside(71target,72event => console.log(event),73{ ignore: [ignoreElRef, '.ignore-class', '#ignore-id'] },74)75```7677### Capture Phase7879By default, the event listener uses the capture phase (`capture: true`). Set `capture: false` to use the bubbling phase instead.8081```ts82onClickOutside(target, handler, { capture: false })83```8485### Detect Iframe Clicks8687Clicks inside an iframe are not detected by default. Enable `detectIframe` to also trigger the handler when focus moves to an iframe.8889```ts90onClickOutside(target, handler, { detectIframe: true })91```9293## Component Usage9495```vue96<template>97<OnClickOutside :options="{ ignore: [/* ... */] }" @trigger="count++">98<div>99Click Outside of Me100</div>101</OnClickOutside>102</template>103```104105## Directive Usage106107```vue108<script setup lang="ts">109import { vOnClickOutside } from '@vueuse/components'110import { shallowRef } from 'vue'111112const modal = shallowRef(false)113function closeModal() {114modal.value = false115}116</script>117118<template>119<button @click="modal = true">120Open Modal121</button>122<div v-if="modal" v-on-click-outside="closeModal">123Hello World124</div>125</template>126```127128You can also set the handler as an array to set the configuration items of the instruction.129130```vue131<script setup lang="ts">132import { vOnClickOutside } from '@vueuse/components'133import { shallowRef, useTemplateRef } from 'vue'134135const modal = shallowRef(false)136137const ignoreElRef = useTemplateRef('ignoreEl')138139const onClickOutsideHandler = [140(ev) => {141console.log(ev)142modal.value = false143},144{ ignore: [ignoreElRef] },145]146</script>147148<template>149<button @click="modal = true">150Open Modal151</button>152153<div ref="ignoreElRef">154click outside ignore element155</div>156157<div v-if="modal" v-on-click-outside="onClickOutsideHandler">158Hello World159</div>160</template>161```162163## Type Declarations164165```ts166export interface OnClickOutsideOptions<167Controls extends boolean = false,168> extends ConfigurableWindow {169/**170* List of elements that should not trigger the event,171* provided as Refs or CSS Selectors.172*/173ignore?: MaybeRefOrGetter<(MaybeElementRef | string)[]>174/**175* Use capturing phase for internal event listener.176* @default true177*/178capture?: boolean179/**180* Run handler function if focus moves to an iframe.181* @default false182*/183detectIframe?: boolean184/**185* Use controls to cancel/trigger listener.186* @default false187*/188controls?: Controls189}190export type OnClickOutsideHandler<191T extends OnClickOutsideOptions<boolean> = OnClickOutsideOptions,192> = (193event:194| (T["detectIframe"] extends true ? FocusEvent : never)195| (T["controls"] extends true ? Event : never)196| PointerEvent,197) => void198export type OnClickOutsideReturn<Controls extends boolean = false> =199Controls extends false200? Fn201: {202stop: Fn203cancel: Fn204trigger: (event: Event) => void205}206/**207* Listen for clicks outside of an element.208*209* @see https://vueuse.org/onClickOutside210* @param target211* @param handler212* @param options213*/214export declare function onClickOutside<T extends OnClickOutsideOptions>(215target: MaybeComputedElementRef,216handler: OnClickOutsideHandler<T>,217options?: T,218): Fn219export declare function onClickOutside<T extends OnClickOutsideOptions<true>>(220target: MaybeComputedElementRef,221handler: OnClickOutsideHandler<T>,222options: T,223): {224stop: Fn225cancel: Fn226trigger: (event: Event) => void227}228```229