reactjs 如何在React函数中获取更新状态数据

4nkexdtk  于 12个月前  发布在  React
关注(0)|答案(1)|浏览(91)

当用户在<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;

字符串

pdsfdshx

pdsfdshx1#

要修复此问题,可以使用useEffect钩子在状态更新后触发焦点切换。

useEffect(() => {
    checkFocus();
}, [codeOne, codeTwo, codeThree]);

字符串
在依赖项[codeOne,codeTwo,codeThree]中使用useEffect,这将确保checkFocus函数在状态被新值更新后被调用,并且您应该能够正确切换焦点。

相关问题