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)
}
}