javascript - 如何在信用卡号的输入文本框中显示4个数字然后是空格?
问题描述
我尝试通过创建一个覆盖文本框的文本来做到这一点,但我没有继续,因为它会使事情变得更加复杂。
我回滚代码。
################################################# ###################################### 这是我的回滚代码:
const StepFour = (props) => {
const [number, setNumber] = useState('')
const [expiry, setExpiry] = useState('')
const [cvc, setCvc] = useState('')
const [focus, setFocus] = useState('')
const [month, setMonth] = useState('')
const [year, setYear] = useState('')
const [cardNumError, setCardNumError] = useState(false)
const dispatch = useDispatch()
const cardList = ['4571736000000075']
const handleCardNumError = () => {
if (!cardList.includes(number) ) {
setCardNumError(true)
} else {
setCardNumError(false)
}
}
const handleCardNumError2 = () => {
if (!cardList.includes(number) && number.length === 19 ) {
setCardNumError(true)
} else {
setCardNumError(false)
}
}
useEffect(() => {
setExpiry(month + '/' + year)
}, [month, year])
const classes = useStyles()
return (
<div className={classes.mainContainer}>
<div>
<Cards
number={number}
expiry={expiry}
cvc={cvc}
focused={focus}/>
</div>
<div className={classes.formInputContatiner}>
<div>
<Typography
variant="subtitle1"
style={{
color: "black",
textAlign: "left",
marginBottom: "5px"
}}>
Card Number
</Typography>
<div className={classes.cardNumber}>
<div className={classes.grid}>
<div className={classes.cardNumContainer}>
<input
className={classes.inputStyle}
type='tel'
name='number'
maxLength='16'
placeholder='1234 1234 1234 1234'
value={number}
style={{
color: "black",
border: "1px solid",
borderColor: cardNumError ? 'red' : '#ccc',
display: "inline-block"
}}
onChange={e => {
let val = e.target.value
const re = /^[0-9\b]+$/
if (val === '' || re.test(val)) {
setNumber(val)
dispatch(getCN(val))
}
handleCardNumError2()
}}
onFocus={e => {
setFocus(e.target.name)
}}
onBlur={() => {
handleCardNumError()
}}/>
</div>
</div>
{cardNumError === true ? <Typography
variant="subtitle1"
style={{
color: "red",
}}>
Your card number is invalid.
</Typography> : null}
</div>
</div>
<div>
<Typography
variant="subtitle1"
style={{
color: "black",
textAlign: "left",
marginBottom: "5px"
}}>
Month and Year
</Typography>
<div className={classes.dateAndCVC}>
<input
className={classes.inputStyle2}
type="text"
name='month'
placeholder='MM'
value={month}
onChange={e => {
setMonth(e.target.value)
dispatch(getCDM(e.target.value))
}}
onFocus={e => setFocus(e.target.name)}/>
<input
className={classes.inputStyle2}
type="text"
name='year'
placeholder='YY'
value={year}
onChange={e => {
setYear(e.target.value)
dispatch(getCDY(e.target.value))
}}
onFocus={e => setFocus(e.target.name)}/>
</div>
</div>
<div>
<Typography
variant="subtitle1"
style={{
color: "black",
textAlign: "left",
marginBottom: "5px"
}}>
CVC
</Typography>
<input
className={classes.inputStyle2}
type="tel"
name='cvc'
placeholder='CVC'
value={cvc}
onChange={e => {
setCvc(e.target.value)
dispatch(getCCVC(e.target.value))
}}
onFocus={e => setFocus(e.target.name)}/>
</div>
</div>
</div>
)
}
导出默认 StepFour
这是输出:
解决方案
这是我的解决方案。我通过检查输入是否已经有 4 个字符长度然后添加它来处理卡片何时显示space
。
重要的部分是当您键入每个字符时,您必须在再次space
添加之前删除所有旧字符space
,否则它将在输入中填充很多奇怪的space
.
这是我的代码。你可以在这里看到它的动作
import React, { useState } from 'react';
function App() {
const [card, setCard] = useState('')
const handleCardDisplay = () => {
const rawText = [...card.split(' ').join('')] // Remove old space
const creditCard = [] // Create card as array
rawText.forEach((t, i) => {
if (i % 4 === 0) creditCard.push(' ') // Add space
creditCard.push(t)
})
return creditCard.join('') // Transform card array to string
}
return (
<div>
<input
value={handleCardDisplay()}
onChange={(e) => setCard(e.target.value)}
/>
</div>
)
}
export default App;
推荐阅读
- sql - 根据条件删除/修改一个表中的行 - Oracle DBMS
- go - 为什么我的 Google Cloud Run 服务器返回 CORS 错误?
- c# - 遍历大型 2 列列表的最佳方法
- lisp - 在 Lisp 中将 hashtable 中的每个值重置为 nil
- python - 熊猫爆炸错误 - 列必须是标量
- c# - C# Lambda / 扩展方法使 4 个实体之间的结果变平?
- javascript - 在 React 中使用条件导入
- sitecore - 如何使用 XML 和 ShowModalDialog 创建站点核心对话框
- python - Python将几个列表添加到一个列表中
- javascript - 获取与嵌套对象中的条件匹配的对象数组