1. Vue Router简介与安装

1.1 Vue Router简介

  Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,构建单页面应用。

  Vue Router支持3种路由模式:

    ◊ hash:使用URL hash值作为路由,HTML5 History API出现之前,前端路由都通过hash来实现。hash实现需要在URL中加上#,Web服务不会解析hash,自动忽略#后面的内容,JavaScript通过window.location.hash读取解析。

    ◊ history:依赖HTML5 History API和服务器配置

    ◊ abstract:支持所有JavaScript运行环境,如node服务器端。如果发现没有浏览器的API,路由就会强制进入该模式。

  vue-router提供两个指令标签组件来处理这个导航与自动渲染逻辑:

    ◊ <router-view>:渲染路径匹配到的组件视图

    ◊ <router-link>:支持用户在具有路由功能的应用中导航

1.2 Vue Router安装

  Vue Router官方网址:https://github.com/vuejs/vue-router

  Vue Router文档教程:https://router.vuejs.org/zh/

  npm安装VueRouter:

  1. npm install vue-router

2. 起步示例

2.1 单个html页面中使用

  1. <!DOCTYPE html>
  2. <html>
  3.  
  4. <head>
  5. <meta charset="utf-8">
  6. <meta name="viewport" content="width=device-width,initial-scale=1.0">
  7. <title>libing.vue</title>
  8. <script src="node_modules/vue/dist/vue.min.js"></script>
  9. <script src="node_modules/vue-router/dist/vue-router.min.js"></script>
  10. </head>
  11.  
  12. <body>
  13. <div id="app">
  14. <ul>
  15. <li>
  16. <router-link to="/home">Home</router-link>
  17. </li>
  18. <li>
  19. <router-link to="/about">About</router-link>
  20. </li>
  21. </ul>
  22. <router-view></router-view>
  23. </div>
  24.  
  25. <template id="home">
  26. <div>Home</div>
  27. </template>
  28. <template id="about">
  29. <div>About</div>
  30. </template>
  31.  
  32. <script>
  33. var home = Vue.extend({
  34. template: "#home"
  35. });
  36. var about = Vue.extend({
  37. template: "#about"
  38. });
  39.  
  40. const routes = [{
  41. path: '/home',
  42. component: home
  43. },{
  44. path: '/about',
  45. component: about
  46. }
  47. ];
  48.  
  49. const router = new VueRouter({
  50. routes: routes
  51. });
  52.  
  53. const app = new Vue({
  54. router
  55. }).$mount('#app');
  56. </script>
  57. </body>
  58.  
  59. </html>

Index.html

2.2 vue-cli中模块化使用

  (1)创建基于vue-cli项目

  1. $ vue init webpack libing.vue

  (2)/src/views中新建Home.vue及About.vue

  1. <template>
  2. <div>{{ title }}</div>
  3. </template>
  4.  
  5. <script>
  6. export default {
  7. data: function() {
  8. return {
  9. title: "主页"
  10. };
  11. }
  12. };
  13. </script>

Home.vue

  1. <template>
  2. <div>{{ title }}</div>
  3. </template>
  4.  
  5. <script>
  6. export default {
  7. data: function() {
  8. return {
  9. title: "关于"
  10. };
  11. }
  12. };
  13. </script>

About.vue

  (3)/src/route/index.js

  1. import Vue from 'vue'
  2. import Router from 'vue-router'
  3. import Home from '@/views/Home'
  4. import About from '@/views/About'
  5.  
  6. Vue.use(Router)
  7.  
  8. export default new Router({
  9. routes: [{
  10. path: '/',
  11. name: 'home',
  12. component: Home
  13. },
  14. {
  15. path: '/home',
  16. name: 'home',
  17. component: Home
  18. },
  19. {
  20. path: '/about',
  21. name: 'about',
  22. component: About
  23. }
  24. ]
  25. })

  (4)/src/App.vue

  1. <template>
  2. <div id="app">
  3. <ul>
  4. <li>
  5. <router-link to="/home">Home</router-link>
  6. </li>
  7. <li>
  8. <router-link to="/about">About</router-link>
  9. </li>
  10. </ul>
  11. <router-view/>
  12. </div>
  13. </template>
  14.  
  15. <script>
  16. export default {
  17. name: "App"
  18. };
  19. </script>

  在router-link通过名称引用路由:向to属性传入一个对象显式的声明路由的名称。

  1. <router-link :to="{ name: 'home' }">Home</router-link>

