Blogger Information
Blog 32
fans 0
comment 0
visits 22265
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
vue学习之路(路由)
培(信仰)
Original
600 people have browsed it

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 库更好理解

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

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