React Native Redux - 添加动态 属性 到按钮的 TextBox OnClick

React Native Redux - Add dynamic property to TextBox OnClick of button

我在我的 React Native 应用程序中使用了 native base。我还使用了 React redux。下面是我的屏幕文件的代码

handleSubmit = () => {
  // Add Logic here for adding error if email or password is empty
   //this.props.login(this.props.email, this.props.password)
   
}
<Item error={this.props.emailError}>
  <Input  placeholder='Email'
          autoCapitalize="none" 
          onChangeText={this.props.changeEmailValue}/>
</Item>
<Item error={this.props.passwordError}>
  <Input  placeholder='Password'
          autoCapitalize="none" 
          onChangeText={this.props.changePasswordValue}
          secureTextEntry />
</Item>        
<LoginButton title="Login"  onPress={this.handleSubmit}/>
...
...
const mapStateToProps = (state) => {
  return {
    email: state.user.email,
    password: state.user.password,
    isAuthenticated: state.user.isAuthenticated,
    emailError: state.user.emailError,
    passwordError: state.user.passwordError,
    loginError: state.user.error
  }
}

const mapDispatchToProps = dispatch => {
  return {
      changeEmailValue: (email) => dispatch(handleEmailChange(email)),
      changePasswordValue: (password) => dispatch( handlePasswordChange(password)),
      login: (email,password) => dispatch( login( email, password) ),
  };
};

下面是我的 reducers/user.js

代码
 case LOGIN: 
      if(action.payload.email === '' || action.payload.email === undefined){
        return {
          ...state,
          emailError: true
        }
      }
      else if (action.payload.password === '' || action.payload.password === undefined){
        return {
          ...state,
          passwordError: true
        }
      }
      else {
        return {
          ...state,
          email: action.payload.email,
          password: action.payload.password
        }
      }

在简单的登录屏幕中,如果文本框为空,那么我需要为该输入文本框添加“错误”属性。您可以在此处查看 error textbox in native base

如何设置 emailError 和 passwordError 的值?目前它只显示 emailError 或 passwordError 的错误,我想检查两者。

您可以像这样设置 Itemerror 道具:

<Item error={this.state.emailError}>
  <Input placeholder='Email'
         autoCapitalize="none" 
         onChangeText={this.props.changeEmailValue}
  />
</Item>

在您的构造函数中,将 emailError 保持为 false。然后,当您在 handleSubmit 中检查电子邮件地址是否有效时,如果您想启用这样的错误,可以将其设置为 true:

this.setState({ emailError: true });

更新:

我没有任何使用 Redux 的经验,所以我可能无法在这里为您提供最佳解决方案。但是,在你的 reducer 中的 case LOGIN: 下,只有 if-else 块中的一个会 运行,这就是为什么这里只会捕获一种类型的错误。您可以按照以下方式尝试:

case LOGIN:

  let emailError = false;
  let passwordError = false;

  if (action.payload.email === '' || action.payload.email === undefined)
    emailError = true

  if (action.payload.password === '' || action.payload.password === undefined)
    passwordError = true

  if ( emailError || passwordError ) {
    return {
      ...state,
      emailError: emailError,
      passwordError: passwordError
    }
  }
  else {
    return {
      ...state,
      email: action.payload.email,
      password: action.payload.password
    }
  }

同样,我不确定 if/how 大部分内容是否正确,但它至少可以给你一个想法。

 case LOGIN: 
      if(action.payload.email === '' || action.payload.email === undefined){

     ***`You are returning here when email blank`***

    return { 
          ...state,
          emailError: true
        }
      }
      else if (action.payload.password === '' || action.payload.password === undefined){
        return {
          ...state,
          passwordError: true
        }
      }
      else {
        return {
          ...state,
          email: action.payload.email,
          password: action.payload.password
        }
      }

您的代码应该 return 包括电子邮件和密码。

 case LOGIN: 
      let eError = false;
      let pError = false;
      if(action.payload.email === '' || action.payload.email === undefined){
         eError = true
      }
      else if (action.payload.password === '' || action.payload.password === undefined){
          pError = true
      }
      else {
        pError = false;
        pError = false;
      }
   return {
          ...state,
          emailError: eError,
          passwordError: pError,
          email: action.payload.email,
          password: action.payload.password
        }

此代码尚未执行,但肯定会起作用。