vue-06-路由

SPA 单页面应用开发(重点)

SPA 的优势:因为是把页面都合并到一起,所以路由切换时,实际上是在当前页面切换显示,所以不会因网络问题造成页面卡顿、白屏。

SPA 的不足:合并后的文件体积特别的大,所以第一次打开页面时,比较慢。(解决方法是用按需加载)

router 路由(重点)

vue-router 配置基于 vue 的单页面应用(SPA)

// npm install vue-router -S    
import VueRouter from 'vue-router';

// 将vue-router注册到全局,这样每一个组件都可以使用router-link和router-view组件了
Vue.use(VueRouter);

// 定义路由规则
var routes = [
    { path: '/', component: ind },  
    { path: '/msg', component: msg },   
    { path: '/hi', component: hi }
]

// 创建路由实例
var router = new VueRouter({ routes, mode:'history' });

// 将路由实例注入到vue实例中
new Vue({
    el:"#app",
    router,
    render: h => h(App)
});
  • router-link 组件:渲染后为a标签,点击这个标签后,浏览器地址栏会发生变化。
  • router-view 组件:浏览器地址栏每次发生变化时,会根据路由规则,把匹配到的组件显示到router-view标签上。
<template>
    <div>
        <router-link to="/">ind</router-link>
        <router-link to="/msg">msg</router-link>
        <router-link to="/hi">hi</router-link>

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

router-link组件识别路由后会自动添加style样式

.router-link-exact-active{
    color: green !important;
}

也可以自己定义样式

<router-link to="/hi" active-class="xyz" exact-active-class="abc">hi</router-link>

通过tag属性,可以将a标签解析成其他标签。

<router-link to="/hi" tag="li">hi</router-link>

路由模式:mode

  • history
  • hash(默认值。哈希、网址含#)
  • abstract(抽象、网址不变)
var router = new VueRouter({ routes, mode:'history' });

用的较多的是history,每次页面切换的时候,浏览器地址栏看起来就像是传统的网站页面一样。

慎用 abstract,首次打开页面时 router-view 无法匹配 path='/',
所以可以在 app.vue 的 mounted 中执行 this.$router.push('/')

动态路由匹配

在浏览器中访问一个网址时,通常这个网址是有语义的,比如访问:

http://www.abc.com/news/102/

  • news 表示新闻
  • 102 表示新闻id

那么怎么配置这种路由呢?

路由规则页面

const routes = [
    {
        path : '/news/:id',
        component: {
            // 可以直接创建组件,使用render渲染,不能使用template渲染。
            render(createElement){
                return createElement('div', 'abc')
            },
            created(){
                // 在js中接收浏览器地址栏中id对应的数据
                console.log(this.$route.params)
            }
        }
    }
]

某组件的html页面,由这个页跳转到NewsComponent页面

<router-link to="/news/102">点我跳转页面</router-link>

路由参数

路由中传递数据除了刚才的params外,还可以使用query数据。

路由规则页面

const routes = [
    {
        path : '/news',
        component : NewsComponent
    }
]

某组件的html页面,由这个页跳转到NewsComponent页面

<router-link to="/news?id=102">点我跳转页面</router-link>

NewsComponent组件的js部分

// 在js中接收浏览器地址栏中id对应的数据
this.$route.query.id

嵌套路由规则

移动端项目不建议使用嵌套的路由规则,如果必须要用到嵌套路由,通常也不会超过2层。

比如项目中,一级导航有首页和用户,用户页面又有二级导航登录、注册两个页面。

路由规则

const routes = [
    {
        path: '/',
        component: IndexComponent
    },
    {
        path: '/user',
        component: UserComponent,
        children: [
            { path: '/user/register', component: RegisterComponent },
            { path: '/user/login', component: LoginComponent }
        ]
    }
]

children描述的是UserComponent组件内的路由规则,当根据路由规则匹配出对应的组件后,这个组件在UserComponent组件内,找到router-view渲染。

UserComponent组件

点击嵌套路由的链接时,只会在嵌套路由组件出口显示对应的组件。

<router-link to="/user/register">注册</router-link>
<router-link to="/user/login">登录</router-link>
<router-view></router-view>

声明式导航、编程式导航

  • 声明式导航:html中的router-link标签实现页面跳转
  • 编程式导航:通过js代码实现页面跳转

向history中添加记录

<router-link to="/">
this.$router.push("/")
this.$router.push({ path: '/html2', query:{a:1,b:2}})

不会向history中添加新纪录

<router-link to="/" replace>
this.$router.replace("/")

历史记录中前进及后退

this.$router.go(1)

路由对象下有2个常用的属性,一个是route,一个是router:

  • route 这里存储的是属性,比如route.query、$route.params
  • router 这里存储的是方法,比如router.push()、router.replace()、router.go() 编程式导航方法都存到了这里

命名路由

给定义的路由规则起个名字,页面跳转时,使用该名字完成路由跳转。

路由规则

const routes = [
    {
        name: 'abc',
        path: '/html1/:a/:b',
        component: a
    }
]

页面跳转

<router-link :to="{name:'abc',params:{a:1,b:2}}">html1/1/2</router-link>
<router-view></router-view>

this.$router.push({ name: 'abc', params:{a:1,b:2}})

命名视图

一个页面中,有多个路由出口,每个router-view渲染哪个组件呢?

路由规则

const routes = [
    { path: '/a', components: {one:a, two:b} },
    { path: '/b', components: {one:c} }
]

html部分

<router-link to="/a">a</router-link>
<router-link to="/b">b</router-link> 

<router-view name="one"></router-view>
<router-view name="two"></router-view>

访问a时,one渲染a组件,two渲染b组件。访问b时,one渲染c组件,two不渲染组件,节点移除。

重定向

当我们访问a时,自动跳转到了b。

const routes = [
    { path: '/a', redirect: '/b' }
]

别名

当我们访问c时,url不变,但实际访问的是a。

const routes = [
    { path: '/a', alias: '/c', component:a  }
]

守卫

路由中的守卫就是路由中的生命周期钩子函数。

全局守卫

只要发生页面跳转,无论是什么页面跳转,都会执行该钩子函数。

const router = new VueRouter({routes, mode:"history"})

router.beforeEach((to, from, next) => {
    // to 表示到哪里去
    // from 表示从哪里来
    console.log(to, from);
    // next 表示执行跳转
    next();
})

路由守卫

在路由规则中,定义该钩子函数,表示渲染该组件之前执行守卫验证,如果有next则把组件渲染出来。

const routes = [
    {
        path: '/foo',
        component: Foo,
        beforeEnter: (to, from, next) => {
            console.log(to, from);
            next();
        }
    }
]

组件守卫

在组件中定义该钩子函数

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

推荐阅读更多精彩内容