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

  • 需要一个类将路由信息保存起来
  • 初始化路由信息:
    • 判断打开的界面有没有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】初始化路由信息)