vue-navigation
Version:
A page navigation library, built with vue2 and vue-router2.
66 lines (58 loc) • 1.94 kB
JavaScript
import Routes from './routes'
import Navigator from './navigator'
import NavComponent from './components/Navigation'
import { genKey, isObjEqual } from './utils'
export default {
install: (Vue, { router, store, moduleName = 'navigation', keyName = 'VNK' } = {}) => {
if (!router) {
console.error('vue-navigation need options: router')
return
}
const bus = new Vue()
const navigator = Navigator(bus, store, moduleName, keyName)
// hack vue-router replace for replaceFlag
const routerReplace = router.replace.bind(router)
let replaceFlag = false
router.replace = (location, onComplete, onAbort) => {
replaceFlag = true
routerReplace(location, onComplete, onAbort)
}
// init router`s keyName
router.beforeEach((to, from, next) => {
if (!to.query[keyName]) {
const query = { ...to.query }
// go to the same route will be set the same key
if (to.path === from.path && isObjEqual(
{ ...to.query, [keyName]: null },
{ ...from.query, [keyName]: null },
) && from.query[keyName]) {
query[keyName] = from.query[keyName]
} else {
query[keyName] = genKey()
}
next({ name: to.name, params: to.params, query, replace: replaceFlag || !from.query[keyName] })
} else {
next()
}
})
// record router change
router.afterEach((to, from) => {
navigator.record(to, from, replaceFlag)
replaceFlag = false
})
Vue.component('navigation', NavComponent(keyName))
Vue.navigation = Vue.prototype.$navigation = {
on: (event, callback) => {
bus.$on(event, callback)
},
once: (event, callback) => {
bus.$once(event, callback)
},
off: (event, callback) => {
bus.$off(event, callback)
},
getRoutes: () => Routes.slice(),
cleanRoutes: () => navigator.reset()
}
}
}