React websites are Single Page Applications (SPAs). They usually consist of a single index.html and some .js files.
In a html only website, if you wanted multiple pages you'd have a folder structure like this:
website/
index.html
about.html
animals/
dogs.html
cats.htmlWith a React SPA you have something like this:
website/
index.html
index.jsBut what if you also want an /about, /animals/dogs and animals/cat page like the other example?
We can use react-router.
react-router-dom is a library you can use to make your Single Page React website appear to have multiple urls.
react-router-dom provides components to help with this problem. <Router>, <Switch> and <Route>.
Here is you setup the example from above:
() => {
return <Router>
<Switch>
<Route path="/animals/dog">
<Dog />
</Route>
<Route path="/animals/cat">
<Cat />
</Route>
<Route path="/about">
<About />
</Route>
<Route path="/">
<Home />
</Route>
</Switch>
</Router>
}
To link to another page in your react website you can use react-router-dom's <Link> component e.g.:
<Link to="/about">About</Link>
These links do not reload your entire website like <a href="/about">About</a> would.
This means once your initial react site is loaded, it never reloads even as the user clicks on links to navigate around, this is very fast!
If you host your site on https://example.com and a user tries to visit: https://example.com/animals/dog you want their browser to actually load https://example.com/index.html, which will invoke react-router-dom and show them your <Dog> component.
This is not the default behavior of most hosting solutions / web servers.
It varies depending on how you're hosting your site, but it can usually be fixed by having a 'rewrite rule' which tells your web server to always serve: https://example.com/index.html no matter which path your user goes to.
So Google: React SPA rewrite rule <your tool here>
Examples:
React SPA rewrite rule nginxReact SPA rewrite rule netlifyReact SPA rewrite rule firebaseAnd someone on the internet will have already come up with a guide to help you ;)