【问题标题】:Prevent form from resetting inputs states in ReactJs防止表单在 ReactJs 中重置输入状态
【发布时间】:2019-09-14 07:38:04
【问题描述】:

提交登录表单后,我会从 Api 获取针对每个特定案例的错误,并在正确的输入下显示它们。 问题是提交后登录是否成功,输入状态正在初始化,错误正在显示,但是每次用户必须返回所有输入并一次又一次地重新填充它们,这非常烦人。

我是 React 的初学者,我真的被这个问题所困扰。 这就是我现在的位置。

我的登录类的片段:

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} />

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

我将感谢任何形式的帮助,并提前感谢您。

【问题讨论】:

  • 能否分享一下父组件sn-p和处理响应错误的代码
  • @AnasBakro 我已经更新了我的问题
  • 如果您可以发布一个显示更多代码的 js fiddle 会有所帮助
  • 在失败的情况下是否可以不更新isLoggedIn,因为默认是false,所以不需要更新它,你可以分享parent的渲染方法吗?
  • @AnasBakro 我再次更新了问题希望这可能会有所帮助

标签: reactjs forms react-state-management


【解决方案1】:

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

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

附:最好使用全局存储来存储身份验证状态,如 redux 或 unstated 或任何其他。

【讨论】:

  • 当我开始使用 react 时,我不确定是否要实现 redux,现在看来我需要这样做,感谢您的回复,这非常有帮助。
  • 不客气,我觉得还是先不说比较好,看看这篇小文章:medium.com/react-native-training/…
  • 嗯,我已经开始使用 redux,我发现它非常易于理解和逻辑。再次感谢您:D
猜你喜欢
  • 2018-08-03
  • 2017-03-07
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 2021-04-10
  • 2020-03-11
  • 2018-08-11
相关资源
最近更新 更多