Vue + Vue-Router结合开发

在实际开发中,用 Vue.js + vue-router 创建单页应用,是非常简单的。

在使用 Vue.js 时,我们就已经把组件组合成一个应用了,当你要把 vue-router 加进来,只需要配置组件和路由映射,然后告诉 vue-router 在哪里渲染它们。

image

一、Vue-Router

  • ** 基本使用**
image
  • HTML部分:
> <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">
> 
>   <h1>Hello App!</h1>
> 
>   <p>
> 
>     <!-- 使用 router-link 组件来导航. -->
> 
>     <!-- 通过传入 `to` 属性指定链接. -->
> 
>     <!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
> 
>     <router-link to="/foo">Go to Foo</router-link>
> 
>     <router-link to="/bar">Go to Bar</router-link>
> 
>   </p>
> 
>   <!-- 路由出口 -->
> 
>   <!-- 路由匹配到的组件将渲染在这里 -->
> 
>   <router-view></router-view>
> 
> </div>
  • JavaScript
> // 0\. 如果使用模块化机制编程,導入Vue和VueRouter,要调用 Vue.use(VueRouter)
> 
> // 1\. 定义(路由)组件。
> 
> // 可以从其他文件 import 进来
> 
> const Foo = { template: '<div>foo</div>' }
> 
> const Bar = { template: '<div>bar</div>' }
> 
> // 2\. 定义路由
> 
> // 每个路由应该映射一个组件。 其中"component" 可以是
> 
> // 通过 Vue.extend() 创建的组件构造器,
> 
> // 或者,只是一个组件配置对象。
> 
> // 我们晚点再讨论嵌套路由。
> 
> const routes = [
> 
>   { path: '/foo', component: Foo },
> 
>   { path: '/bar', component: Bar }
> 
> ]
> 
> // 3\. 创建 router 实例,然后传 `routes` 配置
> 
> // 你还可以传别的配置参数, 不过先这么简单着吧。
> 
> const router = new VueRouter({
> 
>   routes // (缩写)相当于 routes: routes
> 
> })
> 
> // 4\. 创建和挂载根实例。
> 
> // 记得要通过 router 配置参数注入路由,
> 
> // 从而让整个应用都有路由功能
> 
> const app = new Vue({
> 
>   router
> 
> }).$mount('#app')
> 
> // 现在,应用已经启动了!

二、案例实操

image
image
image
image

运行结果:

image

三、命名路由

有时候,通过一个名称来标识一个路由显得更方便一些,特别是在链接一个路由,或者是执行一些跳转的时候。你可以在创建 Router 实例的时候,在 routes 配置中给某个路由设置名称。

比如:

const routes = [

    { path: '/html5', name: 'html5', component: Html5 },

    { path: '/ios', name: 'iOS', component: IOS },

    { path: '/', redirect: '/html5'}  //定义根路由指向

]

<router-link class="list-group-item" :to="{ name: 'html5' }">

  H5学院

</router-link>

<router-link class="list-group-item" :to="{ name: 'iOS', params:{ id: 12345, name:'iOS快速入门' } }">

  iOS学院

</router-link>

<template id="ios">

    <div>

        <h2>iOS学院</h2>

        <p>

          这是一个充满大神的学院!! 

          id是{{ $route.params.id }}, {{ $route.params.name }}

        </p>

    </div>

</template>

router-link 标签的常用属性

router-view 标签的使用

四、路由嵌套

   实际生活中的应用界面,通常由多层嵌套的组件组合而成。同样地,URL 中各段动态路径也按某种结构对应嵌套的各层组件,借助 vue-router,使用嵌套路由配置,就可以很简单地表达这种关系。以下是案例实操部分:
image
image
image
image
image

运行结果:

image

五、路由对象

    在使用了 vue-router 的应用中,路由对象会被注入每个组件中,赋值为 this.$route ,并且当路由切换时,路由对象会被更新。

路由对象(route object)主要包括以下属性:

$route.path 字符串,对应当前路由的路径,总是解析为绝对路径,如 "/foo/bar";

$route.params 一个 key/value 对象,包含了 动态片段 和 全匹配片段,如果没有路由参数,就是一个空对象;

route.query 一个 key/value 对象,表示 URL 查询参数。例如,对于路径 /foo?user=1,则有route.query.user == 1,如果没有查询参数,则是个空对象;

$route.name 当前路由的名称,如果有的话;

$route.hash 当前路由的 hash 值 (带 #) ,如果没有 hash 值,则为空字符串;

$route.fullPath 完成解析后的 URL,包含查询参数和 hash 的完整路径;

$route.matched 一个数组,包含当前路由的所有嵌套路径片段的 路由记录 。路由记录就是 routes 配置数组中的对象副本(还有在 children 数组)。

案例实操

<div class="row">

        <div class="col-xs-offset-2 col-xs-8">

            <div class="well">

                <p>当前路径:<code>{{$route.path}}</code></p>

                <p>当前参数:<code>{{$route.params | json}}</code></p>

                <p>路由名称:<code>{{$route.name}}</code></p>

                <p>路由查询参数:<code>{{$route.query | json}}</code></p>

                <p>路由匹配项:<code>{{$route.matched | json}}</code></p>

            </div>

        </div>

</div>

运行结果:

image

六、钩子函数

6.1 什么是钩子函数?

   路由的切换过程,本质上是执行一系列路由钩子函数,钩子函数总体上分为两大类:

全局钩子函数

组件的钩子函数

   全局的钩子函数定义在全局的路由对象中,组件的钩子函数则定义在组件的route选项中。

6.2 全局钩子函数

beforeEach:在路由切换开始时调用

afterEach:在每次路由切换成功进入激活阶段时被调用

const router = new VueRouter({ ... })

router.beforeEach((to, from, next) => {

    // ...

})

router.afterEach(route => {

    // ...

})

参数:

to: Route: 即将要进入的目标 路由对象。

from: Route: 当前导航正要离开的路由。

next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。

next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。

next(false): 中断当前的导航。如果浏览器的 URL 改变了(可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。

next('/') 或者 next({ path: '/' }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。

参考:组件的钩子函数

(http://router.vuejs.org/zh-cn/advanced/navigation-guards.html)

(http://www.cnblogs.com/keepfool/p/5690366.html)

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

推荐阅读更多精彩内容

  • 路由实现的方式 声明式。<router-link :to="..."> 编程式。router.push(...) ...
    SailingBytes阅读 1,064评论 1 3
  • vue笔记 一.vue实例 vue的生命周期 beforeCreate(创建前), created(创建后), b...
    秋殇1002阅读 1,033评论 0 1
  • 前言 vue-router是什么:是vue.js官方的路由管理器和vue.js的核心深度的集成,让开发者更加简单的...
    GUAN_one阅读 3,628评论 0 2
  • 首先抛出这样一个问题,vue-router是用来做什么的? 这里不着急回答,也不准备在这篇文章里回答。这篇文章仅总...
    1263536889阅读 580评论 0 2
  • 一、基本用法 React Router 安装命令如下。 $ npm install -S react-router...
    sunnyghx阅读 4,421评论 0 6