HextaUI

useInvalidShake

Gönderme denemesi bir form kontrolünü geçersiz bulduğunda onu sallar; biri hâlâ yazarken asla sallamaz.

Submit without choosing.
"use client"

import * as React from "react"

import { Button } from "@/components/ui/button"
import { useInvalidShake } from "@/hooks/use-invalid-shake"

export function UseInvalidShakeDemo() {
  const ref = React.useRef<HTMLSelectElement>(null)
  const [sent, setSent] = React.useState<string>()
  useInvalidShake(ref)

  return (
    <form
      className="flex w-full max-w-xs flex-col gap-3"
      onSubmit={(event) => {
        event.preventDefault()
        setSent(String(new FormData(event.currentTarget).get("plan")))
      }}
    >
      <label className="flex flex-col gap-2 text-sm font-medium">
        Plan
        <select
          ref={ref}
          name="plan"
          required
          defaultValue=""
          className="h-9 rounded-md bg-muted px-2.5 text-sm font-normal outline-none focus-visible:ring-3 focus-visible:ring-focus-ring focus-visible:outline-hidden data-shake:motion-safe:animate-button-shake pointer-coarse:text-touch [&:user-invalid]:ring-2 [&:user-invalid]:ring-destructive/40"
        >
          <option value="" disabled>
            Choose a plan
          </option>
          <option value="hobby">Hobby</option>
          <option value="pro">Pro</option>
        </select>
      </label>
      <Button type="submit" size="sm">
        Continue
      </Button>
      <output className="text-sm text-muted-foreground">
        {sent ? `plan=${sent}` : "Submit without choosing."}
      </output>
    </form>
  )
}
pnpm dlx shadcn@latest add https://hextaui.com/r/use-invalid-shake.json

Hook'u ve bağımlı olduğu her şeyi projenize ekler.

import { useInvalidShake } from "@/hooks/use-invalid-shake"
const ref = React.useRef<HTMLSelectElement>(null)
useInvalidShake(ref)

<form>
  <select
    ref={ref}
    required
    className="data-shake:motion-safe:animate-button-shake"
  >
    …
  </select>
  <button type="submit">Continue</button>
</form>

Hook yalnızca bir data-shake niteliği ayarlar. Hareket temanın animate-button-shake değerinden gelir ve onu data-shake:motion-safe:animate-button-shake ile eklersiniz. HextaUI'ın Input, Textarea, Native select ve Input group bileşenleri bu sınıfı zaten içerir ve hook'u çağırır. Kendi denetimleriniz için doğrudan kullanın.

Sallanma tek bir soruyu yanıtlar: göndermem neden çalışmadı? Bu yüzden hook yalnızca biri göndermeyi denedikten hemen sonra sallar, formu doldururken asla.

OlayAçıklama
Submit attemptBir gönder düğmesine tıklamak, formun bir girdisinde Enter'a basmak veya formun submit olayı.
Invalid within 600msDenetim invalid tetikler veya aria-invalid="true", data-invalid ya da :user-invalid taşır. Bu, yerel doğrulamayı, Base UI alanlarını ve gönderdikten hemen sonra ayarlanan sunucu hatalarını kapsar.
Shakedata-shake 400ms boyunca ayarlanır. Bu sinyallerden kaç tanesi gelirse gelsin, deneme başına bir kez sallanır.
  • Bir InputGroup içinde yalnızca iç denetim değil tüm grup sallanır.
  • Azaltılmış harekette hiçbir şey ayarlanmaz. Her iki durumda da sallanmayı görünür bir hata mesajıyla eşleyin; çünkü sallanma bir ipucudur, mesaj değildir.
  • Hook'un çalışması için denetimin bir <form>'a ait olması gerekir. Olmadan hiçbir şey yapmaz.
  • Denetim başına enabled argümanıyla veya HextaUI girdilerinde shake={false} ile kapatın.
  • Niteliği yeniden başlatmak animasyonu yeniden başlatır; böylece ilki hâlâ sürüyor olsa bile ikinci bir başarısız deneme yeniden sallar.
  • Yerel doğrulama gönderirken ilk geçersiz denetime odaklanır. Sallanma bunun üstüne yalnızca hareket ekler ve odağı asla taşımaz.
PropTürVarsayılan
refİzlenecek form denetimi.
RefObject<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null>–
enabledSallanıp sallanmayacağı.
booleantrue
ÖznitelikAçıklama
data-shakeBaşarısız bir gönderim denemesinden sonra 400ms boyunca denetimde veya InputGroup'ta bulunur.

Input, Textarea, NativeSelect ve InputGroup.