Skip to content

Provides access to the last location in react + react-router (v4.x, v5.x) applications. ❀️ Using hooks? useLastLocation | πŸ’‰ Using HOC? withLastLocation

License

Notifications You must be signed in to change notification settings

hinok/react-router-last-location

Folders and files

NameName
Last commit message
Last commit date

Latest commit

2d57c67 Β· Aug 23, 2021

History

93 Commits
Jul 4, 2019
Jun 30, 2021
Jun 25, 2021
Feb 13, 2019
Jul 4, 2019
Feb 21, 2019
Jul 3, 2019
Nov 5, 2017
Feb 15, 2019
Feb 14, 2019
Jul 7, 2019
Jun 15, 2021
May 23, 2017
Mar 4, 2020
Feb 21, 2019
Aug 22, 2021
Feb 21, 2019
May 16, 2019
Jun 28, 2021

Repository files navigation

Build Status Coverage Status

react-router-last-location

  • Provides access to the last location in react + react-router (v4.x, v5.x) applications.
  • ❀️ Using hooks? If yes, useLastLocation.
  • πŸ’‰ Using HOC? - If yes, withLastLocation.
  • Handle redirects.
  • Support TypeScript
  • Useful for handling internal routing.
  • Easily keep your users inside your app.

Demo

Edit react-router-last-location

Note: Last location != Previous browser history state

This library only returns the location that was active right before the recent location change, during the lifetime of the current window.

This means, it is not equal to the "location you were at before navigating to this history state".

In other words, the location this library provides is not necessarily the same as the one when you click the browser's back button.

Example 1

  1. Visit /: last location = null, previous browser history state = null
  2. Visit /a: last location = /, previous browser history state = /
  3. Visit /b: last location = /a, previous browser history state = /a
  4. Reload (url will stay at /b): last location = null, previous browser history state = /a

Example 2

  1. Visit /: last location = null
  2. Visit /a: last location = /
  3. Visit /b: last location = /a
  4. Go back: last location = /b, previous browser history state = /

Example 3

  1. Visit /: last location = null
  2. Visit /a: last location = /
  3. Visit /b: last location = /a
  4. Visit /c: last location = /b
  5. Go back to /a (by selecting that state explicitly in "Go back" browser dropdown that is visible upon clicking it with right mouse button): last location = /c, previous browser history state = /

How to use?

# Please remember that you should have installed react, prop-types and react-router-dom packages
# npm install react prop-types react-router-dom --save

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

If you still use v1.x.x and would like to use hook useLastLocation, please upgrade to v2.x.x version (don't worry, no breaking changes).

npm install react-router-last-location@^2.0.0
# or
npm install react-router-last-location@latest

Declare <LastLocationProvider /> inside <Router />.

index.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 Home from './pages/Home';
import About from './pages/About';
import Contact from './pages/Contact';
import Logger from './components/Logger';

const App = () => (
  <Router>
    <LastLocationProvider>
      <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} />

        <hr />

        <Logger />
      </div>
    </LastLocationProvider>
  </Router>
);

render(<App />, document.getElementById('root'));

Use hook useLastLocation to get lastLocation.

./components/Logger, see example

import React from 'react';
import { useLastLocation } from 'react-router-last-location';

const Logger = () => {
  const lastLocation = useLastLocation();

  return (
    <div>
      <h2>Logger!</h2>
      <pre>
        {JSON.stringify(lastLocation)}
      </pre>
    </div>
  );
};

export default LoggerHooks;

Use HOC withLastLocation to get lastLocation prop.

./components/Logger, see example

import React from 'react';
import { withLastLocation } from 'react-router-last-location';

const Logger = ({ lastLocation }) => (
  <div>
    <h2>Logger!</h2>
    <pre>
      {JSON.stringify(lastLocation)}
    </pre>
  </div>
);

export default withLastLocation(Logger);

Use RedirectWithoutLastLocation to not store redirects as last location

import React from 'react';
import { RedirectWithoutLastLocation } from 'react-router-last-location';

const MyPage = () => (
  <RedirectWithoutLastLocation to="/" />
);

export default MyPage;

You can still use a regular <Redirect /> component from react-router.

If you do, you'll then you need to manually pass the state: { preventLastLocation: true }, like below:

import React from 'react';
import { Redirect } from 'react-router-dom';

const MyPage = () => (
  <Redirect
    to={{
      pathname: '/',
      state: { preventLastLocation: true },
    }}
  />
);

export default MyPage;

LastLocationProvider

Props

watchOnlyPathname, type: boolean, default: false

Stores the last route only when pathname has changed.

About

Provides access to the last location in react + react-router (v4.x, v5.x) applications. ❀️ Using hooks? useLastLocation | πŸ’‰ Using HOC? withLastLocation

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published