Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/altipla-consulting/hermes
[GERRIT] Advanced Vue router that improves the lifecycle callbacks.
https://github.com/altipla-consulting/hermes
javascript router vue
Last synced: about 1 month ago
JSON representation
[GERRIT] Advanced Vue router that improves the lifecycle callbacks.
- Host: GitHub
- URL: https://github.com/altipla-consulting/hermes
- Owner: altipla-consulting
- Created: 2019-06-22T23:06:53.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2021-08-15T00:00:05.000Z (over 3 years ago)
- Last Synced: 2024-04-16T00:19:35.130Z (9 months ago)
- Topics: javascript, router, vue
- Language: TypeScript
- Homepage: https://altipla-hermes.netlify.app/
- Size: 357 KB
- Stars: 0
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
---
## Install
```shell
npm i @altipla/hermes
```## Differences with `vue-router`
Things we improve:
- New lifecycle method `navigate()` that can return a Promise. The router will wait for that promise to be resolved before loading the view.
- Can enable a route when the `navigate` method fails to load an error screen.
- Hooks after a view is really loaded, after `navigate` finishes.
- There is a single hook `navigate()` called every time the view is loaded, even if it's the same. No more separate `beforeRouteEnter` and `beforeRouteUpdate` with the same implementation copy pasted in different functions.Things that remain the same:
- Same names for the components (`` and ``)
- Parameters and catch-all (aka not found) views the same as `vue-router`.
- It has the same `this.route` and `this.router` objects to control the routing though individual methods and properties may vary. They aren't prefixed by `$` though.Things not implemented in this repo:
- No nested router views.
- No lazy loading of components.
- No global hooks.## Usage example
In the [src/demo](demo) folder there is a complete working example. The main part of the code is the registration of this plugin in the [src/demo/demo.js](src/demo/demo.js) file:
```js
import { createApp } from 'vue'import Hermes from '@altipla/hermes'
import routes from './demo/routes'
import AppLayout from './demo/AppLayout.vue'let app = createApp(AppLayout)
app.use(Hermes, { routes })
app.mount('#app')
````The routes file should by convention export the whole list of URLs registered in the application:
```js
import Home from './views/Home.vue'
import Simple from './views/Simple.vue'
import Params from './views/Params.vue'
import Search from './views/Search.vue'
import Reload from './views/Reload.vue'
import ThrowError from './views/ThrowError.vue'
import Delayed from './views/Delayed.vue'
import Error from './views/Error.vue'
import NotFound from './views/NotFound.vue'export default [
{ path: '/', component: Home },
{ path: '/simple', component: Simple },
{ path: '/params/:foo', component: Params },
{ path: '/search', component: Search },
{ path: '/reload', component: Reload },
{ path: '/throw-error', component: ThrowError },
{ path: '/delayed', component: Delayed },
{ path: '[error]', component: Error },
{ path: '*', component: NotFound },
]
````Finally the view is the same as in `vue-router`, use a component:
```vue
Simple View
Back: Home View
export default {
async navigate() {
await myService.LoadAnything();
},
}```
## Things you can do with this lib
#### Route params
```js
export default [
{ path: '/params/:foo', component: Params },
]
``````vue
Params View
{{route.params}}
Back: Home View
export default {
}```
#### Programmatic navigation
```js
this.router.navigate('/myroute');
````#### Composition API
```js
import { useRouter, useRoute } from '@altipla/hermes'export default {
setup() {
let router = useRouter()
let route = useRoute()...
},
}
```#### Search parameters
If you access `/search?foo=bar` this view will show `bar` inside the paragraph:
```js
export default [
{ path: '/search', component: Search },
]
``````vue
Search View
{{route.search}}
Back: Home View
export default {
}```