Blogger Information
Blog 40
fans 0
comment 1
visits 34658
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
路由知识、基于锚点的哈希模式路由、使用vue路由模块路由、用历史记录对象实现前端路由模式
景云
Original
1051 people have browsed it

路由知识、基于锚点的哈希模式路由、使用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也是实现此目的的方式之一)
Correction status:Uncorrected

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post