注:在/src/route/index.js中配置路由路径时,创建Router 对象new Router({}),如果不配置 mode,就会使用默认的 hash 模式,该模式下会将路径格式化为 #! 开头。

设置 mode: "history" 将使用 HTML5 history 模式,该模式下没有 # 前缀,而且可以使用 pushState 和 replaceState 来管理记录。

  1. import Vue from 'vue'
  2. import Router from 'vue-router'
  3. import Home from '@/views/Home'
  4. import About from '@/views/About'
  5.  
  6. Vue.use(Router)
  7.  
  8. export default new Router({
  9. mode: 'history',
  10. routes: [{
  11. path: '/',
  12. name: 'home',
  13. component: Home
  14. },
  15. {
  16. path: '/home',
  17. name: 'home',
  18. component: Home
  19. },
  20. {
  21. path: '/about',
  22. name: 'about',
  23. component: About
  24. }
  25. ]
  26. })

3. 动态路由匹配

  在 vue-router 的路由路径中使用“动态路径参数”(dynamic segment) ,动态部分 以 : 开头。

  /src/router/index.js

  1. import Vue from 'vue'
  2. import Router from 'vue-router'
  3. import Home from '@/views/Home'
  4. import About from '@/views/About'
  5. import User from '@/views/User'
  6.  
  7. Vue.use(Router)
  8.  
  9. export default new Router({
  10. mode: 'history',
  11. routes: [{
  12. path: '/',
  13. component: Home
  14. },
  15. {
  16. path: '/home',
  17. component: Home
  18. },
  19. {
  20. path: '/about',
  21. component: About
  22. },
  23. {
  24. // 动态路径参数 以冒号开头
  25. path: '/user/:id',
  26. component: User
  27. }
  28. ]
  29. })

  User.vue:

  1. <template>
  2. <div>User ID:{{ $route.params.id }}</div>
  3. </template>
  1. <template>
  2. <div>User ID:{{ id }}</div>
  3. </template>
  4. <script>
  5. export default {
  6. data() {
  7. return {
  8. id: this.$route.params.id
  9. };
  10. }
  11. };
  12. </script>

  App.vue:

  1. <template>
  2. <div id="app">
  3. <ul>
  4. <li>
  5. <router-link to="/home">Home</router-link>
  6. </li>
  7. <li>
  8. <router-link to="/about">About</router-link>
  9. </li>
  10. <li>
  11. <router-link to="/user/1">User ID:1</router-link>
  12. </li>
  13. <li>
  14. <router-link to="/user/2">User ID:2</router-link>
  15. </li>
  16. </ul>
  17. <router-view/>
  18. </div>
  19. </template>
  20.  
  21. <script>
  22. export default {
  23. name: "App"
  24. };
  25. </script>

  在User.vue中直接通过 {{ $route.params.id }} 获取路由中路径参数值。

  当整个vue-router 注入到根实例后,在组件的内部,可以通过this.$route 来获取到 router 实例。

  $route中params 属性来获得动态部分,params 属性是一个对象。

  属性名是路径中定义的动态部分 id, 属性值是router-link中to 属性中的动态部分。

  在<router-link>中加入一个params的属性来指定具体的参数值。

  1. <router-link :to="{ name: 'user', params:{ id: 1 }}">UserID:1</router-link>

