router模式核心原理

  <a href="#/menu" data-href="/menu">menu<a>
  <div class="targetNode"></div>

history 模式


class historyRouter{
    constructor(){
        this.currentPath = '/';
        this.router = {};
    }
    init(){
        // 首次加载
        window.addEventListener("DOMContentLoaded",this.updateView.bind(this,'/'));
        var that = this;
        window.addEventListener('click', function (ev) {
            if(ev.target.tagName.toLocaleLowerCase() === 'a' && ev.target.getAttribute('data-href')) {
                ev.preventDefault();
                var path = ev.target.getAttribute('data-href');
                // 更新url
                history.pushState({ path: path }, '', path)
                // 更新页面
                that.updateView(path)
            }
        })
        //当活动历史记录条目更改时,将触发popstate事件。
        window.addEventListener('popstate', function (ev) {
            if(ev.state){
                //事件
                var path = ev.state.path
                that.updateView(path)
            }else{
                that.updateView('/')
            }
        })
    }   
    route(path,calback){
        this.router[path] = calback;
    }
    updateView(path){
        this.currentPath = path
        this.router[this.currentPath] && this.router[this.currentPath]()
    }
}
// let route = new historyRouter();
// route.init()
// route.route("/",function(){
//     let target = document.querySelector(".targetNode");
//     target.innerHTML = 'test'
// })
// route.route("/menu",function(){
//      let target = document.querySelector(".targetNode");
//      target.innerHTML = 'test'
// })

hash 模式

function HashRouter(){
    this.currentPath = '/';
    this.router = {};
}
HashRouter.prototype = {
    init: function (){
         //DOMContentLoaded事件用于刷新页面后
         window.addEventListener('DOMContentLoaded', this.updateView.bind(this))
         window.addEventListener('hashchange', this.updateView.bind(this))
    },
    route: function(path,calback){
        this.router[path] = calback;
    },
    updateView:function(){
        this.currentPath = location.hash.substring(1) || '/',
        this.router[this.currentPath] && this.router[this.currentPath]();
    }
}
let route = new HashRouter();
route.init()
route.route("/menu",function(){
     let target = document.querySelector(".targetNode");
     target.innerHTML = 'test'
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值