美文网首页
03.【手写vue-router】初始化路由信息

03.【手写vue-router】初始化路由信息

作者: 章音十 | 来源:发表于2020-04-27 13:17 被阅读0次
    • 需要一个类将路由信息保存起来
    • 初始化路由信息:
      • 判断打开的界面有没有hash,没有就跳转到#/
      • 页面加载完成后和hash发生变化后都要保存当前地址
      • 判断打开的界面有没有路径, 如果没有就跳转到/
      • 加载完成之后和history发生变化之后都需要保存当前的地址
    class myRouteInfo {
        constructor(){
            this.currentPath = null;
        }
    }
    class myRouter {
        constructor(options){
            this.mode = options.mode || 'hash';
            this.routes = options.routes || [];
            // 提取路由信息
            /*
            {
                '/home': Home,
                '/about': About
            }
            * */
            this.routesMap = this.createRoutesMap();
            // console.log(this.routesMap);
            this.routeInfo = new myRouteInfo();
            // 初始化默认的路由信息
            this.initDefault();
        }
        initDefault(){
            if(this.mode === 'hash'){
                // 1.判断打开的界面有没有hash, 如果没有就跳转到#/
                if(!location.hash){
                    location.hash = '/';
                }
                // 2.加载完成之后和hash发生变化之后都需要保存当前的地址
                window.addEventListener('load', ()=>{
                    this.routeInfo.currentPath = location.hash.slice(1);
                });
                window.addEventListener('hashchange', ()=>{
                    this.routeInfo.currentPath = location.hash.slice(1);
                    console.log(this.routeInfo);
                });
            }else{
                // 1.判断打开的界面有没有路径, 如果没有就跳转到/
                if(!location.pathname){
                    location.pathname = '/';
                }
                // 2.加载完成之后和history发生变化之后都需要保存当前的地址
                window.addEventListener('load', ()=>{
                    this.routeInfo.currentPath = location.pathname;
                });
                window.addEventListener('popstate', ()=>{
                    this.routeInfo.currentPath = location.pathname;
                    console.log(this.routeInfo);
                });
            }
        }
        createRoutesMap(){
            return  this.routes.reduce((map, route)=>{
                map[route.path] = route.component;
                return map;
            }, {})
        }
    }
    myRouter.install = (Vue, options)=>{
    
    }
    export default myRouter;
    

    相关文章

      网友评论

          本文标题:03.【手写vue-router】初始化路由信息

          本文链接:https://www.haomeiwen.com/subject/txeywhtx.html