防止表单在ReactJs中重置输入状态

时间:2019-04-24 22:59:24

标签: reactjs forms react-state-management

提交登录表单后,我正在针对每种情况从Api获取我的错误,并在正确的输入下显示它们。 问题是提交后登录是否成功,输入状态正在初始化,错误正在显示,但是对于用户而言,每次用户必须返回所有输入并一次又一次地填充它们时,这很烦人。

我是一个有反应的初学者,并且确实对这个问题感到困惑。 这是我现在的位置。

我的登录课程摘要:

class Login extends Component {
constructor(props) {
super(props);
this.state = {
  email: "",
  password: "",
  isLoggedIn: false,
  user: {}
 };
 this.onChange = this.onChange.bind(this);
 this.login = this.login.bind(this);
}

login(e) {
 e.preventDefault();
 this.props.login(this.state.email, this.state.password);
 }

onChange(e) {
this.setState({ [e.target.name]: e.target.value });
}

我的输入示例:

 <div className="form-group centerErrs">
                      <input
                        type="text"
                        value={this.state.email}
                        onChange={this.onChange}
                        className="form-control form-control-user"
                        placeholder="Username or Email Address"
                        autoComplete="off"
                        id="email-input"
                        name="email"
                      />
                      {this.props.errors ? (
                        <small className="form-text  red">
                          {this.props.errors.email}
                        </small>
                      ) : null}
                    </div>

我的登录功能摘要:

 var formData = new FormData();
 formData.append("email", email);
 formData.append("password", password);

   //posting to the api 
  .then(json => {
    if (json.data.success) {
      //handling the user data

      let appState = {
        isLoggedIn: true,
        user: userData
      };
      // save app state with user date in local storage
      localStorage["appState"] = JSON.stringify(appState);
      this.setState({
        isLoggedIn: appState.isLoggedIn,
        user: appState.user
      });

      //updated : here how i handle in fail case
      else {
      let appState = {
        isLoggedIn: false,
        errors: json.data
      };
      this.setState({
        isLoggedIn: appState.isLoggedIn,
        errors: appState.errors
      });
    }

更新:这是我的父组件构造函数:

    constructor(props) {
    super(props);
    this.state = {
    isLoggedIn: false,
    user: {},
    errors: {},
    };
   this.login = this.login.bind(this);
  }

更新登录容器:

   const LoginContainer = () => (
   <div>
    {!this.state.isLoggedIn ? (
      <Login login={this.login} errors={this.state.errors} />
    ) : (
      <Redirect to="/" />
    )}
   </div>
 );

以及父级中的渲染器:

 <Route exact path="/(login)" component={LoginContainer} />

我只想在表单提交失败时保持输入状态。

我将不胜感激,并感谢您。

1 个答案:

答案 0 :(得分:0)

只要LoginContainer是一个函数,而不是ReactJs Component,它将重新创建整个UI,因此您应将其转换为React.Component,并且检查Auth状态的逻辑不应位于LoginContainer内部,因为路由Login不应如果用户已登录,则不存在

{this.state.loggedin?
 [Auth routes]:
 [<Route exact path="/(login)" component={LoginContainer} />...]

P.S。最好使用全局存储来存储auth状态,例如redux或unstated或其他任何状态。