Javascript 禁用touchableopacity,直到验证为真
我试图禁用我的提交按钮,直到电子邮件和密码匹配我的验证参数,我可以对一个输入字段执行此操作,但是,我似乎无法对多个文本输入执行相同的操作,我尝试过的所有操作都不起作用,因为我甚至尝试在componentDidMount中执行此操作。下面是我目前拥有的一个粗略的示例代码Javascript 禁用touchableopacity,直到验证为真,javascript,reactjs,react-native,Javascript,Reactjs,React Native,我试图禁用我的提交按钮,直到电子邮件和密码匹配我的验证参数,我可以对一个输入字段执行此操作,但是,我似乎无法对多个文本输入执行相同的操作,我尝试过的所有操作都不起作用,因为我甚至尝试在componentDidMount中执行此操作。下面是我目前拥有的一个粗略的示例代码 class Login extends Component { constructor(props) { super(props); this.s
class Login extends Component {
constructor(props) {
super(props);
this.state = {
showpass: true,
email: '',
password: '',
validEmail: true,
validPassword: true,
disabled: true,
};
}
onChangeEmail(email) {
const emailCheckRegex = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
this.setState({ email });
if (emailCheckRegex.test(email)) {
console.log('Email is Correct');
this.setState({
validEmail: true, disabled: false,
});
} else if (!emailCheckRegex.test(email)) {
console.log('Email is not Correct');
this.setState({
validEmail: false, disabled: true,
});
}
}
onChangePassword(password) {
this.setState({ password });
if (password.length > 5) {
//Password has to be at least 5 characters long
this.setState({
validPassword: true,
});
} else if (password.length <= 5) {
this.setState({
validPassword: false,
});
}
}
render() {
const { showpass, email, password, validEmail, validPassword, disabled } = this.state;
const opacityStyle = disabled ? 0.2 : 1;
return (
<View style={styles.inputWrapper}>
<Text style={styles.loginTextStyle}>Email</Text>
<View style={validEmail ? styles.inputCon : styles.inputConError}>
<TextInput
placeholderTextColor='#343845'
style={styles.inputField}
onChangeText={this.onChangeEmail.bind(this)}
value={email}
keyboardType='email-address'
autoCorrect={false}
// placeholder={placeholder}
underlineColorAndroid="transparent"
/>
</View>
</View>
<View style={styles.inputWrapper}>
<Text style={styles.loginTextStyle}>Password</Text>
<View style={validPassword ? styles.inputCon : styles.inputConError}>
<TextInput
placeholderTextColor='#343845'
style={styles.inputField}
onChangeText={this.onChangePassword.bind(this)}
value={password}
keyboardType='email-address'
autoCorrect={false}
// placeholder={placeholder}
secureTextEntry={showpass}
underlineColorAndroid="transparent"
returnKeyType='done'
/>
</View>
<TouchableOpacity
style={[{ opacity: opacityStyle }, styles.btnStyle]}
disabled={disabled}
>
<Text style={styles.loginStyle}>Login</Text>
</TouchableOpacity>
类登录扩展组件{
建造师(道具){
超级(道具);
此.state={
showpass:是的,
电子邮件:“”,
密码:“”,
瓦利德梅尔:没错,
有效密码:对,
残疾人:对,,
};
}
onChangeEmail(电子邮件){
const-emailCheckRegex=/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
this.setState({email});
如果(emailCheckRegex.test(电子邮件)){
console.log(“电子邮件正确”);
这是我的国家({
validEmail:true,disabled:false,
});
}如果(!emailCheckRegex.test(电子邮件)){
console.log(“电子邮件不正确”);
这是我的国家({
validEmail:false,disabled:true,
});
}
}
onChangePassword(密码){
this.setState({password});
如果(password.length>5){
//密码长度必须至少为5个字符
这是我的国家({
有效密码:对,
});
}else if(password.length
这就是您的意思吗?您的ValidMail和validPassword处于状态,其默认值应为false,如下所示:
constructor(props) {
super(props);
this.state = {
showpass: true,
email: '',
password: '',
validEmail: false,
validPassword: false,
};
}
然后,您可以使用它们来保持提交禁用状态,直到两者都被验证为有效
// ...
<TouchableOpacity
style={[{ opacity: opacityStyle }, styles.btnStyle]}
disabled={!this.state.validEmail || !this.state.validPassword}
>
// remaining code
/。。。
//剩余代码
您不需要在状态中禁用
希望它有帮助您不需要多个函数来验证输入,只需要一个函数来处理输入更改,另一个用于验证
disabled: false, // set disable to false by default
handleInput = (name, value) => {
this.setState(
{
[name]: value,
},
this.validateInput
);
};
validateInput = () => {
const emailCheckRegex = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
const validEmail = emailCheckRegex.test(this.state.email);
const validPassword =
(this.state.password && this.state.password.length > 5) || false;
this.setState({
validEmail: validEmail,
disabled: (validEmail && validPassword) || false,
validPassword: validPassword,
});
};
const opacityStyle = disabled ? 1 : 0.2; // change opacity logic
<TouchableOpacity
style={[{ opacity: opacityStyle }, styles.btnStyle]}
disabled={!disabled}> {/* change here as well */}
<Text style={styles.loginStyle}>Login</Text>
</TouchableOpacity>
disabled:false,//默认设置disable为false
handleInput=(名称、值)=>{
这是我的国家(
{
[名称]:值,
},
这是validateInput
);
};
validateInput=()=>{
const-emailCheckRegex=/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
const validEmail=emailCheckRegex.test(this.state.email);
常量有效密码=
(this.state.password&&this.state.password.length>5)| false;
这是我的国家({
validEmail:validEmail,
已禁用:(ValidMail&&validPassword)| | false,
validPassword:validPassword,
});
};
const opacityStyle=disabled?1:0.2;//更改不透明度逻辑
{/*也在这里更改*/}
登录
是的,但不是当它为空时,而是当它不包含电子邮件和5个字符或更多的密码时,按钮仍处于禁用状态。您可以帮助重新查看它吗?禁用设置为true,您不更新它,您是如何实现它的?我已更新了上面的代码它不工作,但是ton仍然处于禁用状态。你能帮我再次查看它吗?你能输入你的TextInput吗?是的,我可以输入我的TextInput,而且我正在使用react native,我想我不能使用它生成沙盒代码段。你的密码长度应该是6才能启用按钮。你能验证一下,this.state.validEmail和的值是多少吗键入有效值时是否使用this.state.validPassword?
disabled: false, // set disable to false by default
handleInput = (name, value) => {
this.setState(
{
[name]: value,
},
this.validateInput
);
};
validateInput = () => {
const emailCheckRegex = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
const validEmail = emailCheckRegex.test(this.state.email);
const validPassword =
(this.state.password && this.state.password.length > 5) || false;
this.setState({
validEmail: validEmail,
disabled: (validEmail && validPassword) || false,
validPassword: validPassword,
});
};
const opacityStyle = disabled ? 1 : 0.2; // change opacity logic
<TouchableOpacity
style={[{ opacity: opacityStyle }, styles.btnStyle]}
disabled={!disabled}> {/* change here as well */}
<Text style={styles.loginStyle}>Login</Text>
</TouchableOpacity>