6、vue-router路由

1、安装

只介绍npm安装
npm install vue-router --save 项目所需依赖
在main.js或者app.vue中导入
import Vue from 'vue';
import VueRouter from 'vue-router';
Vue.use(VueRouter);
现在你就可以开始使用vue-router了

2、结构

先来简单的了解一下使用的结构,方便后面学习
<router-link to="/foo">Go to Foo</router-link> 相当于a标签
<router-view></router-view> 这时用来渲染匹配到的路由组件的
下面就是具体的路由设置了
const router =new VueRouter({
        routes: [
            {path: '/foo',component: Foo} //匹配到路由'/foo'后渲染组件Foo
        ]
    });
很简单吧

3、动态路由匹配

说简单点,就是不同的路由值,访问同一个组件
例如:
    const router = new VueRouter({
        routes: [
            { path: '/user/:id', component: User }
        ]
    })
    在 '/user/' 后面跟个 :id 表示这时可选的,就是说不管id是啥,都可以访问User组件
    并且这个id存放在this.$route.params中,并且可以有多个这样的可选值
注意点: 在不同的路由值之间切换访问相同的组件,是不会重复渲染的,但是可以通过watch来做出响应
    const User = {
        watch: {
            '$route' (to,from) {
                // 对路由变化做出响应
            }
        }
    }
    // 有没有觉得这个写法挺怪的,管他呢,能用就行O(∩_∩)O哈哈~

4、嵌套路由

嵌套路由很简单,就是匹配到某个路由值,渲染到一个组件,这个组件内部还有router-view,这时可以传递第二段路由值,加以匹配,如果不传递,可以设置一个空的二段路由值
例子如下:
    const router = new VueRouter({
        routes: [{
            path: '/user/:id',component: User
        }]
    })
    /user/demo 这个路由值,可以匹配到User组件,如果User组件是如下的
    const User = {
        template: `
            <router-view></router-view>
        `
    }
    那么需要对路由配置做如下修改
    const router = new Router({
        routes: [
            {path: '/user/:id',component: User,
             children: [
                 {path: '',component: UserHome},
                 {path: 'profile',component: UserProfile}
             ]
            }
        ]
    })

5、编程式导航

简而言之,就是,使用js来实现router-link的功能
使用 router.push ,此方法和router-link一模一样,会产生浏览记录,有如下几种形式,和router-link是等价的
    router.push('home')
    router.push({path: 'home'}) // 和上面等价
    router.push({name: 'user',params: {userId: 123}}) // 这个是命名路由,后面讲
    router.push({path: 'register',query: {plan: 'private'}}) // '/register?plan=private'
使用router.replace(location)
    和router.push相似,只不过这里不会产生浏览记录,没卵用
使用router.go(n) 

6、命名路由

命名路由是用来给懒人用的,给router-link传递to属性,使用path很长,很难写,所以,起个名字,方便写
当某个路由配置是
const router = new VueRouter({
    routes: [
        {
            path: '/user/:userId',
            name: 'user',
            component: User
        }
    ]
})
正常人是这样访问的 <router-link :to="/user/123"></router-link>
懒人是这样访问的 <router-link :to="{name: 'user',params: {userId: 123}}"></router-link>
咦。。。,好像还要多输入几个字符,不对,这是装逼用的

7 、命名视图

这个玩意儿就是当匹配到一个路由值,同时渲染多个组件,很简单,看下面demo
<router-view></router-view> //这个没有起名的默认就是 default
<router-view name="a"></router-view>
<router-view name="b"></router-view>
const router = new VueRouter({
    routes: [
        {
            path: '/',
            components: {
                default: Foo,
                a: Bar,
                b: Baz
            }
        }
    ]
})
// 这样同时就渲染出 Foo,Bar,Baz 三个组件了

8、重定向和别名

这两个概念也是很简单的
重定向就是当访问一个路由值,定向到另外一个路由值,此即以假乱真,简单demo如下
const router = new VueRouter({
    routes: [
        {path: '/a',redirect: '/b'}
    ]
})
别名就是起个其它的名字,其实访问的还是这个路由
const router = new VueRouter({
    routes: [
        {path: '/a',component: A,alias: '/b'}
    ]
})

9、HTML5 History模式

