Next Stop - React Router | SPA
Last updated
Last updated
React doesn't come with a built-in router, but we can easily achieve routing with the react-router-dom
library. Routing is how a web applications direct traffic.
Example: If you go to dataworld.com, you end up on my home page. If you go to dataworld.com/me, you're redirected to my about me page. If you go to dataworld.com/categories/javascript or dataworld.com/categories/css, you end up on a category listing page. The routes for these pages look something like this:
/
- root
/:page_id
- page
/categories/:category_id
- category
I'm not actually making a folder called categories
and filling it with a bunch of files like javascript.html
or css.html
, I just have one template and the router knows to direct to the proper template. Once it gets to the template, it can pull from the URL to know which variables to display - for example, JavaScript or CSS related posts.
This website also happens to be a Single Page Application (or SPA) - only one page is loaded, and every click to a new page loads some additional JSON data, but does not actually request a new resource like loading index.html
and about-me.html
would.
I'm going to show you how to set up a simple SPA in React with react-router-dom
, and pull in data dynamically through the URL. Below is the source of the completed project if you get lost along the way.
Prerequisites
Read Getting Started with React or Build a React App with Hooks if you don't know React or React Hooks yet.
Read How to Connect to an API in JavaScript if you don't know how to work with APIs at all.
Create a new React app.
Our project has two dependencies - react-router-dom
for the router, and axios
for making API calls.
or
To use react-router-dom
, we need to wrap our entire App
component in BrowserRouter
. There are two types of routers:
BrowserRouter
- makes pretty URLs like example.com/about
.
HashRouter
- makes URLs with the octothorpe
(or hashtag, if you will) that would look like example.com/#about
.
Let's use BrowserRouter
.src/index.js
Now in App.js
, we can decide on the routes we want to use and direct accordingly. We'll use Route
and Switch
for this task.
Switch
- Groups all your routes together, and ensures they take precedence from top-to-bottom.
Route
- Each individual route.
App.js
We're matching the root route (/
) to HomePage
, and dynamically matching any other page to UserPage
. I only have one route for this simple example, but you could do more like this:
This would ensure that dataworld.com/categories
would go to a page listing all categories, but dataworld.com/categories/javascript
would go to a completely different template for the individual category listing.
In order to link to a page within the SPA, we'll use Link
. If we used the traditional <a href="/route">
, it would make a completely new request and reload the page, so we have Link
to help us out.src/pages/HomePage.js
So now I'm going to my first route, the root route which is loading HomePage
, and I see the content and the link.
Our Link
is navigating to /dataworld
, which will match the /:id
parameter in Route
. In order to dynamically get the content from the URL - in this case, taniarascia
- we'll use match.params.id
from the props
.
I'm going to use that parameter to make a call to the GitHub API and retrieve my data. In this example I'll be using Hooks, so if you're not familiar with them, please read Building a CRUD App with Hooks.src/pages/UserPage.js <props.match.params.id>