Keep the current page rendered as a fallback until the new page is loaded with React.lazy and React.Suspense. Route level code splitting in react without screen flickering (React Suspense React Router Dom React Topbar Progress Indicator)
Using npm:
npm i --save react-current-page-fallback
Using yarn:
yarn add react-current-page-fallback
import { FallbackProvider } from "react-current-page-fallback";
// Wrapp root FallbackProvider for all routes
<FallbackProvider>
your app routes here...
</FallbackProvider>
// Wrapp every page using FallbackPageWrapper
import { FallbackPageWrapper } from "react-current-page-fallback";
<FallbackPageWrapper>
your page-1 here...
</FallbackPageWrapper>
<FallbackPageWrapper>
your page-2 here...
</FallbackPageWrapper>
...
index.js
import React from "react";
import { createRoot } from "react-dom/client";
import App from "./App";
const container = document.getElementById("root");
const root = createRoot(container); // createRoot(container!) if you use TypeScript
root.render(<><App/></>);
App.js
import React from "react";
import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
import { FallbackProvider } from "react-current-page-fallback";
const Home = React.lazy(() => import("./pages/Home"));
const About = React.lazy(() => import("./pages/About"));
const Contact = React.lazy(() => import("./pages/Contact"));
// react-router-dom V6
const App = () => {
return (
<Router>
<div>
<FallbackProvider>
<Routes>
<Route path="/about" element={ <About />} />
<Route path="/contact" element={ <Contact />} />
<Route path="/" element={ <Home />} />
</Routes>
</FallbackProvider>
</div>
</Router>
);
};
export default App;
App.js
import React from "react";
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
import { FallbackProvider } from "react-current-page-fallback";
// react-router-dom V5
const App = () => {
return (
<Router>
<div>
<FallbackProvider>
<Switch>
<Route path="/about">
<About />
</Route>
<Route path="/contact">
<Contact />
</Route>
<Route path="/">
<Home />
</Route>
</Switch>
</FallbackProvider>
</div>
</Router>
);
};
export default App;
Nav.js
import React from 'react';
import { Link } from 'react-router-dom';
export const Nav = () => {
return (
<>
<Link to="/">Home</Link>
<Link to="/about">About</Link>
<Link to="/contact">Contact</Link>
</>
);
};
export default Nav;
Home.js
import React from 'react';
import { Nav } from '../components/Nav';
import { FallbackPageWrapper } from "react-current-page-fallback";
const Home = () => {
return (
<FallbackPageWrapper>
<div>
<Nav />
<h1>Home</h1>
</div>
</FallbackPageWrapper>
);
};
export default Home;
About.js
import React from 'react';
import { Nav } from '../components/Nav';
import { FallbackPageWrapper } from "react-current-page-fallback";
const About = () => {
return (
<FallbackPageWrapper>
<div>
<Nav />
<h1>About</h1>
</div>
</FallbackPageWrapper>
);
};
export default About;
Contact.js
import React from 'react';
import { Nav } from '../components/Nav';
import { FallbackPageWrapper } from "react-current-page-fallback";
const Contact = () => {
return (
<FallbackPageWrapper>
<div>
<Nav />
<h1>Contact</h1>
</div>
</FallbackPageWrapper>
);
};
export default Contact;
You can run the example by cloning the repo:
git clone https://github.com/asifvora/react-current-page-fallback.git
yarn
yarn start
This project is licensed under the MIT License - see the LICENSE
file for details.
- Github: @asifvora
- LinkedIn: @asif-vora
- Twitter: @007_dark_shadow
- Instagram: @007_dark_shadow
-
Please contribute using GitHub Flow. Create a branch, add commits, and open a pull request.
-
Please read
CONTRIBUTING
for details.
This project needs a βοΈ from you. Don't forget to leave a star βοΈ