为啥要按两下才能做我想做的事?反应原生

Posted

技术标签:

【中文标题】为啥要按两下才能做我想做的事?反应原生【英文标题】:Why it takes two presses to do what i want? React Native为什么要按两下才能做我想做的事?反应原生 【发布时间】:2021-12-21 15:42:27 【问题描述】:

我有一个输入,它将其值传递给其父级上的 useState。 该值被传递给其他组件(自定义按钮)。 在那里,输入数据得到验证并在另一个 useState 中返回父级,如果有错误并且 (“e” = 电子邮件错误,“p” = 密码错误,“ep” = 电子邮件和密码错误) 然后根据该响应设置输入的边框颜色,如果有错误则变为红色,否则变为白色。

但它只在我第二次按下按钮时才起作用(一切都应该开始)

求助!??????

const LoginScreen = () => 
    const [email, setemail] = useState('');
    const [password, setpassword] = useState('');
    const [error, seterror] = useState('');

    return (
        <View style=styles.container>

                    <Input
                        placeholder="Correo :"
                        setInputValue=value => setemail(value)
                        color=
                            error.includes("e") ? '#FA8072' : 'white'
                        
                    />
                    <Input
                        placeholder="Contraseña :"
                        setInputValue=value => setpassword(value)
                        color=
                            error.includes("p") ? '#FA8072' : 'white'
                        
                    />
                  
                    <LoginButton data=email: email, password: password setValue=value => seterror(value)/>

        </View>
    )

==========================================

输入组件

const Input = (props) => 
    return (
        <View style=styles.container>
            <Text style=styles.placeholder>props.placeholder</Text>
            <TextInput
                style=[styles.input, borderColor: props.color]
                onChangeText=(value) => props.setInputValue(value)
            />
        </View>
    )

==========================================

按钮组件

const LoginButton = (props) => 
    const [inputError, setinputError] = useState('')

    let validateData = () => 
        if(!props.data.email && !props.data.password)
            setinputError('ep')
        
        else if(!props.data.email)
            setinputError('e')
        
        else if(!props.data.password)
            setinputError('p')
        
        else 
            setinputError('')
        
    

    return (
        <TouchableOpacity style=styles.mainButton onPress=() => validateData(); props.setValue(inputError)>
            <Text style=styles.mainButtonText>Iniciar sesión</Text>
        </TouchableOpacity>
    )

【问题讨论】:

【参考方案1】:

因为您尝试更改状态两次。实际上,您不需要使用状态来在 LoginButton 组件中传递值。请尝试直接调用。

const LoginButton = (props) => 

    let validateData = () => 
        if(!props.data.email && !props.data.password)
            props.setValue("ep");
        
        else if(!props.data.email)
            props.setValue('e');
        
        else if(!props.data.password)
            props.setValue('p');
        
        else 
            props.setValue('');
        
    

    return (
        <TouchableOpacity style=styles.mainButton onPress=() => validateData()>
            <Text style=styles.mainButtonText>Iniciar sesión</Text>
        </TouchableOpacity>
    )

【讨论】:

以上是关于为啥要按两下才能做我想做的事?反应原生的主要内容,如果未能解决你的问题,请参考以下文章

Firefox侧栏书签打不开

为啥 iOS 会显示警告“此应用程序需要由开发人员更新才能在此版本的 iOS 上运行”。对于我的反应原生应用程序?

闪屏反应原生

显示启动画面或加载指示器,直到所有图像都准备好 |世博会|反应原生

一个真正有能力的人

按两列排序,为啥不先分组呢?