重定向到组件 onSubmit

Redirect to Component onSubmit

我的 React 应用程序在提交表单后没有重定向到仪表板页面。我尝试使用 react-router-dom Redirect 函数但仍然没有成功。然后我选择加入浏览器历史记录。 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;

尝试使用下面的方法。希望对你有帮助

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

我没有看到 createBrowserHistory<Router history={history}> 之类的内容,所以我猜您使用的是默认浏览器历史记录。在这种情况下,您需要 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 解决方案

有关 createBrowserHistory 解决方案的更多信息

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

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

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

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

function SignIn({history}) {
    const submit = (event) => {
        event.preventDefault();
        history.push("/profile");
    }
    ....
}

export default withRouter(SignIn)