1. 原生js实现前端路由
- h5模式(history)实现:先收集,再利用pushState执行。
<div id="container">
<a href="./">首页</a>
<a href="./user">用户</a>
<a href="./home">家里</a>
</div>
<div id="content"></div>
class BaseRouter {
constructor(){
this.routes = {}
this._bindPopState()
}
route(path,func) {
this.routes[path] = func || function(){}
}
go(path) {
window.history.pushState({path}, null, path)
const func = this.routes[path]
if(func) func()
}
_bindPopState(){
window.addEventListener('popstate',e => {
console.log('popstate调用了');
const path = e.state && e.state.path
const func = this.routes[path]
if(func) func()
})
}
}
const Route = new BaseRouter()
Route.route('./',() => changeText('我在首页'))
Route.route('./user',() => changeText('我在用户页'))
Route.route('./home',() => changeText('我在家里'))
function changeText(params) {
document.getElementById('content').innerHTML = params
}
document.getElementById('container').addEventListener('click',(e)=>{
if(e.target.tagName === 'A') {
e.preventDefault()
Route.go(e.target.getAttribute('href'))
}
})
- hash模式实现:先收集,再利用hashchange实现。
<div id="container">
<a href="#">首页</a>
<a href="#user">用户</a>
<a href="#home">家里</a>
</div>
class BaseRouter {
constructor(){
this.routes = {}
this.refresh = this.refresh.bind(this)
window.addEventListener('hashchange',this.refresh)
window.addEventListener('load',this.refresh)
}
route(path,func) {
this.routes[path] = func || function(){}
}
refresh(){
const path = `/${window.location.hash.slice(1) || ''}`
this.routes[path]()
}
}
const Route = new BaseRouter()
Route.route('/',() => changeText('我在首页'))
Route.route('/user',() => changeText('我在用户页'))
Route.route('/home',() => changeText('我在家里'))
function changeText(params) {
document.getElementById('content').innerHTML = params
}