【问题标题】:Prevent react-router transition without prompt在没有提示的情况下防止 react-router 转换
【发布时间】:2019-05-20 11:18:57
【问题描述】:

如果表单无效,我想阻止 react-router 转换离开表单。 Using a prompt 这样做并不令人满意,因为我想完全阻止用户导航到新路线,直到表单有效(而提示似乎总是为用户提供继续的选项),并且会喜欢在我的页面上显示错误消息而不是侵入性提示。

如何在没有提示的情况下阻止这种转换?

我的表格:

    <form>
      <div>
        <label>Name: </label>
        <input
          type="text"
          name="name"
          id="name"
          onChange={this.handleChange}
          autoComplete="name"
        />
      </div>
      <div>
        <label>Email: </label>
        <input
          type="text"
          name="email"
          id="email"
          onChange={this.handleChange}
          autoComplete="email"
        />
      </div>
      <div>
        <label>Password: </label>
        <input
          type="password"
          name="password"
          id="password"
          onChange={this.handleChange}
          autoComplete="new-password"
        />
      </div>
      <br />
      <div>

        <!-- HERE IS THE LINK I WANT TO DISABLE IN CASE OF INVALID FORM -->

        <Link when={this.state.formIsValid} to="/F2">
          <button
            onClick={() => {
              if (this.formIsValid()) {
                this.props.updatePurchaseRecord({
                  name: this.state.name,
                  email: this.state.email,
                  password: this.state.password,
                  purchase_id: this.props.purchase_id
                });
              }
            }}
          >
            Next
          </button>
        </Link>
      </div>
    </form> 

单击“下一步”按钮后运行的我的 formIsValid 函数:

  formIsValid() {
    let isValid = true;
    let formErrors = { name: "", email: "", password: "" };
    // validate name
    if (this.state.name === "") {
      isValid = false;
      formErrors.name = "Name is required";
    }

    // validate email
    if (this.state.email === "") {
      isValid = false;
      formErrors.email = "Email is required";
    }

    // validate password
    if (this.state.password === "") {
      isValid = false;
      formErrors.password = "Password is required";
    }
    this.setState({ formErrors });
    return isValid;
  }

【问题讨论】:

标签: reactjs react-router


【解决方案1】:

如果表单无效,为什么不只呈现按钮的禁用版本?例如:

formIsValid ? <RealButton /> : <DisabledButton />

【讨论】:

  • 这是否允许我在单击按钮后执行验证?在用户尝试单击按钮之前,我不想显示我的错误消息,以免它们看起来为时过早。
  • 我想我可以验证按钮的 onMouseOver 事件。
  • 您可以创建第二个单击处理程序来处理禁用按钮的单击。或者,您可以在用户点击离开输入字段时验证onBlur
  • 如果用户可以通过 12 种方式离开页面并且我想防止将页面留在一个地方,该怎么办?我实际上想展示我自己的模式,而不是浏览器,最好是......并包括刷新页面、后退按钮等。
猜你喜欢
  • 1970-01-01
  • 2020-11-02
  • 2015-01-02
  • 2018-07-01
  • 2015-05-30
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
相关资源
最近更新 更多