You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native点击按钮需两次才触发表单校验生效如何解决?

问题原因

  • React 中 useState 是异步更新的,调用setinputError后状态不会立刻生效,同一调用栈内读取inputError拿到的还是更新前的旧值:第一次点击时传给父组件的是初始空字符串,第二次点击时才能拿到上一次校验后更新的错误值,因此需要点击两次才会生效。
  • LoginButton 内部的inputError状态属于冗余状态,没有存储必要,额外增加了状态同步负担。

修复方案

直接删除LoginButton内部的inputError状态,校验完成后直接把结果传给父组件即可,修改后的LoginButton代码如下:

const LoginButton = (props) => {
    const validateData = () => {
        if(!props.data.email && !props.data.password){
            return 'ep'
        } else if(!props.data.email){
            return 'e'
        } else if(!props.data.password){
            return 'p'
        } else {
            return ''
        }
    }

    return (
        <TouchableOpacity 
            style={styles.mainButton} 
            onPress={() => {
                const error = validateData()
                props.setValue(error)
            }}
        >
            <Text style={styles.mainButtonText}>Iniciar sesión</Text>
        </TouchableOpacity>
    )
}

可选优化

可以给Input组件增加输入时清空错误的逻辑,用户修改输入内容时自动去掉错误边框,提升交互体验:
修改父组件传入Input的setInputValue逻辑:

<Input
    placeholder={"Correo :"}
    setInputValue={value => {
        setemail(value)
        // 输入邮箱时清空邮箱相关错误
        seterror(prev => prev.replace('e', ''))
    }}
    color={error.includes("e") ? '#FA8072' : 'white'}
/>
<Input
    placeholder={"Contraseña :"}
    setInputValue={value => {
        setpassword(value)
        // 输入密码时清空密码相关错误
        seterror(prev => prev.replace('p', ''))
    }}
    color={error.includes("p") ? '#FA8072' : 'white'}
/>

内容的提问来源于stack exchange,提问作者González López David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:45:02