4. 嵌套路由

  实际应用界面,通常由多层嵌套的组件组合而成。

  vue-router配置嵌套路示例:

  App.vue

  1. <template>
  2. <div id="app">
  3. <ul>
  4. <li>
  5. <router-link to="/home">Home</router-link>
  6. </li>
  7. <li>
  8. <router-link :to="{ name: 'about' }">About</router-link>
  9. </li>
  10. <li>
  11. <router-link :to="{ name: 'user', params:{ id: 1 }}">UserID:1</router-link>
  12. </li>
  13. <li>
  14. <router-link to="/user/2">UserID:2</router-link>
  15. </li>
  16. </ul>
  17. <router-view/>
  18. </div>
  19. </template>
  20.  
  21. <script>
  22. export default {
  23. name: "App"
  24. };
  25. </script>

  这里的<router-view>是最顶层的出口,渲染最高级路由匹配到的组件。

  一个被渲染组件同样可以包含自己的嵌套 <router-view>。

  User.vue

  1. <template>
  2. <div>
  3. <h2>User ID:{{ $route.params.id }}</h2>
  4. <router-view></router-view>
  5. </div>
  6. </template>
  7.  
  8. <script>
  9. export default {};
  10. </script>

  要在嵌套的出口中渲染组件,需要在 VueRouter 的参数中使用 children 配置:

  index.js

  1. import Vue from 'vue'
  2. import Router from 'vue-router'
  3. import Home from '@/views/Home'
  4. import About from '@/views/About'
  5. import User from '@/views/User'
  6. import UserProfile from '@/views/UserProfile'
  7.  
  8. Vue.use(Router)
  9.  
  10. export default new Router({
  11. mode: 'history',
  12. routes: [{
  13. path: '/',
  14. name: 'home',
  15. component: Home
  16. },
  17. {
  18. path: '/home',
  19. name: 'home',
  20. component: Home
  21. },
  22. {
  23. path: '/about',
  24. name: 'about',
  25. component: About
  26. },
  27. {
  28. // 动态路径参数 以冒号开头
  29. path: '/user/:id',
  30. name: 'user',
  31. component: User,
  32. children: [{
  33. // 当 /user/:id/profile 匹配成功,
  34. // UserProfile 会被渲染在 User 的 <router-view> 中
  35. path: 'profile',
  36. name: 'profile',
  37. component: UserProfile
  38. }]
  39. }
  40. ]
  41. })

  UserProfile.vue

  1. <template>
  2. <div>User Profile</div>
  3. </template>
  4.  
  5. <script>
  6. export default {};
  7. </script>

  访问嵌套路由方式:http://localhost:8080/user/1/profile

  在嵌套路由中访问父级路由参数:

  1. <template>
  2. <div>User Profile:{{ $route.params.id }}</div>
  3. </template>
  4.  
  5. <script>
  6. export default {};
  7. </script>

  当访问 /user/1 时,提供一个 空的子路由。

  1. {
  2. // 动态路径参数 以冒号开头
  3. path: '/user/:id',
  4. name: 'user',
  5. component: User,
  6. children: [{
  7. // 当 /user/:id 匹配成功,
  8. // UserProfile 会被渲染在 User 的 <router-view> 中
  9. path: '',
  10. component: UserProfile
  11. }, {
  12. // 当 /user/:id/profile 匹配成功,
  13. // UserProfile 会被渲染在 User 的 <router-view> 中
  14. path: 'profile',
  15. name: 'profile',
  16. component: UserProfile
  17. }]
  18. }

