UNPKG

@hippy/vue-router

Version:

Official router for hippy-vue

81 lines (68 loc) 2.32 kB
/* * Tencent is pleased to support the open source community by making * Hippy available. * * Copyright (C) 2017-2019 THL A29 Limited, a Tencent company. * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* eslint-disable no-multi-assign */ /* eslint-disable no-underscore-dangle */ import { setVue, getVue } from '@vue/util/index'; import View from './components/view'; import Link from './components/link'; function install(Vue) { if (install.installed && getVue() === Vue) return; install.installed = true; setVue(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); 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; } export default install;