@acrool/react-router-hash
Version:
Hash Route + History Route Additional based for React Router v7
170 lines (125 loc) • 5.24 kB
Markdown
# Acrool React Router Hash
<a href="https://acrool-react-router-hash.pages.dev/" title="Acrool React Router Hash - Hash Route + History Route Additional based for React Router v7">
<img src="https://raw.githubusercontent.com/acrool/acrool-react-router-hash/main/example/public/og.webp" alt="Acrool React Router Hash Logo"/>
</a>
<p align="center">
Hash Route + History Route Additional based for React Router v7
</p>
<div align="center">
[](https://www.npmjs.com/package/@acrool/react-router-hash)
[](https://github.com/acrool/@acrool/react-router-hash/blob/main/LICENSE)
[](https://github.com/acrool/react-router-hash/blob/main/LICENSE)
[](https://www.npmjs.com/package/@acrool/react-router-hash)
[](https://www.npmjs.com/package/@acrool/react-router-hash)
</div>
> with react-router-dom version 7.x
`^4.0.0 support react-router-dom >=7.0.0`, `react >=18.0.0 <20.0.0`
`^3.2.0 support react-router-dom 6.x`, `react >=18.0.0 <20.0.0`
## Features
- With react-router-dom version 7.x
- In CSR, it is easy to implement the light box routing function
- Supports both JSX mode and object mode route definitions
- Modified and enhanced HashRouter function by react-router-dom, supports path params
- Extract the shared optical box to the router to separate dependencies
- With [@acrool/react-modal](https://github.com/acrool/acrool-react-modal) to support persistent lightbox
## Install
```bash
yarn add @acrool/react-router-hash
```
## Usage
### JSX Mode
```tsx
import {BrowserRouter as Router, Route, Routes} from 'react-router-dom';
import {HashRoute, HashRoutes, useHashParams, useHashPathname} from '@acrool/react-router-hash';
const MainRouter = () => {
return <Router>
{/* Base pathname */}
<Routes>
<Route path="/" element={<Dashboard/>}/>
<Route path="*" element={<NotFound/>}/>
</Routes>
{/* Hash pathname */}
<HashRoutes>
<HashRoute path="login" element={<Login/>}/>
<HashRoute path="control/*" element={<EditLayout/>}>
<HashRoute path="editAccount/:id" element={<EditAccount/>}/>
<HashRoute path="editPassword" element={<EditPassword/>}/>
</HashRoute>
</HashRoutes>
</Router>;
};
```
### Object Mode
```tsx
import {BrowserRouter as Router, Route, Routes} from 'react-router-dom';
import {HashRoutes} from '@acrool/react-router-hash';
const MainRouter = () => {
return <Router>
{/* Base pathname */}
<Routes>
<Route path="/" element={<Dashboard/>}/>
<Route path="*" element={<NotFound/>}/>
</Routes>
{/* Hash pathname — object mode */}
<HashRoutes routes={[
{path: 'login', element: <Login/>},
{
path: 'control/*',
element: <EditLayout/>,
children: [
{path: 'editAccount/:id', element: <EditAccount/>},
{path: 'editPassword', element: <EditPassword/>},
],
},
]}/>
</Router>;
};
```
### Hook Mode
```tsx
import {useHashRoutes} from '@acrool/react-router-hash';
const HashRouter = () => {
return useHashRoutes([
{path: 'login', element: <Login/>},
{
path: 'control/*',
element: <EditLayout/>,
children: [
{path: 'editAccount/:id', element: <EditAccount/>},
{path: 'editPassword', element: <EditPassword/>},
],
},
]);
};
```
### Navigate & Hooks
```tsx
import {useNavigate} from 'react-router-dom';
import {useHashParams, useHashPathname} from '@acrool/react-router-hash';
const Dashboard = () => {
const navigate = useNavigate();
return <div>
<h2>Dashboard</h2>
<button type="button" onClick={() => navigate({hash: '/control/editAccount/1'})}>
EditAccount HashModal
</button>
<button type="button" onClick={() => navigate({hash: '/control/editPassword'})}>
EditPassword HashModal
</button>
</div>;
};
const EditAccount = () => {
const {id} = useHashParams<{id: string}>();
const navigate = useNavigate();
const pathname = useHashPathname();
return <>
<p>hash pathname: {pathname}</p>
<p>useHashParams id: {id}</p>
<button type="button" onClick={() => navigate({hash: undefined})}>Close HashModal</button>
</>;
};
```
There is also a example that you can play with it:
[](https://acrool-react-router-hash.pages.dev)
## License
MIT © [Acrool](https://github.com/acrool) & [Imagine](https://github.com/imagine10255)