5. 命名视图

  若要同级展示多个视图(非嵌套),使用命名视图。

  如果router-view没有设置名字,则默认为 default。

  1. <router-view name="main"></router-view>

  一个视图使用一个组件渲染,因此对于同个路由,多个视图就需要多个组件。使用 components 配置。

  1. <router-view name="header"></router-view>
  2. <router-view name="slidebar"></router-view>
  3. <router-view name="main"></router-view>
  4. <router-view name="footer"></router-view>

  Route配置:

  1. export default new Router({
  2. routes: [{
  3. path: '/',
  4. name: 'home',
  5. components: {
  6. default: Home,
  7. header: Header,
  8. slidebar: SlideBar,
  9. footer: Footer
  10. }
  11. }
  12. ]
  13. })

  命名嵌套视图:

  1. <template>
  2. <div>
  3. <h2>User ID:{{ $route.params.id }}</h2>
  4. <router-view></router-view>
  5. <router-view name="defined"></router-view>
  6. </div>
  7. </template>
  8.  
  9. <script>
  10. export default {};
  11. </script>
  1. export default new Router({
  2. routes: [{
  3. // 动态路径参数 以冒号开头
  4. path: '/user/:id',
  5. name: 'user',
  6. component: User,
  7. children: [{
  8. // 当 /user/:id 匹配成功,
  9. // UserProfile 会被渲染在 User 的 <router-view> 中
  10. path: '',
  11. component: UserProfile
  12. }, {
  13. // 当 /user/:id/profile 匹配成功,
  14. // UserProfile 会被渲染在 User 的 <router-view> 中
  15. path: 'profile',
  16. name: 'profile',
  17. components: {
  18. default: UserProfile,
  19. defined: UserDefinedProfile
  20. }
  21. }]
  22. }
  23. ]
  24. })

6. 编程式导航

  除了使用 <router-link> 创建 a 标签来定义导航链接,还可以借助 router 的实例方法,通过编写代码来实现。

  1. <template>
  2. <div>
  3. <input type="button" value="跳转" @click="handleRedirect" />
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. methods: {
  9. handleRedirect() {
  10. this.$router.push({ path: "/" });
  11. this.$router.push({ name: 'about'})
  12. this.$router.push({ name: 'user', params: { id: 1 }})
  13. }
  14. }
  15. };
  16. </script>

7. 导航守卫

7.1 全局前置守卫

  使用 router.beforeEach 注册一个全局前置守卫:

  1. const router = new VueRouter({ ... })
  2.  
  3. router.beforeEach((to, from, next) => {
  4. // ...
  5. })

  示例:

  1. import Vue from 'vue'
  2. import VueRouter from 'vue-router'
  3. import Home from '../views/Home.vue'
  4.  
  5. Vue.use(VueRouter)
  6.  
  7. const routes = [{
  8. path: '/',
  9. name: 'home',
  10. component: Home
  11. },
  12. {
  13. path: '/about',
  14. name: 'about',
  15. component: () => import('../views/About.vue')
  16. }
  17. ]
  18.  
  19. const router = new VueRouter({
  20. mode: 'history',
  21. base: process.env.BASE_URL,
  22. routes
  23. })
  24.  
  25. // 导航守卫
  26. // 使用 router.beforeEach 注册一个全局前置守卫,判断用户是否登陆。
  27. router.beforeEach((to, from, next) => {
  28. if (to.path === '/login') {
  29. next();
  30. } else {
  31. let token = localStorage.getItem('Token');
  32. if (token === 'null' || token === '') {
  33. next('/login');
  34. } else {
  35. next();
  36. }
  37. }
  38. })
  39.  
  40. export default router

