• Stars
    star
    217
  • Rank 182,446 (Top 4 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created over 6 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

πŸ“Œ An enhanced react-router-v4/5 Route that keeps route alive.

react-live-route

An enhanced version of react-router-v4 Route Component that keeps route component alive on unmatched path and restore it completely on match path.

NPM Version Build Status Coverage Status

Document

δΈ­ζ–‡

Feedback

Feel free to open an issue to ask for help or have a discussion. If there is a detailed code problem help is needed, please fork this minimal demo to provide a reproduce scenario, or your issue might be closed directly due to lack of information.

Demo

codeSandbox

You can experience and review the source code on codeSandbox.

Edit react-live-route-demo-1

QR code

You also can scan the QR code of the demo above to experience it on mobile device.

qr

Install

npm install react-live-route

or

yarn add react-live-route

About

It will hide component of route instead of unmout it when the path is not match and restore it when come back. There are a few APIs provided to control the hidden condition of component.

Example:

There is a item list page, click on the items on this page will enter the item detail page. When entering the detail page, item list page will be hidden and it will keep hidden when you are on item detail page. Once back to the list page, the list page will be restored to the last state of leaving.

Features

  • βœ… Fully compatible with react-router-v4, all passed the react-router-v4 unit tests.
  • 🎯 Completely restored to the state of the last time you left (scroll position included).
  • πŸ”’ Minimally invasive, all you need to do is import LiveRoute.
  • ✌️ Super easy API.

Hint

  • Using with , see [Use in <Switch>](#Use in <Switch>) for detail.
  • Using with code splitting, see ensureDidMount for detail.
  • If LiveRoute's parent route is unmounted on current location, then it will also be unmounted . This is determined by the top-down design principle of React. You can use LiveRoute to declares a parent route to solve this problem or stop nestting the router.
  • In some cases the DOM of LiveRoute will be modified directly and the scroll position will not change when navigation. This is not a problem with react-live-route. You can scroll the screen to the top manually and you may get some help from this article from react-router. By the way, if the scroll position will be restored by LiveRoute, it will come up after the scroll operation in componet of LiveRoute due to the render order of React.

Usage

1. Enhance Route with withRouter

The class imported from react-live-route must be wrapped by withRouter to touch the property of context to work as expected.

import NotLiveRoute from 'react-live-route'
import { withRouter } from 'react-router-dom'

const LiveRoute = withRouter(NotLiveRoute)

2. Props of LiveRoute

livePath: (string | string[])

livePath is the path you want to hide the component instead of unmount it. The specific rules of livePath are the same as path props of Route in react-router-v4. You still can use component or render props to render a component.

livePath also can accept an array of string above since 1.2.0. livePath is matched if any string in the array is matched.

LiveRoute will re-render when it come back from a path matching location from the livePath matching location. It will unmount on other unmatched locations.

Example:

The route of List will be rendered normally under /list, and it will be hidden when location change to /user/:id, and it will be unmounted normally when entering other locations.

import NotLiveRoute from 'react-live-route'
import { withRouter } from 'react-router-dom'

const LiveRoute = withRouter(NotLiveRoute)

<LiveRoute path="/list" livePath="/user/:id" component={List} />

alwaysLive: boolean

alwaysLive is just like livePath. The difference is the component will not be unmount on any other location after the it's first mount.

Example:

After the first mount on match location, the Modal page will be hidden when the path is not matched, and will re-render when path match again.

import NotLiveRoute from 'react-live-route'
import { withRouter } from 'react-router-dom'

const LiveRoute = withRouter(NotLiveRoute)

<LiveRoute path="/list" alwaysLive={true} component={Modal} />

onHide: (location, match, history, livePath, alwaysLive) => void

This hook will be triggered when LiveRoute will hide in componentWillReceiveProps stage (so it happens before re-render).

Example of usage is below.

onReappear: (location, match, history, livePath, alwaysLive) => void

This hook will be triggered when LiveRoute will reappear from hide in componentWillReceiveProps stage (so it happens before re-render).

import NotLiveRoute from 'react-live-route'
import { withRouter } from 'react-router-dom'

const LiveRoute = withRouter(NotLiveRoute)

<LiveRoute
  path="/items"
  component={List}
  livePath="/item/:id"
  name="items"
  onHide={(location, match, livePath, alwaysLive) => {
    console.log('[on hide]')
  }}
  onReappear={(location, match, livePath, alwaysLive) => {
    console.log('[on reappear]')
    console.log(routeState)
  }}
/>

forceUnmount: (location, match, history, livePath, alwaysLive) => boolean

forceUnmount is funtion that return a boolean value to decide weather to forceUnmount the LiveRoute no matter it is matched or should be kept lived.

For example: when the user id equals to 27, List page will be force unmounted while routing on other value of id will be kept.

import NotLiveRoute from 'react-live-route'
import { withRouter } from 'react-router-dom'

const LiveRoute = withRouter(NotLiveRoute)

<LiveRoute path="/list" livePath="/user/:id" component={List} forceUnmount={(location, match)=> match.params.id === 27}/>

ensureDidMount (code-splitting)

ensureDidMount is useful when using a route with react-loadable. Cause react-loadable will load the route component asynchronous. So the route component must give a hint to help react-live-route know when the real component is loaded so the DOM could be got.

const LoadableItems = Loadable({
  loader: () => import("./list"),
  loading: () => () => <p>xxx</p>
})

List item:

  componentDidMount() {
    this.props.ensureDidMount()
  }

TIPS

Use in <Switch>

There's some stuff extra to do when Using with <Switch>. If you want makes /items pathname alive, you must put a placeholder route where it should be but renders nothing. And put LiveRoute out of Switch.

(You have to do this because keep-alive break the origin <Switch> or React philosophy so we have use a placeholder route to keep the philosophy and show the real content out of .)

function App() {
  return (
    <div className="App">
      <Switch>
        <Route exact path="/" component={Home} />
        <Route path="/item/:id" component={Detail} />
        <Route path="/about" component={About} />
        <Route path="/items" /> // placeholder(required)
        <Route path="*" render={NotFound} />
      </Switch>
      <LiveRoute
        path="/items"
        component={List}
        livePath="/item/:id"
        name="items"
        onHide={routeState => {
          console.log("[on hide]");
          console.log(routeState);
        }}
        onReappear={routeState => {
          console.log("[on reappear]");
          console.log(routeState);
        }}
      />
      <Bar />
    </div>
  );
}

Licence

MIT

More Repositories

1

hexo-theme-archer

🎯 A smart and modern theme for Hexo.
SCSS
1,524
star
2

blog

πŸ“
861
star
3

vite-plugin-checker

πŸ’¬ Vite plugin that provide checks of TypeScript, ESLint, vue-tsc, Stylelint and more.
TypeScript
807
star
4

react-cloud-music

🎢 NetEase Cloud Music based on React.
TypeScript
155
star
5

vscode-antd-rush

🌈 Ant Design cheatsheet in VS Code.
TypeScript
124
star
6

react-douban-movie

Douban movie based on React
JavaScript
96
star
7

react-resume

πŸ—³ online editable resume based on React
JavaScript
25
star
8

postcss-rename-selector

πŸŒ– Rename CSS selectors effortlessly
TypeScript
7
star
9

react-mindnode

πŸ—Ίworking in progress
JavaScript
6
star
10

restricted-antd-style-demo

An example repository to show how to restrict antd global style
JavaScript
6
star
11

vite-plugin-web-components-hmr

Provides Vite HMR for web components(vanilla, Lit, Fast, List, Haunted).
JavaScript
6
star
12

redux-analysis

πŸ”¬ redux ζΊη εˆ†ζž
JavaScript
6
star
13

fullpage-resume

πŸ“œ configuration fullpage resume
JavaScript
5
star
14

rollup-plugin-fork-ts-checker

πŸš€ Rollup plugin that runs typescript type checker on a separate process.
TypeScript
5
star
15

React-decorator-HOC

πŸ“¦ a simple practice of decorator based HOC
JavaScript
2
star
16

active-detector

πŸ¦‰Detect whether browser user is still active.
TypeScript
2
star
17

hexo-theme-ares

🚧 an unfinished Hexo theme
CSS
2
star
18

archer-demo

πŸŽ‰ demo for hexo-theme-archer http://fi3ework.github.io/archer-demo
1
star
19

histor

πŸ’Ύ Save the history mutation of state.
TypeScript
1
star
20

fi3ework

1
star
21

FE-wheels

βš™οΈ front-end wheels
JavaScript
1
star
22

me

πŸ“„ README of me
1
star
23

useProState

πŸ”©Convenient way to play with `useState` hook
TypeScript
1
star
24

react-live-route-demo

πŸ₯ demo for react-live-route
JavaScript
1
star
25

baidu-ife-2016

JavaScript
1
star
26

mova

[WIP] more easy and better way to play with MobX
JavaScript
1
star
27

fgm

HTML
1
star
28

vite-ts

JavaScript
1
star
29

fi3ework.github.io

πŸ“ blog
HTML
1
star
30

10x-list

JavaScript
1
star
31

es6-promise-annotated

JavaScript
1
star