react-otp
Result
Loading...
Live Editor
function OTPInput() { const [otp, setOtp] = useState(["", "", "", ""]); const inputRefs = [useRef(), useRef(), useRef(), useRef()]; const handleChange = (element, index) => { if (isNaN(element.value)) return false; setOtp([...otp.map((d, idx) => (idx === index ? element.value : d))]); // Focus next input if (element.value !== "" && index < 3) { inputRefs[index + 1].current.focus(); } }; const handleKeyDown = (e, index) => { if (e.key === "Backspace" && !otp[index] && index > 0) { // Focus previous input on backspace inputRefs[index - 1].current.focus(); } }; return ( <div> <p>OTP</p> {otp.map((digit, index) => ( <input key={index} type="text" ref={inputRefs[index]} value={digit} onChange={(e) => handleChange(e.target, index)} onKeyDown={(e) => handleKeyDown(e, index)} maxLength={1} /> ))} </div> ); }