ReactJS与React路由器 - Chrome上的奇怪路由行为

eri*_*bae 2 javascript reactjs axios

这有点奇怪,我想深究它.

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

为此,我有两条路线.主要路线和"注册"路线.

  <Route name="app" path="/" handler={Main}>
    <Route name="signed-up" path="signed-up" handler={SignedUp} />
    <DefaultRoute handler={Signup} />
  </Route>
Run Code Online (Sandbox Code Playgroud)

在第一页上,当用户输入电子邮件地址并单击按钮时,我会激活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");
    });
  }
Run Code Online (Sandbox Code Playgroud)

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

http://localhost:1338
Run Code Online (Sandbox Code Playgroud)

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

http://localhost:1338/#/
Run Code Online (Sandbox Code Playgroud)

很公平.在FireFox中,我输入一封电子邮件,然后点击提交按钮,一切正常并带我去

http://localhost:1338/#/signed-up
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

首先,为什么"帖子"请求被取消了?其次,当发生这种情况时,Chrome无响应.所以我刷新了页面,然后我得到了Chrome的"海军死亡屏幕".

在此输入图像描述

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

http://localhost:1338/?#/
Run Code Online (Sandbox Code Playgroud)

(在哈希前插入问号),然后Chrome上的工作正常.所以,它让我想知道它与我的路径路径或参数有关.

有任何想法吗?

mar*_*pie 11

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

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

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

submit() {
    // Ajax request here
}
Run Code Online (Sandbox Code Playgroud)

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

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

submit(e) {
    e.preventDefault()
    // Ajax request here
}
Run Code Online (Sandbox Code Playgroud)