react-router go back a page how do you configure history?

前端 未结 21 1155
说谎
说谎 2020-11-30 18:30

Can anyone please tell me how I can go back to the previous page rather than a specific route?

When using this code:

var BackButton = React.createCla         


        
相关标签:
21条回答
  • 2020-11-30 18:39

    React Router v6

    useNavigate Hook is the recommended way to go back now:

    import { useNavigate } from 'react-router-dom';
    
    function App() {
      const navigate = useNavigate();
    
      return (
        <>
          <button onClick={() => navigate(-1)}>go back</button>
          <button onClick={() => navigate(1)}>go forward</button>
        </>
      );
    }
    

    Codesandbox sample

    Go back/forward multiple history stack entries:
    <button onClick={() => navigate(-2)}>go two back</button>
    <button onClick={() => navigate(2)}>go two forward</button>
    
    Go to specific route:
    navigate("users") // go to users route, like history.push
    navigate("users", { replace: true }) // go to users route, like history.replace
    navigate("users", { state }) // go to users route, pass some state in
    

    useNavigate replaces useHistory to support upcoming React Suspense/Concurrent mode better.

    0 讨论(0)
  • 2020-11-30 18:40

    ES6 method without mixins using react-router, stateless function.

    import React from 'react'
    import { browserHistory } from 'react-router'
    
    export const Test = () => (
      <div className="">
        <button onClick={browserHistory.goBack}>Back</button>
      </div>
    )
    
    0 讨论(0)
  • 2020-11-30 18:40

    This is a working BackButton component (React 0.14):

    var React = require('react');
    var Router = require('react-router');
    
    var History = Router.History;
    
    var BackButton = React.createClass({
      mixins: [ History ],
      render: function() {
        return (
          <button className="back" onClick={this.history.goBack}>{this.props.children}</button>
        );
      }
    });
    
    module.exports = BackButton;
    

    You can off course do something like this if there is no history:

    <button className="back" onClick={goBack}>{this.props.children}</button>
    
    function goBack(e) {
      if (/* no history */) {
        e.preventDefault();
      } else {
        this.history.goBack();
      }
    }
    
    0 讨论(0)
  • 2020-11-30 18:41

    Simply use like this

    <span onClick={() => this.props.history.goBack()}>Back</span>
    
    0 讨论(0)
  • 2020-11-30 18:42

    In react-router v4.x you can use history.goBack which is equivalent to history.go(-1).

    App.js

    import React from "react";
    import { render } from "react-dom";
    import { BrowserRouter as Router, Route, Link } from "react-router-dom";
    import Home from "./Home";
    import About from "./About";
    import Contact from "./Contact";
    import Back from "./Back";
    
    const styles = {
      fontFamily: "sans-serif",
      textAlign: "left"
    };
    
    const App = () => (
      <div style={styles}>
        <Router>
          <div>
            <ul>
              <li><Link to="/">Home</Link></li>
              <li><Link to="/about">About</Link></li>
              <li><Link to="/contact">Contact</Link></li>
            </ul>
    
            <hr />
    
            <Route exact path="/" component={Home} />
            <Route path="/about" component={About} />
            <Route path="/contact" component={Contact} />
    
            <Back />{/* <----- This is component that will render Back button */}
          </div>
        </Router>
      </div>
    );
    
    render(<App />, document.getElementById("root"));
    

    Back.js

    import React from "react";
    import { withRouter } from "react-router-dom";
    
    const Back = ({ history }) => (
      <button onClick={history.goBack}>Back to previous page</button>
    );
    
    export default withRouter(Back);
    

    Demo: https://codesandbox.io/s/ywmvp95wpj

    Please remember that by using history your users can leave because history.goBack() can load a page that visitor has visited before opening your application.


    To prevent such situation as described above, I've created a simple library react-router-last-location that watch your users last location.

    Usage is very straight forward. First you need to install react-router-dom and react-router-last-location from npm.

    npm install react-router-dom react-router-last-location --save
    

    Then use LastLocationProvider as below:

    App.js

    import React from "react";
    import { render } from "react-dom";
    import { BrowserRouter as Router, Route, Link } from "react-router-dom";
    import { LastLocationProvider } from "react-router-last-location";
    //              ↑
    //              |
    //              |
    //
    //       Import provider
    //
    import Home from "./Home";
    import About from "./About";
    import Contact from "./Contact";
    import Back from "./Back";
    
    const styles = {
      fontFamily: "sans-serif",
      textAlign: "left"
    };
    
    const App = () => (
      <div style={styles}>
        <h5>Click on About to see your last location</h5>
        <Router>
          <LastLocationProvider>{/* <---- Put provider inside <Router> */}
            <div>
              <ul>
                <li><Link to="/">Home</Link></li>
                <li><Link to="/about">About</Link></li>
                <li><Link to="/contact">Contact</Link></li>
              </ul>
    
              <hr />
    
              <Route exact path="/" component={Home} />
              <Route path="/about" component={About} />
              <Route path="/contact" component={Contact} />
    
              <Back />
            </div>
          </LastLocationProvider>
        </Router>
      </div>
    );
    
    render(<App />, document.getElementById("root"));
    

    Back.js

    import React from "react";
    import { Link } from "react-router-dom";
    import { withLastLocation } from "react-router-last-location";
    //              ↑
    //              |
    //              |
    //
    //    `withLastLocation` higher order component
    //    will pass `lastLocation` to your component               
    //
    //                   |
    //                   |
    //                   ↓
    const Back = ({ lastLocation }) => (
      lastLocation && <Link to={lastLocation || '/'}>Back to previous page</Link>
    );
    
    
    //          Remember to wrap
    //   your component before exporting
    //
    //                   |
    //                   |
    //                   ↓
    export default withLastLocation(Back);
    

    Demo: https://codesandbox.io/s/727nqm99jj

    0 讨论(0)
  • 2020-11-30 18:45

    Using React Hooks

    Import:

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

    In stateless component:

    let history = useHistory();
    

    On Event

    history.goBack()
    
    0 讨论(0)
提交回复
热议问题