Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 禁用touchableopacity,直到验证为真_Javascript_Reactjs_React Native - Fatal编程技术网

Javascript 禁用touchableopacity,直到验证为真

Javascript 禁用touchableopacity,直到验证为真,javascript,reactjs,react-native,Javascript,Reactjs,React Native,我试图禁用我的提交按钮,直到电子邮件和密码匹配我的验证参数,我可以对一个输入字段执行此操作,但是,我似乎无法对多个文本输入执行相同的操作,我尝试过的所有操作都不起作用,因为我甚至尝试在componentDidMount中执行此操作。下面是我目前拥有的一个粗略的示例代码 class Login extends Component { constructor(props) { super(props); this.s

我试图禁用我的提交按钮,直到电子邮件和密码匹配我的验证参数,我可以对一个输入字段执行此操作,但是,我似乎无法对多个文本输入执行相同的操作,我尝试过的所有操作都不起作用,因为我甚至尝试在componentDidMount中执行此操作。下面是我目前拥有的一个粗略的示例代码

        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>