You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.4 KiB
52 lines
1.4 KiB
import View from './components/view' |
|
import Link from './components/link' |
|
|
|
export let _Vue |
|
|
|
export function install (Vue) { |
|
if (install.installed && _Vue === Vue) return |
|
install.installed = true |
|
|
|
_Vue = Vue |
|
|
|
const isDef = v => v !== undefined |
|
|
|
const registerInstance = (vm, callVal) => { |
|
let i = vm.$options._parentVnode |
|
if (isDef(i) && isDef(i = i.data) && isDef(i = i.registerRouteInstance)) { |
|
i(vm, callVal) |
|
} |
|
} |
|
|
|
Vue.mixin({ |
|
beforeCreate () { |
|
if (isDef(this.$options.router)) { |
|
this._routerRoot = this |
|
this._router = this.$options.router |
|
this._router.init(this) |
|
Vue.util.defineReactive(this, '_route', this._router.history.current) |
|
} else { |
|
this._routerRoot = (this.$parent && this.$parent._routerRoot) || this |
|
} |
|
registerInstance(this, this) |
|
}, |
|
destroyed () { |
|
registerInstance(this) |
|
} |
|
}) |
|
|
|
Object.defineProperty(Vue.prototype, '$router', { |
|
get () { return this._routerRoot._router } |
|
}) |
|
|
|
Object.defineProperty(Vue.prototype, '$route', { |
|
get () { return this._routerRoot._route } |
|
}) |
|
|
|
Vue.component('RouterView', View) |
|
Vue.component('RouterLink', Link) |
|
|
|
const strats = Vue.config.optionMergeStrategies |
|
// use the same hook merging strategy for route hooks |
|
strats.beforeRouteEnter = strats.beforeRouteLeave = strats.beforeRouteUpdate = strats.created |
|
}
|
|
|