这部分内容也是装逼专用,就是把url中的/#去掉,变好看一点,需要把其他不符合要求的路由值定位到主页上来,要不然就直接404,官网说这个功能要后台来实现,不过我觉得,可以直接用路由钩子实现,详见后述

10、导航钩子

这个功能很强大,可以在进行导航的过程的各个时间点做处理,很吊的
有全局的,单个路由的,组件的
1.先来看个全局的钩子,注册一个全局的before钩子
const router = new VueRouter({...});
router.beforeEach((to,from,next) => {
    // 可以注册多个before,多个before之间是异步的,但是导航必须等到这些钩子执行完成,才开始
    // to 目标路由对象
    // from 当前路由对象
    // next 有如下几种用法
    // next() 执行下一个钩子函数,没有钩子,则to到目标路由
    // next(false) 不to了,直接留在from这个路由
    // next('/') 不管这个to了,另找了一个to
    // next方法必须调用,不调用就是死循环,小心你电脑内存爆了
    // 记得刚开始学这个,我差点把电脑砸了
})
注册一个after钩子,这个作用不大,毕竟路由都跳转了,唯一的作用就是来看看而已
router.afterEach(route => {
    // ...
})
2.单个路由的
直接上demo了吧,简单
const router = new VueRouter({
    routes: [{
        path: '/foo',
        component: Foo,
        beforeEnter: (to,from,next) => {
            //...
        }
    }]
})
3.组件内的
这个也简单,不过比上面两个稍有点区别,上demo吧
const Foo = {
    template: '...',
    beforeRouteEnter (to,from,next) {
        // 这里不能直接访问当前实例this,因为实例还没有渲染,不过可以通过next来访问
        next(vm => {
            // ...
        })
    },
    beforeRouteUpdate (to,from,next) {
        // 多个路由值访问同一个组件,来回切换,组件不会刷新,那么上面的这个钩子就没有了,此时这个钩子登场
    },
    beforeRouteLeave (to,from,next) {
        // 顾名思义,不介绍了
    }
}

11、路由元信息

这玩意儿就是一个flag,用于遍历的时候找到特殊的路由,用处很小,这里不介绍了,感兴趣自己查去

12、过渡动效

就是在切换路由的时候展示动画,如果你懂vue的transition,这部分内容你根本就不用看,直接上手
<transition>
    <router-view></router-view>
</transition>

13、数据获取

在切换到其他路由,其他路由获取数据有两种方式,渲染完成之后获取数据,渲染之前获取数据
1.渲染完成之后获取数据
正常人都是这么干的,就是在组件的created钩子中写api获取数据,不做介绍了
2.渲染之前获取数据
这个还是很经典的,很有实际价值
在接下来要切换的组件中的beforeRouteEnter中获取数据,数据获取完成之后再渲染,再添加一个渲染动画,感觉棒棒哒
在next(vm => {
    // 将获取的数据放到实例上,上面介绍过了
})
上面这个也可以通过监听$route来实现,不过有点稍微延迟,不推荐使用
watch: {
    $route(){
        ...
    }
}

14、滚动行为

这个还是有点用的,切换到一个新的路由组件时,控制页面的位置
借助scrollBehavior方法,这个方法要写在router实例中
const router = new VueRouter({
    routes: [...],
    scrollBehavior (to,from,savedPosition) {
        savedPosition是点击浏览器的前进后退按钮才管用,下面列举了几种使用demo
        return {x: 0,y: 0}; 简单的回到最顶部
        return savedPosition; 返回原先的位置
        if (to.hash) {
            return {selector: to.hash} 锚点定位
        }
    }
})

15、懒加载

将组件拆分,实现按需加载,有如下几种方式,以后添加组件的话都这样用
1.把路由对应的组件拆分成异步组件
const Foo = resolve => {
    require.ensure(['./Foo.vue'], () => {
        resolve(require('./Foo.vue'))
    })
}
2.AMD
const Foo = resolve => require(['./Foo.vue'], resolve)
3.将多个组件打包到一个模块中
const Foo = r => require.ensure([], () => r(require('./Foo.vue')), 'group-foo')
const Bar = r => require.ensure([], () => r(require('./Bar.vue')), 'group-foo')
const Baz = r => require.ensure([], () => r(require('./Baz.vue')), 'group-foo')

原创来自https://www.cnblogs.com/ye-hcj/p/7147697.html

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