React Router 4 → 404

This is originally part of our React Router v4 course. However, it's applicable to us here as well.

A common use case for when you're building a web app is to have a "catch all" route that will be rendered if none of your other routes match. A common example of this would be a 404 page.

To see how this works with React Router v4, let's first render a navbar with the following paths - **/****/will-match****/will-not-match**, and **/also/will/not/match**.

Now that we have the navbar set up, let's create three different components to render - **Home**, which will match on **/****WillMatch** which will match on **/will-match**, and **NoMatch**, which will be the catch-all component which will render only if none of the other **Route**'s match.

Now that we have the components which are going to be rendered, we need to actually render some **Route**s. **Home** and **WillMatch** are straight forward, you just render them as you normally would.

Now the question becomes, how do we render **NoMatch**? Remember, we only want to render **NoMatch** if both the **/** and **/will-match** **Route**s don't match. There are two parts to accomplishing this - the first is that if you render a **Route** but don't specify a **path** prop, that route will always match and render the **component**. Let's do that for our **NoMatch** component.

That's closer, but if you play around with the app, you know we're not done yet. Now the app renders the **Home** and **WillMatch** components properly but it also always renders the **NoMatch** component no matter what path we're on.

What we need is a way to tell React Router v4 that we only want to render the first **Route** that matches - even if there's more than one match. By doing this, our **NoMatch** component will only get rendered if the two **Route**s above it, **/** and **/will-match** aren't matched.

The good news is React Router v4 comes with a component that does exactly this and it's called **Switch**. By wrapping your **Route**s inside of **Switch**, React Router will only render the first **Route** that matches.

Now if the user isn't at **/** or **/will-match**, the **NoMatch** component will be rendered.

You can utilize this same pattern to render a client-side 404 page if none of your other **Route**s match.

Copyright 2023 © Borja Leiva

Made within London