博客列表 >路由的原理和实现

路由的原理和实现

手机用户1607314868
手机用户1607314868原创
2021年01月21日 00:54:54761浏览

路由

1.路由是什么?
本质就是,查找资源的方式
2.路由的分类
前端路由:通过动态改变url实现
后端路由:资源通常放在服务器上
3.前端路由
哈希模式:监听 url地址栏中 # 后面的内容变化/锚点
历史纪录:’window.history’对象,监听’popstate’事件

基于锚点的哈希路由模式
  1. <nav>
  2. <a href="#/list">国际新闻</a>
  3. <a href="#/list2">娱乐新闻</a>
  4. </nav>
  5. <div class="route-view"></div>
  6. <script>
  7. let list1=`<ul id="list1">
  8. <li><a href="">国际新闻1</a></li>
  9. <li><a href="">国际新闻1</a></li>
  10. <li><a href="">国际新闻1</a></li>
  11. </ul>`;
  12. let list2=`<ul id="list2">
  13. <li><a href="">娱乐新闻2</a></li>
  14. <li><a href="">娱乐新闻2</a></li>
  15. <li><a href="">娱乐新闻2</a></li>
  16. </ul>`;
  17. //获取路由的内容显示区元素
  18. const routeView=document.querySelector('.route-view');
  19. //锚点使用 location.hash
  20. //hashchange: url中的锚点变化时会自动触发这个事件
  21. window.addEventListener("hashchange",show);
  22. window.addEventListener("load",show);
  23. // window.addEventListener("DOMContentLoaded",show);
  24. function show(){
  25. switch(location.hash){
  26. case "#/list1":
  27. routeView.innerHTML=list1;
  28. break;
  29. case "#/list2":
  30. routeView.innerHTML=list2;
  31. break;
  32. default:
  33. routeView.innerHTML=list1;
  34. }
  35. }
  36. </script>
Vue的路由基于哈希实现,使用a标签的锚点实现
  1. <nav class="app">
  2. <!-- 1.vue的路由基于哈希实现,使用a标签的锚点来实现 -->
  3. <router-link to='/list1'>国内新闻</router-link>
  4. <router-link to='/list2'>娱乐新闻</router-link>
  5. <!-- 路由到的资源显示区域 -->
  6. <router-view></router-view>
  7. </nav>
  8. <script>
  9. //1.创建路由对象
  10. const router=new VueRouter({
  11. //路由配置项
  12. routes:[
  13. //每个路由都是一个对象,每一个对象对应者一个路由地址
  14. {
  15. path: '/list1',
  16. compontent:{
  17. template:`
  18. <ul id="list1">
  19. <li><a href="">国际新闻1</a></li>
  20. <li><a href="">国际新闻1</a></li>
  21. <li><a href="">国际新闻1</a></li>
  22. </ul> `,
  23. }
  24. },
  25. {
  26. path: '/list2',
  27. compontent:{
  28. template:`
  29. <ul id="list2">
  30. <li><a href="">娱乐新闻1</a></li>
  31. <li><a href="">娱乐新闻1</a></li>
  32. <li><a href="">娱乐新闻1</a></li>
  33. </ul> `,
  34. }
  35. },
  36. ]
  37. });
  38. //2.注册路由
  39. new Vue({
  40. router:router,
  41. }).#mount(".app");
  42. </script>
历史记录对象路由模式
  1. <nav>
  2. <a href="#/list1">国际新闻</a>
  3. <a href="#/list2">娱乐新闻</a>
  4. </nav>
  5. <div class="route-view">
  6. </div>
  7. <script>
  8. let list1=`<ul id="list1">
  9. <li><a href="">国际新闻1</a></li>
  10. <li><a href="">国际新闻1</a></li>
  11. <li><a href="">国际新闻1</a></li>
  12. </ul>`;
  13. let list2=`<ul id="list2">
  14. <li><a href="">娱乐新闻2</a></li>
  15. <li><a href="">娱乐新闻2</a></li>
  16. <li><a href="">娱乐新闻2</a></li>
  17. </ul>`;
  18. const routeView=document.querySelector(".router-view");
  19. const links=document.querySelectorAll("nav a[href]");
  20. links.forEach(link=>link.onclick=(ev)=>{
  21. //禁用a标签的挑战
  22. ev.preventDefault();
  23. //history.pushState(状态对象,标题,url)
  24. history.pushState(null,"",link,href);
  25. //手动更新了url,但popstate事件监听不到这个变化
  26. show();
  27. });
  28. window.addEventListener("popstate",show);
  29. function show(){
  30. console.log(location.pathname);
  31. switch(location.pathname){
  32. case "#/list1":
  33. routeView.innerHTML=list1;
  34. break;
  35. case "#/list2":
  36. routeView.innerHTML=list2;
  37. break;
  38. default:
  39. routeView.innerHTML=list1;
  40. }
  41. }
  42. </script>
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议