vue 基础(九)

Vue-Router的安装与使用

介绍

Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。包含的功能有:

  • 嵌套的路由/视图表
  • 模块化的、基于组件的路由配置
  • 路由参数、查询、通配符
  • 基于 Vue.js 过渡系统的视图过渡效果
  • 细粒度的导航控制
  • 带有自动激活的 CSS class 的链接
  • HTML5 历史模式或 hash 模式,在 IE9 中自动降级
  • 自定义的滚动条行为

安装Vue Router

  • 在html文件中引入vue-router.js
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>

注意: Vue Router必须要有Vue的支持才可以使用,所以在Html中引入Vue Router时必须先引入Vue

  • 在已有Vue项目中手动安装vue-router
npm install --save vue-router
  • 使用vue-cli创建自带vue-router的新项目
vue create project_name
# Vue 会询问你使用哪种配置
  Default ([Vue 2] babel, eslint)
  Default (Vue 3 Preview) ([Vue 3] babel, eslint)
> Manually select features 
# 请选择 Manually select features,Vue会询问你当前项目需要哪些配置
Check the features needed for your project: (Press <space> to select, <a> to toggle all, <i> to invert selection)
# 空格选择/取消  a全选 i反选
 (*) Choose Vue version
 (*) Babel
 ( ) TypeScript
 ( ) Progressive Web App (PWA) Support
> (*) Router
 ( ) Vuex
 ( ) CSS Pre-processors
 (*) Linter / Formatter
 ( ) Unit Testing
 ( ) E2E Testing   
#请将Router按空格键选中,后面一系列的询问直接确认就好

简单的路由实现

介绍: 路由本质上就是通过路由(也可称之为网址路径)的跳转变化,控制应用切换显示不同的UI组件

  • 在Html页面中实现Vue Router

步骤:

  1. 创建路由切换控制的UI组件
  2. 创建一个路由地址与对应UI组件映射的配置对象routes
  3. 实例化VueRouter对象并传入routes与其他可选路由配置对象
  4. 初始化Vue实例, 并将VueRouter实例对象作为配置参数传入,从而使得整个Vue实例支持路由相关功能

代码:

<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>

<div id="app"></div>

<script>
    // 1.创建组件配置对象
    const Home = { template: '<div>我是主页</div>' }
    const About = { template: '<div>我是关于页面</div>' }

    // 2. 定义路由
    // 每个路由应该映射一个组件。 其中"component" 可以只是一个组件配置对象。
    const routes = [
        { path: '/', component: Home },
        { path: '/about', component: About }
    ]

    // 3. 创建 router 实例,然后传 `routes` 配置
    // VueRouter还可以接受别的配置参数, 我们之后会讲
    const router = new VueRouter({
        routes // (缩写) 相当于 routes: routes
    })

    // 4. 创建Vue实例对象并挂载在页面上。
    // 将上面创建好VueRouter实例对象作为Vue实例的 router 配置参数注入,当前整个Vue实例内部就都支持路由功能了
    // 从而让整个应用都有路由功能
    const app = new Vue({
        el: "#app",
        router
    })
    // 配置完成
</script>

注意: 路由的相关配置已经完成,我们还需要在应用的DOM节点中将路由渲染出来实现,路由控制UI的效果。这个我们等会再学习。

  • 在Vue单文件应用中实现Vue Router

注意: 单文件应用中配置Vue Router与在HTML中配置,只是有两处不同:

  1. 在单文件应用中我们应该将VueRouter的相关配置代码抽离到单独为模块中,路由相关组件也应该改写为单文件组件并使用import引入

  2. 在Html中引入VueRouter插件在检测到 Vue 是可访问的全局变量时会自动调用 Vue.use()为 Vue 添加全局路由功能,而在单文件应用需要手动使用Vue.use()方法使用Router插件。

比如 router 选项, Vue构造函数中时不包含这个配置的,是VueRouter后添加的。并且VueRouter也提供了一些路由原型属性以及全局组件,这些我们之后都会学习

步骤:

  1. 在项目src目录中创建router目录并创建index.js文件用来封装VueRouter相关配置
  2. 引入Vue和VueRouter并使用Vue.use(VueRouter)全局安装路由插件
  3. 创建路由切换控制的UI组件并使用import引入到路由配置文件中
  4. 创建一个路由地址与对应UI组件映射的配置对象routes
  5. 实例化VueRouter对象并公开该模块
  6. 在main.js文件中初始化Vue实例时, import引入路由模块并作为配置参数传入Vue配置选项router,从而使得整个Vue实例支持路由相关功能
// src/router/index.js
// 1.引入Vue VueRouter库
import Vue from 'vue'
import VueRouter from 'vue-router'

// 3.创建路由切换控制的UI组件并使用import引入到路由配置文件中
import Home from '../views/Home.vue'
import About from '../views/About.vue'

// 2.使用全局方法 Vue.use将VueRouter安装到Vue中
Vue.use(VueRouter)

// 4.定义路由
// 每个路由应该映射一个组件。 其中"component" 可以只是一个单文件组件对象。
const routes = [
  {
    path: '/',
    component: Home
  },
  {
    path: '/about',
    component: About
  }
]

// 5.1 创建 router 实例,然后传 `routes` 配置
const router = new VueRouter({
  routes
})

// 5.2 公开VueRouter实例对象模块
export default router  
// src/main.js

import Vue from 'vue'
import App from './App.vue'
// 引入Router实例对象
import router from './router'

Vue.config.productionTip = false

new Vue({
  router, // 将路由实例对象配置到Vue实例中
  render: h => h(App)
}).$mount('#app')
  • 使用VueRouter提供的全局路由组件,实现路由UI

渲染路由组件 <router-view>

代码:

