OTP-Code-Eingabe
Sechs Felder für einen Bestätigungscode, die beim Tippen vorspringen und beim Löschen zurückgehen.
Einstellungen
Code
import { useRef, useState } from "react";
const LENGTH = 6;
interface OtpInputProps {
radius?: number;
value?: string;
onChange?: (value: string) => void;
}
export default function OtpInput({ radius = 12, value, onChange }: OtpInputProps) {
const [internal, setInternal] = useState<string[]>(Array(LENGTH).fill(""));
const refs = useRef<Array<HTMLInputElement | null>>([]);
const digits =
value === undefined
? internal
: Array.from({ length: LENGTH }, (_, i) => value[i] ?? "");
const update = (i: number, x: string) => {
const next = digits.map((d, j) => (j === i ? x : d));
if (value === undefined) setInternal(next);
onChange?.(next.join(""));
};
return (
<div className="flex gap-2">
{digits.map((d, i) => (
<input
key={i}
ref={(el) => {
refs.current[i] = el;
}}
aria-label={`Dígito ${i + 1}`}
value={d}
inputMode="numeric"
maxLength={1}
onChange={(e) => {
const x = e.target.value.replace(/\D/g, "");
update(i, x);
if (x) refs.current[i + 1]?.focus();
}}
onKeyDown={(e) => {
if (e.key === "Backspace" && !d) refs.current[i - 1]?.focus();
}}
className="h-12 w-10 border border-black/10 bg-white text-center text-lg text-[#1d1d1f] outline-none focus:ring-2 focus:ring-[#0071e3] dark:border-white/10 dark:bg-[#1c1c1e] dark:text-[#f5f5f7]"
style={{ borderRadius: radius }}
/>
))}
</div>
);
}
Prompt für KI
Füg ihn in ChatGPT, Claude oder Cursor ein und der Baustein wird mit diesen Einstellungen an dein Projekt angepasst, auch ohne React.
Mehr aus Eingabefelder
Wofür du ihn nutzen kannst
Einmalcodes begegnen einem bei der Registrierung, beim Login mit Zwei-Faktor, bei Überweisungen und Lieferbestätigungen. Sechs getrennte Felder machen den Code auf einen Blick prüfbar, und der Cursor springt von selbst weiter, niemand muss jedes Feld antippen. Es nimmt nur Ziffern an, genau das, was ein OTP-Eingabefeld in React braucht.
Viele kopieren den Code aus einer SMS oder E-Mail. Überleg dir also, Einfügen so zu unterstützen, dass alle sechs Felder auf einmal gefüllt werden. Pass den Eckenradius an deine anderen Felder an. Eckige Felder wirken seriöser, was etwa zu einer Bank besser passen kann.