当用户在<input />
上键入值时,我想切换焦点。
但我的问题是,当我在refOne
上键入value时,checkFocus
函数上的codeOne为空,如果我尝试使用setTimeout
。
奇怪的是console.log('render codeOne', codeOne)
有值,但函数内部的codeOne是空的。
的数据
怎么修?
import React, { useState, ChangeEvent, useRef, useEffect } from 'react';
function ModalPhoneBox() => {
const refOne = useRef<HTMLInputElement>(null);
const refTwo = useRef<HTMLInputElement>(null);
const refThree = useRef<HTMLInputElement>(null);
const [codeData, setCodeData] = useState<FormInputType>({
codeOne: '',
codeTwo: '',
codeThree: '',
});
const { codeOne, codeTwo, codeThre } = codeData;
const checkFocus = () => {
console.log('checkFocus');
setTimeout(() => {
if (
refOne.current != null &&
refTwo.current != null &&
refThree.current != null &&
refFour.current != null
) {
console.log('0');
console.log('codeOne', codeOne);
if (codeOne && codeTwo === '') {
console.log('1');
refTwo.current.focus();
}
if (codeOne && codeTwo && codeThree === '') {
console.log('2');
refThree.current.focus();
}
}
}, 1000);
};
console.log('render codeOne', codeOne);
return (
<div className={styles.inputGroup}>
<div className={styles.inputBox}>
<input
ref={refOne}
maxLength={1}
onChange={(v: ChangeEvent<{ value: string }>) => {
setCodeData({ ...codeData, codeOne: v.target.value });
checkFocus();
}}
type="text"
placeholder={''}
/>
</div>
<div className={styles.inputBox}>
<input
ref={refTwo}
maxLength={1}
onChange={(v: ChangeEvent<{ value: string }>) => {
setCodeData({ ...codeData, codeTwo: v.target.value });
checkFocus();
}}
type="text"
placeholder={''}
/>
</div>
<div className={styles.inputBox}>
<input
ref={refThree}
maxLength={1}
onChange={(v: ChangeEvent<{ value: string }>) =>
setCodeData({ ...codeData, codeThree: v.target.value })
}
type="text"
placeholder={''}
/>
</div>
</div>
);
export default ModalPhoneBox;
字符串
1条答案
按热度按时间pdsfdshx1#
要修复此问题,可以使用useEffect钩子在状态更新后触发焦点切换。
字符串
在依赖项[codeOne,codeTwo,codeThree]中使用useEffect,这将确保checkFocus函数在状态被新值更新后被调用,并且您应该能够正确切换焦点。