<div id="app">
    <router-view></router-view>
</div>

介绍: 通过在DOM中添加一个router-view组件就可以实现路由切换UI更新了,当我们在浏览器地址栏修改路由地址时,router-view组件就会根据VueRouter实配置的映射关系对象同步渲染对应的UI组件了

渲染跳转路由组件 <router-link>

介绍: 我们还可以通过渲染跳转路由组件, 实现通过用户点击实现路由跳转

代码:

<div id="app">
    <router-link to="/">主页</router-link>
    <router-link to="/about">关于</router-link>
    <router-view></router-view>
</div>

注意: 上面的两个组件router-link 与 router-view都是VueRouter插件所提供的路由全局组件,他们的具体使用我们会在后面学习

动态路由匹配

介绍: 我们经常需要把某种匹配规则的路由,全都映射到同个组件。例如,我们有一个 User 组件,对于所有 ID 各不相同的用户,都要使用这个组件来渲染。那么,我们通过使用路由的 “动态路径参数”(dynamic segment) 来达到这个效果:

使用: 在实例化VueRouter配置选项routes中path路径使用以冒号“:“开头的路径,这个路径就会成为动态路径参数,当url与动态路径匹配时。匹配的url字符串与动态路径名将会作为键值对存放在VueRouter为vue实例提供的路由原型属性 $route.params 对象属性中。

例子:

路由模式 匹配路径 $route.params
/user/:username /user/mark {username: 'mark'}
/user/:username /user/lucas {username: 'lucas'}
/user/:id /user/10086 {id: '10086'}
/user/:username/post/:post_id /user/mark/post/12345 {username: 'mark', 'post_id': '12345'}

注意:

  1. 路由匹配到的结果都是字符串
  2. 一个路由中可以设置多段“路径参数”
  3. $router时VueRouter为添加的 Vue 实例方法,用来存储当前路由的相关信息,这个知识点我们会在后面学习

代码:

<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>

<div id="app">
    <router-link to="/">主页</router-link>
    <router-link to="/user/mark">Mark</router-link>
    <router-link to="/user/jancos">Jancos</router-link>
    <router-link to="/user/lucas">Lucas</router-link>
    <router-link to="/user/max">Max</router-link>
    <router-link to="/user/rose">Rose</router-link>

    <router-view></router-view>
</div>

<script>

    const Home = { template: '<div>我是主页</div>' }
    const User = { template: '<div>我是用户详情页 {{$route.params.username}}</div>' }

    // 以冒号开头的路由路径,都会作为动态路径
    const routes = [
        { path: '/', component: Home },
        { path: '/user/:username', component: User }
    ]

    const router = new VueRouter({
        routes
    })

    const app = new Vue({
        el: "#app",
        router
    })
   
</script>

嵌套路由

概念: 实际生活中的应用界面,通常由多层嵌套的组件组合而成。同样地,URL 中各段动态路径也按某种结构对应嵌套的各层组件,例如:

借助 vue-router,使用嵌套路由配置,就可以很简单地表达这种关系。

接着上节创建的 app:

<div id="app">
  <router-view></router-view>
</div>
const User = { 
    template: '<div>我是用户详情页 {{$route.params.username}}</div>' 
}

const router = new VueRouter({
  routes: [
    { path: '/user/:id', component: User }
  ]
})

这里的 <router-view> 是最顶层的出口,渲染最高级路由匹配到的组件。同样地,一个被渲染组件同样可以包含自己的嵌套 <router-view>。例如,在 User 组件的模板添加一个 <router-view>

const User = {
  template: `
    <div class="user">
      <h2>我是用户详情页 {{ $route.params.id }}</h2>
      <router-view></router-view>
    </div>
  `
}

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

const router = new VueRouter({
  routes: [
    { path: '/user/:id', component: User,
      children: [
        {
          // 当 /user/:id/profile 匹配成功,
          // UserProfile 会被渲染在 User 的 <router-view> 中
          path: 'profile',
          component: UserProfile
        },
        {
          // 当 /user/:id/posts 匹配成功
          // UserPosts 会被渲染在 User 的 <router-view> 中
          path: 'posts',
          component: UserPosts
        }
      ]
    }
  ]
})

注意:

  1. 以 / 开头的嵌套路径会被当作根路径。 路径嵌套时无需用"/"开头这让你充分的使用嵌套组件而无须设置嵌套的路径。

  2. children 配置就是像 routes 配置一样的路由配置数组,可以嵌套多层路由。

此时,基于上面的配置,当你访问 /user/foo 时,User 的出口是不会渲染任何东西,这是因为没有匹配到合适的子路由。如果你想要渲染点什么,可以提供一个空的子路由:

const router = new VueRouter({
  routes: [
    {
      path: '/user/:id', component: User,
      children: [
        // 当 /user/:id 匹配成功,
        // UserHome 会被渲染在 User 的 <router-view> 中
        { path: '', component: UserHome },

        // ...其他子路由
      ]
    }
  ]
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容

  • 前端路由 Vue-Router 介绍 什么是路由? 路由(routing)就是通过互联的网络把信息从源地址传输到目...
    coderlion阅读 1,655评论 0 0
  • 本文为转载,原文:Vue学习笔记进阶篇——vue-router安装及使用 介绍 vue-router是Vue.js...
    ChainZhang阅读 738评论 0 10
  • vue-router路由就是决定数据包从来源到目的地的路径 路由使用安装步骤 步骤- -: 安装vue-route...
    黑白说程序阅读 1,206评论 0 0
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,518评论 28 53
  • 信任包括信任自己和信任他人 很多时候,很多事情,失败、遗憾、错过,源于不自信,不信任他人 觉得自己做不成,别人做不...
    吴氵晃阅读 6,173评论 4 8