uav-router
Version:
Simple hash-based routing for single page apps
153 lines (89 loc) • 4.33 kB
Markdown
# uav-router
`uav-router` is a simple routing solution for single page apps. It was designed to complement [uav](https://uav.js.org), but can work just as well with any view library.
Unlike many routers, `uav-router` uses the hash fragment of the URL as a key-value store to instantiate your app state, doing away with the faux directory hierarchy implemented by most routing solutions. For example, if a traditional URL looks like `website.com/users/userId`, then `uav-router` would use `website.com#user=userId`.
By definition all single page apps serve the same file regardless of the URL. Reflecting this reality in application routing leads to nontrivial complexity savings. `uav-router` is 700 bytes gzipped.
## Example
```javascript
import router from 'uav-router';
import login from './components/login';
import userProfile from './components/profile';
import homepage from './components/homepage';
/**
* This is the entry point to the application.
* When the URL changes, this function will be called
* with the new URL parameters.
*/
function app(params) {
/**
* Here we can use any arbitrary logic to render
* a view based on the current URL parameters,
* or other state information.
*/
if (!document.cookie) {
login();
} else if (params.user) {
userProfile(params.user);
} else {
homepage(params);
}
}
/**
* Register the entry point with the router,
* and perform the first render.
*/
router.init(app);
```
`uav-router` can also be accessed at `window.uav.router`.
## Reading the URL
You can access the current URL parameters at `router.params`.
## Navigation
`uav-router` provides five methods for changing the URL. When a method is called on the `router` object, it will change the URL *and* re-render the UI. When a method is called on the `router.url` object, it will only change the URL, *without* rendering the UI.
### `set(params)`
`router.set(params)`
Update the URL to match the given params, *and* re-render the app.
`router.url.set(params)`
Update the URL to match the given params, *without* re-rendering the app.
### `merge(params)`
`router.merge(params)`
Merge the given params into the current URL, *and* re-render the app.
`router.url.merge(params)`
Merge the given params into the current URL, *without* re-rendering the app.
### `remove(params)`
`router.remove(params)`
Remove the given params from the current URL, *and* re-render the app.
`router.url.remove(params)`
Remove the given params from the current URL, *without* re-rendering the app.
### `replace(params)`
`router.replace(params)`
Replace the current URL without adding a browser history entry, *and* re-render the app.
`router.url.replace(params)`
Replace the current URL without adding a browser history entry, *without* re-rendering the app.
### `mergeReplace(params)`
`router.mergeReplace(params)`
Merge the given params into the current URL without adding a browser history entry, *and* re-render the app.
`router.url.mergeReplace(params)`
Merge the given params into the current URL without adding a browser history entry, *without* re-rendering the app.
### `removeReplace(params)`
`router.removeReplace(params)`
Remove the given params from the current URL without adding a browser history entry, *and* re-render the app.
`router.url.removeReplace(params)`
Remove the given params from the current URL without adding a browser history entry, *without* re-rendering the app.
---
All of the above methods accept either an object or a serialized string. For example:
```javascript
router.set({
view: 'details',
itemId: '123'
});
```
is equivalent to:
```javascript
router.set('view=details&itemId=123');
```
## Reloading
It's occasionally necessary to re-run the app entry function without changing anything in the URL (usually after some other app state has changed, such as credential expiry). This can be done by calling `router.load()`.
## Prevent Navigation
If you need to run some logic in order to determine whether navigation should be allowed, set `router.canNavigate` to a function that returns a truthy or falsy value. This function will be passed a callback to retry the navigation.
`router.canNavigate = retry => myRoutingCheck(retry);`
# Browser support
Modern browsers and IE10+