Vue.js 2.x笔记:路由Vue Router(6)的更多相关文章

  1. Vue.js高效前端开发 • 【Vue组件】

    全部章节 >>>> 文章目录 一.Vue组件介绍 1.组件概述 2.组件使用步骤 3.实践练习 一.Vue组件使用 1.组件注册 2.组件注册语法糖 3.使用script或te ...

  2. vue.js应用开发笔记

    看vue.js有几天了,之前也零零散散的瞅过,不过一直没有动手去写过demo,这几天后台事比较少,一直在讨论各种需求(其实公司对需求还是比较重视与严谨的,一个项目需求讨论就差不多一周了,这要搁之前,天 ...

  3. Vue.js 相关知识(路由)

    1. 简介 路由,工作原理与路由器相似(路由器将网线总线的IP分发到每一台设备上),Vue中的路由根据用户在网页中的点击,将其引导到对应的页面. 2. 使用步骤 安装vue-router或者直接引入v ...

  4. Vue.js随笔二(新建路由+component+添加样式+变量的显示)

    创建一个页面: 1.首先让我们看一下整个vue.js的目录,如下图所示: 2.现在让我们创建一个页面吧: 2-1首先你需要新建路由(就和建立一个如何找到项目文件的目录一个意思):进入src/route ...

  5. Vue.js—组件快速入门及Vue路由实例应用

    上次我们学习了Vue.js的基础,并且通过综合的小实例进一步的熟悉了Vue.js的基础应用.今天我们就继续讲讲Vue.js的组件,更加深入的了解Vue,js的使用.首先我们先了解一下什么是Vue.js ...

  6. Vue.js 的几点总结Watchers/router key/render

    Vue.js 的几点总结,下面就是实战案例,一起来看一下. 第一招:化繁为简的Watchers 场景还原: 1 2 3 4 5 6 7 8 created(){   this.fetchPostLis ...

  7. Vue.js实战学习笔记(中)

    1.递归组件给组件设置name属性,组件就可以在它的模板内调用自己,但必须给一个条件来限制递归数量.<div id="app"> <child-component ...

  8. 两万字Vue.js基础学习笔记

    Vue.js学习笔记 目录 Vue.js学习笔记 ES6语法 1.不一样的变量声明:const和let 2.模板字符串 3.箭头函数(Arrow Functions) 4. 函数的参数默认值 5.Sp ...

  9. 从零开始学习Vue.js,学习笔记

    一.为什么学习vue.js methods 只有纯粹的数据逻辑,而不是去处理 DOM 事件细节. vue.js兼具angular.js和react的优点,并且剔除了他们的缺点 官网:http://cn ...

随机推荐

  1. 『练手』005 Laura.SqlForever历史遗留 的 架构思想缺陷

    005 Laura.SqlForever历史遗留 的 架构思想缺陷 我们 比较一下 Laura.WinFramework 和 Laura.XtraFramework 的差异: Laura.WinFra ...

  2. Asp.Net Core 轻松学-在.Net Core 使用缓存和配置依赖策略

    前言     几乎在所有的应用程序中,缓存都是一个永恒的话题,恰当的使用缓存可以有效提高应用程序的性能:在某些业务场景下,使用缓存依赖会有很好的体验:在 Asp.Net Core 中,支持了多种缓存组 ...

  3. 与其想当然的 overdesign,不如自己动手做个试验

    Conmajia Jan. 29th, 2019 早在2012年,我曾经针对 C# System.Random 不同的初始化方案专门做过一次试验,得出了单次默认初始化即可获得质量很好的随机数的结论.可 ...

  4. ASP.NET Core 基于JWT的认证(二)

    ASP.NET Core 基于JWT的认证(二) 上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用 ...

  5. Java笔记(day11)

    异常:是在运行时期发生的不正常情况. 异常类:在java中用类的形式对不正常情况进行了描述和封装对象,描述不正常的情况的类. 异常就是java通过面向对象的思想将问题封装成了对象.用异常类对其进行描述 ...

  6. Android 设计模式之MVC模式

    说到Android设计模式的MVC模式,估计很多人都是比较熟悉了,这里深入了解一下MVC到底是怎么回事,以ListView为例子讲解. 一.深入理解MVC概念 MVC即Model-View-Contr ...

  7. Android Studio教程09-加载器Loader的使用

    目录 1.加载器特征 2. Loader API 3. 在应用中使用Loader 3.1. 启动加载器 3.2. 重启加载器 3.3. 使用LoaderManager回调 4. 实例: 访问用户联系人 ...

  8. .Net Core 学习笔记1——包、元包、框架

    .Net Core 是由NuGet包(package)组成的平台. 一起使用的多个包的集合:元包(Metapackage) package 包 (对应以前的程序集概念) Framework 框架 as ...

  9. Linux(CentOS 7)安装测试mysql5.6服务

    1.rpm -qa | grep mysql,查看原系统中是否有已经安装得mysql. 注:centos7系统在安装完成后,未安装mysql任何版本. 2. rpm -e --nodeps mysql ...

  10. MongoDB自学(2)

    条件操作符: gt(大于),gte(大于等于),lt(小于),lte(小于等于)E.G:db.People.find({age:{$gt:100}})//查找集合里age大于100的文档 注意:str ...