博客列表 >路由知识、基于锚点的哈希模式路由、使用vue路由模块路由、用历史记录对象实现前端路由模式

路由知识、基于锚点的哈希模式路由、使用vue路由模块路由、用历史记录对象实现前端路由模式

景云
景云原创
2021年04月28日 10:05:511047浏览

路由知识、基于锚点的哈希模式路由、使用vue路由模块路由

1.路由是什么

简单来说就是查找资源的方式。


2.路由的分类

  • 前端路由: 通过动态改变 url 实现
  • 后端路由: 资源通常放在服务器上

3.前端路由

3.1 哈希模式: 监听 url 中的#后面的内容变化(锚点)

3.1.1 锚点的作用

  1. 1. 锚点可以改变Url地址,实现在当前页面内部的不同区域之间进行跳转
  2. 2. 锚点是在当前页面中跳转,所以页面不会刷新
  3. 3. 使用锚点可以完成SPA的二大目标:既改变URL地址,又不刷新页面

3.1.2 基于锚点的哈希路由模式路由

  1. <nav>
  2. <a href="#/list1">国际新闻</a>
  3. <a href="#/list2">娱乐新闻</a>
  4. </nav>x
  5. <!-- 该区域专用于显示路由的内容 -->
  6. <div class="route-view"></div>
  7. <script>
  8. let list1 = `
  9. <ul>
  10. <li>news-list1-1</li>
  11. <li>news-list1-2</li>
  12. <li>news-list1-3</li>
  13. </ul>
  14. `;
  15. let list2 = `
  16. <ul>
  17. <li>news-list2-1</a></li>
  18. <li>news-list2-2</a></li>
  19. <li>news-list2-3</a></li>
  20. </ul>
  21. `;
  22. // 获取路由的内容显示区元素
  23. const routeView = document.querySelector(".route-view");
  24. //添加锚点触发事件
  25. window.addEventListener("hashchange", show);
  26. //页面加载后初始化显示的数据
  27. // window.addEventListener("load", show);//方式一
  28. window.addEventListener("DOMContentLoaded", show);//方式二
  29. //两者之间区别:DOMContentLoaded: 只要dom树创建完成就会触发;load:要等js执行完成和图片加载完成才触发
  30. function show() {
  31. console.log(location.hash);
  32. switch (location.hash) {
  33. case "#/list1":
  34. routeView.innerHTML = list1;
  35. return;
  36. case "#/list2":
  37. routeView.innerHTML = list2;
  38. return;
  39. default:
  40. routeView.innerHTML = list1;
  41. }
  42. }
  43. </script>

3.1.23 使用vue路由模块的路由

vue的路由是基于哈希实现,是用a标签的锚点来实现

  1. <!-- 加载vue框架 -->
  2. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  3. <!-- 路由模块(下载地址:https://github.com/vuejs/vue-router) -->
  4. <script src="vue-router-dev/dist/vue-router.js"></script>
  5. <nav class="app">
  6. <router-link to="/list1">国内新闻</router-link>
  7. <router-link to="/list2">娱乐新闻</router-link>
  8. <!-- 路由到的资源显示区域 -->
  9. <router-view></router-view>
  10. </nav>
  11. <script>
  12. const list1 = {
  13. template: `
  14. <ul>
  15. <li>news-list1-1</li>
  16. <li>news-list1-2</li>
  17. <li>news-list1-3</li>
  18. </ul>
  19. `,
  20. };
  21. const list2 = {
  22. template: `
  23. <ul>
  24. <li>news-list2-1</a></li>
  25. <li>news-list2-2</a></li>
  26. <li>news-list2-3</a></li>
  27. </ul>
  28. `,
  29. };
  30. // 1. 创建路由对象
  31. const router = new VueRouter({
  32. // 路由配置项
  33. routes: [
  34. // 每一个路由都是一个对象,每一个对象对应着一个路由地址
  35. { path: "/list1", component: list1 },
  36. { path: "/list2", component: list2 },
  37. ],
  38. });
  39. new Vue({
  40. el: ".app",
  41. // 2. 注册路由
  42. router: router,
  43. });
  44. </script>

锚点使用 location.hash; window.location: 描述的是当前的url信息; hashchange: url中的锚点变化时会自动触发这个事件

3.2 历史记录: window.history对象,监听popstate事件

3.2.1 用历史记录对象实现前端路由模式

  1. <nav>
  2. <a href="/list1">国际新闻</a>
  3. <a href="/list2">娱乐新闻</a>
  4. </nav>
  5. <div class="router-view"></div>
  6. <script>
  7. const list1 = `
  8. <ul>
  9. <li>news-list1-1</li>
  10. <li>news-list1-2</li>
  11. <li>news-list1-3</li>
  12. </ul>
  13. `;
  14. const list2 = `
  15. <ul>
  16. <li>news-list2-1</a></li>
  17. <li>news-list2-2</a></li>
  18. <li>news-list2-3</a></li>
  19. </ul>
  20. `;
  21. const routeView = document.querySelector(".router-view");
  22. // 获取到所有a标签的href
  23. const links = document.querySelectorAll("nav a[href]");
  24. links.forEach(
  25. (link) =>
  26. (link.onclick = (ev) => {
  27. // 禁用掉a标签的默认行为
  28. ev.preventDefault();
  29. // history.pushState(状态对象,标题,url) 设置浏览器地址
  30. history.pushState(null, "", link.href);
  31. // 手动更新了url,但是popstate事件监听不到这个变化,需要调用一个函数
  32. show();
  33. })
  34. );
  35. window.addEventListener("popstate", show);//监听浏览器地址变化
  36. function show() {
  37. console.log(location.pathname);
  38. switch (location.pathname) {
  39. case "/list1":
  40. routeView.innerHTML = list1;
  41. return;
  42. case "/list2":
  43. routeView.innerHTML = list2;
  44. return;
  45. default:
  46. routeView.innerHTML = list1;
  47. }
  48. }
  49. </script>

4. SPA

  • SPA: 单页面应用程序
  • 目的: 不刷新页面,实现 url 的变化和更新视图(如ajax也是实现此目的的方式之一)
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议