BOM对象;tips:为啥在这罗列下BOM,因为下面实现的两种路由模式中用到location、history中的属性和方法
window对象,JS顶层对象,其他的BOM对象都是window对象的属性;
document对象,文档对象;
location对象,浏览器当前URL信息;
navigator对象,浏览器本身信息;
screen对象,客户端屏幕信息;
history对象,浏览器访问历史信息;
前端路由实现原理
基础路由
class BaseRouter { constructor(list){ this.list = list } render(state){ //要么找到路由对应的组件,要么配置的 * 代表404页面组件 let ele = this.list.find( item => item.path === state ); ele = ele ? ele : this.find( item => item.path === '*') //ELEMENT:就当成 let zjy = document.getElementById('zjy')这种DOM ELEMENT.innerText = ele.component } }
hash模式
class HashRouter extends BaseRouter { constructor(list){ super(list) //history模式同理 //初次加载配置跟路由的页面组件 this.handler() //添加监听,加载组件页面 window.addEventListener('hashchange',()=>{ this.handler() },false) } handler(){ this.render(this.getState()) } getState(){ const hash = location.hash return hash ? hash.splice('1') : '/' } push(path){ location.hash = path } getUrl(path){ const href = location.href const index = href.indexOf('#') const base = index >= 0 ? href.splice(index) : href return `${base}#${path}` } replace(path){ location.replace(this.getUrl(path)) } go(n){ history.go(n) } }
history模式
class HistoryRouter extends BaseRouter { constructor(list){ super(list) this.handler() window.addEventListener('popstate',()=>{ this.handler() },false) } handler(){ this.render(this.getState()) } getState(){ const path = location.pathname return path ? path : '/' } push(path){ history.pushState(null,null,path) this.handler() } replace(path){ history.replaceState(null,null,path) this.handler() } go(n){ history.go(n) } }