react-page-routes
Version:
Simplify coding your react-router-dom <Routes/> and <NavLinks/> by using attributes in your component.
124 lines (91 loc) • 2.94 kB
Markdown
# react-page-routes
Simplify coding your `react-router-dom` `<Routes/>` and `<NavLinks/>` by using attributes in your component.
## How it works
You provide page components containing `title` and `path` attributes, and pass them to the package as an array. The package will map the pages to a React-Router component and handle setup for both react router-routes and react-router links.
## Setup
### Install
```shell
npm install react-page-routes
```
Install react-router-dom and prepare a context provider in a parent component:
```shell
npm install react-router-dom
```
```javascript
// index.tsx
import { BrowserRouter } from "react-router-dom";
ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
<BrowserRouter>
<App />
</BrowserRouter>
);
```
### 1. Create Page Components
Add both `path` and `title` attributes to all of your Page Components.
```javascript
Shop.path = '/shop'
Shop.title = 'Shop Now!'
export default function Shop() {
return <h1>Shop Now Page</h1>
}
```
The `path` will be provided to `<Route path={}>` in the `Pages` component and `<NavLink to={}>` in the `NavBar` component.
The `title` will be provided to `<NavLink>{title}</Navlink>` in the `NavBar` component
### 2. Create a directory index of all pages
1. Create `Directory.ts` file.
2. Import the `directory` function.
3. Import all of your page components
4. Invoke the `directory` function, passing all of your page components as props.
5. `export default` the results
```javascript
// Directory.ts
import { routes } from 'react-page-routes'
import Home from './Pages/Home'
import Shop from './Pages/Shop'
export default routes(
Home,
Shop,
// <- add in any additional Page Components here.
)
```
### 3. Use in your App
1. Import the `Directory.ts` file from step 2
2. Use the `Navbar` for handling `<NavLinks/>`
3. Use `Pages` for handling react-router `<Routes/>`
```javascript
// App.tsx
import { Directory } from './Directory'
function App() {
return (
<div>
<Directory.NavBar />
<Directory.Pages />
</div>
)
}
```
### 4. Customize with a Mapper Function (Optional)
```javascript
// App.tsx
import { Directory } from './Directory'
const MyCustomPagesMapper = (E) => (
<Route element={<E />} path={'path' in E ? String(E.path) : ''} key={String(E.name)} />
)
const MyCustomNavBarMapper = (E) => (
<NavLink key={E.path.toString()} to={E.path.toString()}>
{E.title}
</NavLink>
)
function App() {
return (
<div>
<Directory.NavBar map={MyCustomNavBarMapper} />
<Directory.Pages map={MyCustomPagesMapper} />
</div>
)
}
```
### Done
Thanks for trying out this package.
Additional questions/ideas/suggestions/contributions are welcome.
Visit the [github repository issues page](https://github.com/Jonathan-Dobson/react-page-routes/issues), please select relevant [Labels](https://github.com/Jonathan-Dobson/react-page-routes/labels)