# [React Router](https://reactrouter.com) Popular routing library. Allows to specify a route through React components, declaring which component is to be loaded for a given URL. Key Components: - **Router**: wrap the app entry-point, usually `BrowserRouter` - **Route**: "Load this component for this URL" - **Link**: react-managed anchors that won't post back to the browser ## Routers Router Types: - *HashRouter*: `#route`, adds hashes to the URLs - *BrowserRouter*: `/route`, uses HTML5 history API to provide clean URLs - *MemoryRouter*: no URL ```js // index.js //other imports ... import { BrowserRouter as Router } from "react-router-dom"; React.render( <Router> <App /> </Router>, document.getElementById("DomID"); ) ``` ```js // Component.js import { Route, Route } from "react-router-dom"; <div> {/* match route pattern exactly, all sub-routes will be matched otherwise */} <Route path="/" exact element={<Component props={props} />} /> <Route path="/route" element={<Component props={props} />} /> ... </div> // only one child can match, similar to Route-case <Routes> <Route path="/" exact element={<Component props={props} />} /> <Route path="/route" element={<Component props={props} />} /> <Route component={PageNotFound} /> {/* matches all non-existent URLs */} </Route> ``` ### URL Parameters & Query String ```js // Given <Route path="/route/:placeholder" element={<Component props={props} />} /> // URL: app.com/route/sub-route?param=value function Component(props) { props.match.params.placeholder; // sub-route props.location.query; // { param: value } props.location.pathname; // /route/sub-route?param=value } ``` ### Redirecting ```js import { Navigate } from "react-router-dom"; // redirects to another URL on render, shouldn't be rendered on component mount but after an action <Navigate to="/route" /> <Navigate from="/old-route" to="/new-route" /> { condition && <Navigate to="/route" /> } // redirect if condition is true // or redirect manipulating the history (always in props) props.history.push("/new-route"); ``` ### Prompts ```js import { Prompt } from "react-router-dom"; // displays a prompt when the condition is true <Prompt when={condition} message="prompt message" /> ``` ## Link Clicks on a link created with React-Router will be captured by react an all the routing will happen client side. ```js import { Link } from "react-router-dom"; // TARGET: <Route path="/route/:itemId" /> <Link to="/route/1">Text</Link> // add styling attributes to the rendered element when it matches the current URL. <NavLink to="/route" exact activeClassName="class">Text</NavLink> <NavLink to="/route" activeStyle={ { cssProp: value } }>Text</NavLink> ```