问题描述
我正在尝试使用 React 制作信用卡/借记卡表格。我想在每 4 位数字后自动插入空格并仅强制用户键入数字。例如,如果输入 1234567891234567 它将变成带有空格 1234 5678 9123 4567。 问题是当我按退格键时,空格不能被删除,因为我使用了 onChange 事件。我是 React 的新手,可能需要不同的方法。我还能用什么来使退格键正常工作以及如何禁止写字母(仅限数字)?
const [cardNumber,setCardNumber] = useState('')
const handleChange = async (e) => {
if (e.target.value.length === 4) {
e.target.value += ' '
} else if (e.target.value.length === 9) {
e.target.value += ' '
} else if (e.target.value.length === 14) {
e.target.value += ' '
}
setCardNumber(e.target.value)
}
解决方法
Id 创建一个状态变量来保存抄送号码
const [ccNumber,setCcNumber] = useState("");
并设置输入的ccNumber
onChange
<input type="text" value={ccNumber} onChange={formatAndSetCcNumber} />
在 fn formatAndSetCcNumber
里面我会处理逻辑
const formatAndSetCcNumber = e => {
const inputVal = e.target.value.replace(/ /g,""); //remove all the empty spaces in the input
let inputNumbersOnly = inputVal.replace(/\D/g,""); // Get only digits
if (inputNumbersOnly.length > 16) {
//If entered value has a length greater than 16 then take only the first 16 digits
inputNumbersOnly = inputNumbersOnly.substr(0,16);
}
// Get nd array of 4 digits per an element EX: ["4242","4242",...]
const splits = inputNumbersOnly.match(/.{1,4}/g);
let spacedNumber = "";
if (splits) {
spacedNumber = splits.join(" "); // Join all the splits with an empty space
}
setCcNumber(spacedNumber); // Set the new CC number
};
这是一个demo
,试试这个:
const handleChange = async (e) => {
setCardNumber(e.target.value)
}
useEffect(()=>{
if(cardNumber.length===4)
setcardNumber(cardNumber+" ")
else if (cardNumber.length === 9) {
setcardNumber(cardNumber+" ")
} else if (cardNumber.length === 14) {
setcardNumber(cardNumber+" ")
}
},[cardNumber]);
抱歉打字错误。