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, disabled: false
  }">
    <!-- 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, disabled: false
}
</script>

Released under the MIT License.