• 实现手写简单VueRouter源码


    要求

    1. 必须有一个install方法,供Vue.use调用
    2. 实现hash变化,响应式数据自动更新
    	let Vue;
    	class VueRouter{
    		constructor(options){
    			this.$options = options;
    			this.routeMap = {};//缓存route 和 path 的映射关系
    			this.$options.routes.forEach(route=>{
    				this.routeMap[route.path] = route
    			})
    			const initial = window.location.hash.slice(1) || '/';
    			//实现current 响应式,发生变化更新所有引用current的渲染
    			Vue.util.defineReactive(this,'current',initial)
    			//监听hash变化
    			window.addEventListener('hashchange',()=>{
    				//使用箭头函数,this指向不变
    				this.current  = window.location.hash.slice(1)
    			})
    			//每次重新进入页面时执行
    			window.addEventListener('load',()=>{
    				this.current = window.location.hash.slice(1)
    			})
    		}
    	}
    	VueRouter.install = function(_Vue){
    		Vue = _Vue;
    		//使用混入 延迟执行到router创建完毕才执行
    		Vue.mixin({
    			//每个vue组件实例化都会执行一遍
    			beforeCreate(){
    				if(this.$options.router){
    					//只有main.js 根组件实例化时才会有router选项
    					Vue.prototype.$router = this.$options.router
    				}
    			}
    		})
    		Vue.component('router-link',{
    			props:{
    				to:{
    				type:String,
    				required:true
    				}
    			},
    			render(h){
    				return h('a',{attrs:{href:'#'+this.to}},this.$slots.default)
    			}
    		})
    		Vue.component('router-view',{
    			render(h){
    				let {routeMap,current} = this.$router;
    				let component = routeMap[current]?routeMap[current].component:null;
    				return h(component)
    			}
    		})
    	}
    	export default VueRouter
    
  • 相关阅读:
    刚装的vs无法运行正确的程序
    选择正确的C/C++ runtime library
    【转】how can i build fast
    【转】关于增量链接(incremental linking)
    VS升级后的配置问题
    获得system32等系统文件权限
    Java Web总结二十三发送邮件
    Java Web总结二十二投票系统
    Java Web总结二十一Listener监听器
    Java Web总结二十Filter、装饰设计模式
  • 原文地址:https://www.cnblogs.com/angfl/p/13785663.html
Copyright © 2020-2023  润新知