3

这有点奇怪,我想深入了解它。

我有一个页面,用户在其中输入他们的电子邮件地址并单击一个按钮,然后显示“您已注册!” 消息 - 简单。

为此,我有两条路线。主要路线和“签约”路线。

  <Route name="app" path="/" handler={Main}>
    <Route name="signed-up" path="signed-up" handler={SignedUp} />
    <DefaultRoute handler={Signup} />
  </Route>

在第一页,当用户输入电子邮件地址并单击按钮时,我触发 POST AJAX 以将电子邮件地址保存在我的后端数据库(使用 Axios 包)中,完成后,我转到“注册”路线.

  handleSubmit() {
    var router = this.context.router;
    var email  = this.refs.email.getDOMNode().value;
    this.refs.email.getDOMNode().value = '';

    helpers.postSignupEmail(email).then((response) => {
      // then display the signed up page
      router.transitionTo("signed-up");
    });
  }

现在,当我第一次输入页面的 URL 时

http://localhost:1338

浏览器(Chrome、FireFox、Safari)似乎都将 URL 更改为

http://localhost:1338/#/

很公平。在 FireFox 中,我输入一封电子邮件并单击提交按钮,一切正常并带我到

http://localhost:1338/#/signed-up

但是,现在在 Chrome 上,当我单击提交时,它不会更改路线。事实上,在开发者控制台上,我看到了一个错误。

在此处输入图像描述

首先,为什么“post”请求被取消了?其次,发生这种情况时,Chrome 没有响应。所以我刷新了页面,然后我得到了 Chrome 的“海军屏死机”..

在此处输入图像描述

现在,有趣的是,如果我将初始 URL 更改为

http://localhost:1338/?#/

(在哈希前面插入问号),然后在 Chrome 上一切正常。所以,这让我想知道这与我的路由路径或参数有关。

有任何想法吗?

4

1 回答 1

15

几个小时前刚遇到这个问题。

所以你的组件中有类似的东西(es6语法):

render() {
    return (
        <form onSubmit={ this.submit.bind(this) }>
            { /* inputs stuff here */ }
        </form>
    );
}

submit() {
    // Ajax request here
}

问题是 Chrome 尝试发送一个 get 请求,并将 a 附加?到您当前的 URL,因为您的表单标签中没有任何action="/formsubmit"内容,并且默认情况下它认为它是 a method="get"。因此 Chrome 采用当前 URL(例如myapp.com/#/)并尝试在 处发送表单myapp.com/?#/,这是一个新 URL。

为了防止这种情况,只需在提交表单时添加 preventDefault

submit(e) {
    e.preventDefault()
    // Ajax request here
}
于 2015-09-14T17:49:47.320 回答