Skip to content

v-click-delay

Prevent repeated clicks within a specified time period. Perfect for preventing double submissions and spam clicks.

Since: 1.3.0

Usage

Basic

vue
<template>
  <button v-click-delay="handleClick">Click Me</button>
</template>

<script setup>
import { ref } from 'vue'

function handleClick(event) {
  console.log('Button clicked!')
}
</script>

With Delay Time

vue
<template>
  <!-- Using argument syntax for delay time -->
  <button v-click-delay:500="handleClick">500ms delay</button>
  <button v-click-delay:1s="handleClick">1s delay</button>
</template>

With Options

vue
<template>
  <button v-click-delay="{
    handler: handleClick,
    delay: 1000,
    feedback: true
  }">
    Submit
  </button>
</template>

API

Types

typescript
type ClickDelayHandler = (event: MouseEvent | TouchEvent) => void

interface ClickDelayOptions {
  handler: ClickDelayHandler
  delay?: number // default: 300
  disabled?: boolean // default: false
  pendingClass?: string // default: 'v-click-delay--pending'
  feedback?: boolean // default: true
}

type ClickDelayBinding = ClickDelayHandler | ClickDelayOptions

Options

OptionTypeDefaultDescription
handler(event: MouseEvent | TouchEvent) => void-Click handler (required)
delaynumber300Delay time in milliseconds
disabledbooleanfalseDisable the delay behavior
pendingClassstring'v-click-delay--pending'CSS class added during delay
feedbackbooleantrueWhether to add visual feedback

CSS Classes

  • v-click-delay--pending - Added to element during the delay period (customizable via pendingClass)

Examples

Form Submission

vue
<template>
  <form @submit.prevent="submit">
    <button type="submit" v-click-delay="{ handler: submit, delay: 2000 }">
      {{ submitting ? 'Submitting...' : 'Submit' }}
    </button>
  </form>
</template>

Composable API

For programmatic use, you can use the useClickDelay composable:

typescript
import { useClickDelay, createDelayedClick } from 'directix'

// Composable usage
const { isPending, click, reset, cancel } = useClickDelay({
  handler: async (event) => {
    await submitForm()
  },
  delay: 500,
  disabled: false
})

// Call the click handler
click(event)

// Reset pending state
reset()

// Simple function wrapper
const delayedSubmit = createDelayedClick(submitForm, 1000)
button.onclick = delayedSubmit

UseClickDelayOptions

OptionTypeDefaultDescription
handler(event: MouseEvent | TouchEvent) => void-Click handler (required)
delaynumber | Ref<number>300Delay time in milliseconds
disabledboolean | Ref<boolean>falseDisable the delay

UseClickDelayReturn

PropertyTypeDescription
isPendingRef<boolean>Whether a click is pending
click(event: MouseEvent | TouchEvent) => voidTrigger click with delay protection
reset() => voidReset pending state
cancel() => voidCancel pending timeout

Example

vue
<script setup>
import { useClickDelay } from 'directix'

const { click, isPending } = useClickDelay({
  handler: async (event) => {
    await submitForm()
  },
  delay: 500
})
</script>

<template>
  <button @click="click" :disabled="isPending">
    {{ isPending ? 'Processing...' : 'Submit' }}
  </button>
</template>

Code Generator

Quick Code Generator
<template>
  <div v-click-delay="{ delay: 300 }">
    <!-- Prevent repeated clicks within a specified time period. Perfect for preventing double submissions and spam clicks. directive -->
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'

// Configure your options here
const options = { delay: 300 }
</script>

Released under the MIT License.