博客列表 >vue学习之路(路由)

vue学习之路(路由)

培(信仰)
培(信仰)原创
2021年02月21日 16:27:35588浏览

vue学习之路(路由)

路由是什么

一句话,查找资源的一种方式

路由的分类

  • 前端路由:通过动态改变 url 实现,不会和后端服务器发生交互
  • 后端路由:资源通常放在服务器上

前端路由

  • 哈希模式:监听 url 中的#后面的内容变化/锚点
  • 历史记录:window.history对象,监听popstate事件

SPA

  • SPA:单页面应用程序
  • 目标:不刷新页面,实现 url 的变化和更新视图 / ajax

锚点的作用

学习路由之前先回忆下锚点

  1. 锚点可以改变url地址,实现在当前页面内部的不同区域之间跳转
  2. 因为是在当前页面中跳转,所以页面不会刷新
  3. 所以使用锚点可以完成SPA的两大目标:即可以改变url,又不想刷新页面
  1. <body>
  2. <nav>
  3. <a href="#list1">国内新闻</a>
  4. <a href="#list2">娱乐新闻</a>
  5. </nav>
  6. <ul id="list1">
  7. <li><a href="">I have a dream</a></li>
  8. <li><a href="">I have a dream</a></li>
  9. <li><a href="">I have a dream</a></li>
  10. </ul>
  11. <ul id="list2" style="position: relative; top: 40em">
  12. <li><a href="">娱乐新闻title</a></li>
  13. <li><a href="">娱乐新闻title</a></li>
  14. <li><a href="">娱乐新闻title</a></li>
  15. </ul>
  16. <a href="#" style="position: absolute; right: 1em; bottom: 1em">回到顶部</a>
  17. </body>

基于锚点的哈希路由模式

通过hashchange事件来监听变化

  1. <nav>
  2. <a href="#/list1">国内新闻</a>
  3. <a href="#/list2">娱乐新闻</a>
  4. </nav>
  5. <!-- 该区域专用于显示路由的内容 -->
  6. <div class="route-view"></div>
  7. <script>
  8. let list1 = `
  9. <ul id="list1">
  10. <li><a href="">I have a dream</a></li>
  11. <li><a href="">I have a dream</a></li>
  12. <li><a href="">I have a dream</a></li>
  13. </ul>
  14. `;
  15. let list2 = `
  16. <ul id="list2">
  17. <li><a href="">娱乐新闻title</a></li>
  18. <li><a href="">娱乐新闻title</a></li>
  19. <li><a href="">娱乐新闻title</a></li>
  20. </ul>
  21. `;
  22. // 获取路由的内容显示区元素
  23. const routeView = document.querySelector(".route-view");
  24. // console.log(routeView);
  25. // 锚点使用 location.hash
  26. // window.location:描述的是当前的url信息
  27. // console.log(location.hash);
  28. // hashchange:Url中的锚点变化时会自动触发这个事件
  29. window.addEventListener("hashchange", show);
  30. // window.addEventListener("load", show);
  31. // 只要dom树创建完成就触发,load:要等js执行完成和图片加载完成才触发
  32. window.addEventListener("DOMContentLoaded", show);
  33. function show() {
  34. switch (location.hash) {
  35. case "#/list1":
  36. routeView.innerHTML = list1;
  37. break;
  38. case "#/list2":
  39. routeView.innerHTML = list2;
  40. break;
  41. default:
  42. routeView.innerHTML = list1;
  43. }
  44. }
  45. </script>

vue路由原理与实现

首先要下载 vue-router

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

还可以修整下代码 将component 中的对象提出去写到变量中

  1. <!-- 加载vue框架 -->
  2. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  3. <!-- 加载路由模块 -->
  4. <script src="vue-router-dev/dist/vue-router.js"></script>
  5. <nav class="app">
  6. <!-- 1. vue 的路由是基于哈希实现,是用a标签的锚点来实现 -->
  7. <router-link to="/list1">国内新闻</router-link>
  8. <router-link to="/list2">娱乐新闻</router-link>
  9. <!-- 2. 路由到的资源显示区域 -->
  10. <router-view></router-view>
  11. </nav>
  12. <script>
  13. const list1 = {
  14. template: `
  15. <ul id="list1">
  16. <li><a href="">I have a dream</a></li>
  17. <li><a href="">I have a dream</a></li>
  18. <li><a href="">I have a dream</a></li>
  19. </ul>
  20. `,
  21. };
  22. const list2 = {
  23. template: `
  24. <ul id="list2">
  25. <li><a href="">娱乐新闻title</a></li>
  26. <li><a href="">娱乐新闻title</a></li>
  27. <li><a href="">娱乐新闻title</a></li>
  28. </ul>
  29. `,
  30. };
  31. // 1. 创建路由对象
  32. const router = new VueRouter({
  33. // 路由配置项
  34. routes: [
  35. // 每一个路由都是一个对象,每一个对象都对应着一个路由地址
  36. { path: "/list1", component: list1 },
  37. { path: "/list2", component: list2 },
  38. ],
  39. });
  40. new Vue({
  41. el: ".app",
  42. // 2. 注册路由
  43. // router: router,
  44. //属性名和同作用域属性值相同,可以只写一个
  45. router,
  46. });
  47. </script>

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

  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 id="list1">
  9. <li><a href="">I have a dream</a></li>
  10. <li><a href="">I have a dream</a></li>
  11. <li><a href="">I have a dream</a></li>
  12. </ul>
  13. `;
  14. const list2 = `
  15. <ul id="list2">
  16. <li><a href="">娱乐新闻title</a></li>
  17. <li><a href="">娱乐新闻title</a></li>
  18. <li><a href="">娱乐新闻title</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) 将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. break;
  42. case "/list2":
  43. routeView.innerHTML = list2;
  44. break;
  45. default:
  46. routeView.innerHTML = list1;
  47. }
  48. }
  49. </script>

这一波操作下来感觉官方支持的 vue-route 库更好理解

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议