实现一个简版的vue-router

一、先用vue-router实现一个简单的路由示例

1、安装vue-router
npm install vue-router --save
2、创建router文件夹,在文件夹下新建index.js文件
import Vue from "vue";
import VueRouter from "vue-router";
import Home from "../components/Home.vue";
import About from "../components/About.vue";
Vue.use(VueRouter)
const routes = [{
        path: '/',
        name: 'home',
        component: Home
    },
    {
        path: '/about',
        name: 'about',
        component: About
    }
]
//创建VueRouter实例
const router = new VueRouter({
    mode: 'history',
    routes
})
export default router
3、在根组件上添加实例
import router from "./router";

new Vue({
  router,
  render: h => h(App),
}).$mount('#app')
4、在app.vue里引用router-link
<router-link to="/">Home</router-link>
<router-link to="/about">About</router-link>
<router-view></router-view>
5、创建Home和About组件并启动服务

二、实现简版的KVueRouter

1、新建krouter文件夹,并将router下的js复制到当前文件夹下,修改如下代码
import Vue from "vue";
//引用将要实现的KVueRouter
import KVueRouter from "./kvue-router";
import Home from "../components/Home.vue";
import About from "../components/About.vue";
//安装插件
Vue.use(KVueRouter)
let routes = [{
    path: '/',
    component: Home
}, {
    path: '/about',
    component: About
}];
//KVueRouter实例
const router = new KVueRouter({
    mode: 'history',
    routes
})
export default router
2、修改main.js
//在根组件上添加实例KVueRouter
import router from "./krouter";

new Vue({
  router,
  render: h => h(App),
}).$mount('#app')
3、在krouter下新建kvue-router.js,实现KVueRouter类和install方法
//引用构造函数,KVueRouter中要使用
let Vue;
//KVueRouter类
class KVueRouter {
    constructor(options) {
        this.$options = options
    }   
}

KVueRouter.install = function (_Vue) {
    //引用构造函数,KVueRouter中要使用
    Vue = _Vue;
    // 全局混入, 将$router放到Vue.prototype上,
    // 因为main.js是这样引用的
    // new Vue({
    //     router,
    //     render: h => h(App),
    // }).$mount('#app')
    Vue.mixin({
        beforeCreate() {
            //只有根组件才有trouter
            if (this.$options.router) {
                Vue.prototype.$router = this.$options.router
            }
        }
    })}
export default KVueRouter
4、在install方法下创建router-link组件和router-view组件(也可以放在单独的js中然后引用)
   Vue.component('router-link', {
   //传入to属性 <router-link to="/">Home</router-link>
        props: {
            to: {
                type: String,
                required: true
            }
        },
        render(h) {
            //h(tag,data,children)
            //渲染成a标签,并指定href属性
            //this.$slots.default 通过匿名插槽的方式,取到
            //<router-link to="/">Home</router-link>中的Home
            return h('a', {
                attrs: {
                    href: '#' + this.to
                }
            }, this.$slots.default)
        }
    })
  Vue.component('router-view', {
        render(h) {
        //暂时不渲染
            return h(null);
        }
    });
5、监控url变化,定义响应式的current属性,监听onHashChange事件
class KVueRouter {
    constructor(options) {
        this.$options = options
        const initial = window.location.hash.slice(1) || '/'
        //current应该是响应式的
        Vue.util.defineReactive(this, 'current', initial)
        //监听url的hash变化
        window.addEventListener('hashchange', this.onHashChange.bind(this))
        window.addEventListener('load', this.onHashChange.bind(this))
        this.routeMap = {};
        options.routes.forEach(route => {
            this.routeMap[route.path] = route.component
        })
    }
    onHashChange() {
        this.current = window.location.hash.slice(1)
    }
}
6、创建路由表映射,供router-view组件使用
this.routeMap = {};
        options.routes.forEach(route => {
        this.routeMap[route.path] = route
     })
7、渲染router-view组件
Vue.component('router-view', {
        render(h) {
            const {
                routeMap,
                current
            } = this.$router;
            let component = routeMap[current].component || null;
            return h(component);
        }
    });

三、贴上全部代码

1、kvue-router

let Vue;
class KVueRouter {
    constructor(options) {
        this.$options = options
        const initial = window.location.hash.slice(1) || '/'
        //current应该是响应式的
        Vue.util.defineReactive(this, 'current', initial)
        window.addEventListener('hashchange', this.onHashChange.bind(this))
        window.addEventListener('load', this.onHashChange.bind(this))
        this.routeMap = {};
        options.routes.forEach(route => {
            this.routeMap[route.path] = route
        })
    }
    onHashChange() {
        this.current = window.location.hash.slice(1)
        console.log(this.current);
    }
}

KVueRouter.install = function (_Vue) {
    Vue = _Vue;
    Vue.mixin({
        beforeCreate() {
            if (this.$options.router) {
                Vue.prototype.$router = this.$options.router
            }
        }
    })
    Vue.component('router-link', {
        props: {
            to: {
                type: String,
                required: true
            }
        },
        render(h) {
            //h(tag,data,children)
            return h('a', {
                attrs: {
                    href: '#' + this.to
                }
            }, this.$slots.default)
        }
    })
    Vue.component('router-view', {
        render(h) {
            const {
                routeMap,
                current
            } = this.$router;
            let m = routeMap[current].component || null;
            return h(m);
        }
    });
}
export default KVueRouter
2、index.js
import Vue from "vue";
import KVueRouter from "./kvue-router";
import Home from "../components/Home.vue";
import About from "../components/About.vue";
Vue.use(KVueRouter)
let routes = [{
    path: '/',
    component: Home
}, {
    path: '/about',
    component: About
}];
const router = new KVueRouter({
    mode: 'history',
    routes
})
export default router
3、main.js
import Vue from 'vue'
import App from './App.vue'
import router from "./krouter";
Vue.config.productionTip = false

new Vue({
  router,
  render: h => h(App),
}).$mount('#app')
4、app.vue
<template>
  <div id="app">
    <router-link to="/">Home</router-link>
    <router-link to="/about">About</router-link>
    <router-view></router-view>
  </div>
</template>

<script>
export default {};
</script>

<style>
#app {
  font-family: "Avenir", Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

在这里插入图片描述

以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值