【问题标题】:Redirect to Component onSubmit重定向到组件 onSubmit
【发布时间】:2020-02-10 08:22:20
【问题描述】:

提交表单后,我的 React 应用程序未重定向到仪表板页面。我尝试使用 react-router-dom 重定向功能,但仍然没有成功。然后我选择加入浏览器历史记录。 push 但还是没有成功。

对于后一个试验,URL 更改为 /dashboard 但组件仍保留在表单页面上,直到我重新加载页面后它才会移动到仪表板

表单域

<form>
  <Input
    displayValidationErrors={displayValidationErrors("fullname", validators)}
    name="fullname"
    type="text"
    label="Full Name"
    onChange={(e) => handleInputChange(e.target.name, e.target.value)}
  />
  <Input
    displayValidationErrors={displayValidationErrors("password", validators)}
    name="password"
    type="password"
    label="Password"
    onChange={(e) => handleInputChange(e.target.name, e.target.value)}
  />
  <Input
    displayValidationErrors={displayValidationErrors("password2", validators)}
    name="password2"
    type="password"
    label="Confirm Password"
    onChange={(e) => handleInputChange(e.target.name, e.target.value)}
  />
  <Input
    displayValidationErrors={displayValidationErrors("email", validators)}
    name="email"
    type="email"
    label="Email Address"
    onChange={(e) => handleInputChange(e.target.name, e.target.value)}
  />
  <Input
    displayValidationErrors={displayValidationErrors(
      "phone_number",
      validators
    )}
    name="phone_number"
    type="number"
    label="Phone Number"
    onChange={(e) => handleInputChange(e.target.name, e.target.value)}
  />
  <Input
    displayValidationErrors={displayValidationErrors("card_number", validators)}
    value={data.card_number}
    name="card_number"
    type="text"
    label="Card Number"
    onChange={(e) => handleInputChange(e.target.name, e.target.value)}
  />
  <Input
    displayValidationErrors={displayValidationErrors("date", validators)}
    value={data.date}
    name="date"
    type="text"
    label="Expiry Date"
    onChange={(e) => handleInputChange(e.target.name, e.target.value)}
  />
  <Input
    displayValidationErrors={displayValidationErrors("pin", validators)}
    name="pin"
    type="password"
    label="PIN"
    onChange={(e) => handleInputChange(e.target.name, e.target.value)}
  />
  <div className="col-lg-12 loginbttm">
    <div className=" login-btm login-button">
      <Button
        handleClick={onSubmit}
        type="submit"
        className="btn btn-primary"
        label="SUBMIT"
        disabled={!isFormValid(validators)}
      />
    </div>
  </div>
</form>;

onSubmit 函数

const onSubmit = (e) => {
  e.preventDefault();
  browserHistory.push("/dashboard");
};

按钮组件

const Button = ({ type, className, handleClick, label, disabled }) => (
  <button
    type={type}
    className={className}
    onClick={handleClick}
    disabled={disabled}
  >
    {label}
  </button>
);

我的 app.js

function App() {

  
  return (
    <Router>
      <div className="App">
        <Switch>
          <Route exact  path="/dashboard">
            <Dashboard />
          </Route>
          <Route exact path="/">
            <Form />
          </Route>
          
        </Switch>
      </div>
    </Router>
  
  );
}

export default App;

【问题讨论】:

  • 你也可以试试这个window.location = "/dashboard"

标签: javascript reactjs react-router-v4 react-router-v5


【解决方案1】:

我没有看到createBrowserHistory 或类似&lt;Router history={history}&gt; 的东西,所以我猜您使用的是默认浏览器历史记录。在这种情况下,您需要withRouter 才能使其工作:

import React from "react";
import { withRouter } from "react-router-dom";

function App() {
  const onSubmit = (e) => {
    e.preventDefault()
    this.props.history.push("/personalInfo");             
  }
  ...
}
export default withRouter(App);

更多关于withRouter解决方案here

更多关于createBrowserHistory解决方案here

对于带有 react-router V5 的功能组件,您也可以使用钩子:

import { useHistory } from "react-router-dom";

function App() {
  let history = useHistory();
  const onSubmit = (e) => {
    e.preventDefault()
    history.push('/dashboard');        
  }

  return (
    <Router>
      <div className="App">
        ...
      </div>
    </Router>
  );
}

查看this,了解更多关于useHistory的信息

【讨论】:

    【解决方案2】:

    尝试在下面使用。希望对你有帮助

    this.props.history.push({
            pathname: '/dashboard'
    })
    

    【讨论】:

    • 这意味着您的构造函数应该具有从 parent 传递的道具。构造函数(道具){超级(道具); }
    • 它是一个功能组件,所以没有构造函数
    • 尝试以下代码,如果不成功,请尝试以下网址。 github.com/ReactTraining/react-router/blob/master/packages/… 代码。
    【解决方案3】:

    使用函数组件的另一种方法-

    import {withRouter} from "react-router-dom";
    
    function SignIn({history}) {
        const submit = (event) => {
            event.preventDefault();
            history.push("/profile");
        }
        ....
    }
    
    export default withRouter(SignIn)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 2019-03-22
      • 2012-03-03
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多