前端路由机制
前端路由:在应用使用期间不会重新加载,提高用户体验,减低网速要求,界面展开快。前后端分离方便开发
目前前端路由有两种实现方法:
- 利用url的hash,当浏览器url的锚点部分发生改变,不会刷新页面的原理
- 利用h5中的history,通过监听opostate事件,利用pushstate或replacestate实现
原生router/hash版
html:
123456 | <ul> <li><a href="#/home">home</a></li> <li><a href="#/about">about</a></li></ul><div id="routerView"></div> |
js:
1234567891011121314151617 | var routerView=document.querySelector("#routerView");window.addEventListener("DOMContentLoaded",onchange);window.addEventListener("hashchange",onchange);function (){ switch(location.hash){ case "#/home": routerView.innerHTML="home"; return; case "#/about": routerView.innerHTML="about"; return; default: routerView.innerHTML=""; return; }} |
原生router/history版
html:
123456 | <ul> <li>大专栏 前端路由机制tag"><a href="/home">home</a></li> <li><a href="/about">about</a></li></ul><div id="routerView"></div> |
js:
12345678910111213141516171819202122232425 | var routerView=document.querySelector("#routerView");window.addEventListener("popstate",onchange); document.querySelectorAll("a[href]").forEach( el=> el.addEventListener("click",function(e){ e.preventDefault(); //阻止A标签默认行为 var path=el.getAttribute("href"); history.pushState(null,"",path); //@param 1)状态对象2)标题3)URL onchange(); //手动触发}))function (){ switch(location.pathname){ case "/home": routerView.innerHTML="home"; return; case "/about": routerView.innerHTML="about"; return; default: routerView.innerHTML=""; return; }} |
总结
hash:
- 利用锚点导航(改变URL中的hash不引起页面刷新)
- hashchange监听hash变化,(浏览器前后退,a标签,window.location均可触发)
history:
- history对象提供了pushState和replaceState方法,这两个方法改变URL不会引起页面刷新
- popstate事件,(浏览器前后退可触发,a标签需阻止默认,window.location需改写成history.pushState)
相关推荐
小秋 2020-11-12
lxhuang 2020-11-03
小焊猪web前端 2020-10-24
杏仁技术站 2020-10-23
南昌千网科技 2020-10-18
liduote 2020-10-16
PncLogon 2020-09-24
趣IT 2020-09-22
杏仁技术站 2020-09-18
拾光璇旅 2020-09-17
lfbooo 2020-09-09
颤抖吧腿子 2020-09-04
Herorong 2020-08-25
anaction 2020-08-17
风萧萧梦潇 2020-08-17
PncLogon 2020-08-16
franktaoge 2020-08-15
MrHaoNan 2020-07-31