Vue-router(第五天)

1.什么是Vue Router?

Vue Routerv-if/v-show一样, 是用来切换组件的显示的
v-if/v-show标记来切换(true/false)
Vue Router哈希来切换(#/xxx)
比v-if/v-show强大的是Vue Router不仅仅能够切换组件的显示, 还能够在切换的时候传递参数

2.Vue Router使用

2.1导入Vue Router
2.2定义路由规则
2.3根据路由规则创建路由对象
2.4将路径对象挂载到Vue实例中
2.5修改URL哈希值
2.6通过<router-view>渲染匹配的组件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
<!--    1.导入vue-router,需要在vue导入之后再导入-->
    <script src="vue-router.js"></script>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        .onepage, .twopage{
            width: 500px;
            height: 500px;
        }
        .onepage{
            background: pink;
        }
        .twopage{
            background: skyblue;
        }
    </style>
</head>
<body>
<div id="app">
<!--    6.创建URL进行路由跳转显示-->
    <a href="#/one">第一个界面</a>
    <a href="#/two">第二个界面</a>
    <!-- 路由匹配到的组件将渲染在这里 -->
    <router-view></router-view>
</div>
<template id="one">
    <div class="onepage">我是第一个界面</div>
</template>
<template id="two">
    <div class="twopage">我是第二个界面</div>
</template>
<script>
    // 2.定义组件
    const one={template:"#one"};
    const two={template:"#two"};
    // 3.定义路由规则
    const routes=[
        {path:"/one",component:one},
        {path:"/two",component:two},
    ];
    //3. 创建vue-router实例
    const router=new VueRouter({
            routes:routes
    });
    let vue=new Vue({
        el:"#app",
        components:{
            one:one,
            two:two
        },
        //4. 将vue-router实例绑定大vue实例上
        router:router
    });
</script>
</body>
</html>
image.png

image.png

router-link

1.什么是router-link?
通过a标签确实能设置URL的hash,但是这种方式并不专业
在Vue Router中提供了一个专门用于设置hash的标签 router-link

2.router-link特点
默认情况下Vue会将router-link渲染成a标签, 但是我们可以通过tag来指定到底渲染成什么

3.给router-link设置选中样式
默认情况下我们可以通过重写router-link-active类名来实现设置选中样式
但是我们也可以通过linkActiveClass来指定选中样式

4.重定向路由
{ path: '被重定向值', redirect: '重定向之后的值' }

通过a方法设置路由跳转并不专业,vue提供了一种更加专业的标签来实现这个功能——router-link,浏览器会默认把它转化为a链接的形式

<div id="app">
<!--    6.创建URL进行路由跳转显示-->
    <router-link to="/one">第一个界面</router-link>
    <router-link to="/two">第二个界面</router-link>
<!--    <a href="#/one">第一个界面</a>-->
<!--    <a href="#/two">第二个界面</a>-->
    <!-- 路由匹配到的组件将渲染在这里 -->
    <router-view></router-view>
</div>

浏览器elements里的显示为
image.png

如果要想指定标签进行路由,则可以给router-link指定tag

    <router-link to="/one" tag="button">第一个界面</router-link>
    <router-link to="/two" tag="button">第二个界面</router-link>
image.png

系统会默认给选中的路由设置一个router-link-active的类名,只要重写这个类名的样式则可以给选中状态的路由控制器设置样式了

        .router-link-active{
            background-color: red;
        }

image.png

但是这种做法并不是很好,自定义的会更加符合实际的需求
可以在创建vue-router实例时自定义通过linkActiveClass指定导航激活状态样式类名

            linkActiveClass: "shanjialan-active"
        .shanjialan-active{
            background-color: skyblue;
image.png

注意点:在刚开始进来的时候是看不见界面的,因为还没有进行跳转,但是一般会默认看到一个界面,这时需要用到路由重定向,定义在路由规则中,如下:

    const routes=[
        // 重定向路由
        { path: '/', redirect: '/two' },
        {path:"/one",component:one},
        {path:"/two",component:two},
    ];

Vue Router传递参数

1.Vue Router传递参数
只要将Vue Router挂载到了Vue实例对象上, 我们就可以通过vue.$route拿到路由对象
只要能拿到路由对象, 就可以通过路由对象拿到传递的参数

方式一: 通过URL参数参数(?key=value&key=value), 通过this.route.query获取 方式二: 通过占位符传递(路由规则中/:key/:key, 路径中/value/value), 通过this.route.params获取

第一种传递参数的方式: 通过URL参数的方式传递
在指定HASH的时候, 通过?key=value&key=value的方式传递
在传递的组件的生命周期方法中通过 this.$route.query的方式来获取

    <router-link to="/one?name=lnj&age=33" tag="button">切换到第一个界面</router-link>

第二种传递参数的方式: 通过路由规则中的占位符传递
在指定路由规则的时候通过/:key/:key的方式来指定占位符
在指定HASH的时候, 通过/value/value的方式来传递值
在传递的组件的生命周期方法中通过 this.$route.params的方式来获取

   <router-link to="/two/zs/66" tag="button">切换到第二个界面</router-link>
    const one = {
        template: "#one",
        created: function () {
            console.log(this.$route);
            console.log(this.$route.query.name);
            console.log(this.$route.query.age);
        }
    };
    const two = {
        template: "#two",
        created: function () {
            console.log(this.$route);
            console.log(this.$route.params.name);
            console.log(this.$route.params.age);
        }
    };

嵌套路由

1.什么是嵌套路由?
嵌套路由也称之为子路由, 就是在被切换的组件中又切换其它子组件
例如: 在one界面中又有两个按钮, 通过这两个按钮进一步切换one中的内容

<template id="one">
    <div class="onepage">
        <div>我是第一个界面</div>
        <router-link to="/one/sub1" tag="button">第一个子界面</router-link>
        <router-link to="/one/sub2" tag="button">第二个子界面</router-link>
        <router-view></router-view>
    </div>
</template>

注意点: 如果是嵌套路由(子路由), 那么不用写一级路径的地址, 并且也不用写/

    // 2.定义切换的规则(定义路由规则)
    const routes = [
        // 数组中的每一个对象就是一条规则
        {
            path: '/one',
            component: one,
            children:[
                {
                    // 注意点: 如果是嵌套路由(子路由), 那么不用写一级路径的地址, 并且也不用写/
                    path: "onesub1",
                    component: onesub1
                },
                {
                    // 注意点: 如果是嵌套路由(子路由), 那么不用写一级路径的地址, 并且也不用写/
                    path: "onesub2",
                    component: onesub2
                }
            ]
        },
        // { path: '/one/onesub1', component: onesub1 },
        // { path: '/one/onesub2', component: onesub2 },
        { path: '/two', component: two }
    ];

完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
    <!--    1.导入vue-router,需要在vue导入之后再导入-->
    <script src="vue-router.js"></script>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        .onepage, .twopage{
            width: 500px;
            height: 500px;
        }
        .onepage{
            background: pink;
        }
        .twopage{
            background: skyblue;
        }
        .sub1page{
            width: 500px;
            height: 200px;
            background: green;
        }
        .sub2page{
            width: 500px;
            height: 200px;
            background: palevioletred;
        }

        /*.router-link-active{*/
        /*    background-color: red;*/
        /*}*/
        .shanjialan-active{
            background-color: skyblue;
        }
    </style>
</head>
<body>
<div id="app">
    <!--    6.创建URL进行路由跳转显示-->
    <router-link to="/one" tag="button">第一个界面</router-link>
    <router-link to="/two" tag="button">第二个界面</router-link>
    <!--    <a href="#/one">第一个界面</a>-->
    <!--    <a href="#/two">第二个界面</a>-->
    <!-- 路由匹配到的组件将渲染在这里 -->
    <router-view></router-view>
</div>
<template id="one">
    <div class="onepage">
        <div>我是第一个界面</div>
        <router-link to="/one/sub1" tag="button">第一个子界面</router-link>
        <router-link to="/one/sub2" tag="button">第二个子界面</router-link>
        <router-view></router-view>
    </div>
</template>
<template id="two">
    <div class="twopage">我是第二个界面</div>
</template>
<template id="sub1">
    <div class="sub1page">我是第二个界面</div>
</template>
<template id="sub2">
    <div class="sub2page">我是第二个界面</div>
</template>
<script>
    // 2.定义组件
    const one={template:"#one"};
    const two={template:"#two"};
    const sub1={template:"#sub1"};
    const sub2={template:"#sub2"};
    // 3.定义路由规则
    const routes=[
        // 重定向路由
        { path: '/', redirect: '/two' },
        {
            path:"/one",
            component:one,
            children:[
                {path:'sub1',component:sub1},
                {path:'sub2',component:sub2},
            ]

        },
        {path:"/two",component:two},
    ];
    //3. 创建vue-router实例
    const router=new VueRouter({
        routes:routes,
        // 指定导航激活状态样式类名
        linkActiveClass: "shanjialan-active"
    });
    let vue=new Vue({
        el:"#app",
        components:{
            one:one,
            two:two
        },
        //4. 将vue-router实例绑定大vue实例上
        router:router
    });
</script>
</body>
</html>
image.png

命名视图

1.什么是命名视图?
命名视图和前面讲解的具名插槽很像, 都是让不同的出口显示不同的内容
命名视图就是当路由地址被匹配的时候同时指定多个出口, 并且每个出口中显示的内容不同

2.和具名插槽一样, 如果想同时显示多个不同的组件, 那么可以给出口指定名称

  • 1.在路由规则中给组件起名称,命名名字:组件名字
  • 2.在出口中指定显示哪个名称的组件 name="命名名字"
    const routes = [
        // 数组中的每一个对象就是一条规则
        {
            path: '/',
            components: {
                name1: one,
                name2: two
            }
        },
    ];
<div id="app">
    <router-view name="name1"></router-view>
    <router-view name="name2"></router-view>
</div>

watch

1.什么是Watch属性?
Watch属性是专门用于监听数据变化的, 只要数据发生了变化, 就会自动调用对应数据的回调方法

2.Watch监听路由变化
Watch属性不仅仅能够监听数据的变化, 还能够监听路由地址的变化
在企业开发中我们可以通过Watch来判断当前界面是从哪个界面跳转过来的

3.可以通过watch监听Model中数据的变化, 只要数据发生变化, 就会自动调用对应的回调函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>

</head>
<body>
<div id="app">
    <input type="text" v-model="num1">
    <span>+</span>
    <input type="text" v-model="num2">
    <span>=</span>
    <input type="text" v-model="res" disabled>

</div>
<script>
    let vue=new Vue({
        el:"#app",
        data:{
            num1:0,
            num2:0,
            res:0
        },
        watch:{
            num1:function (newValue,oldValue){
               this.res = parseInt(this.num1)+parseInt(this.num2)
            },
            num2:function (newValue,oldValue){
                this.res = parseInt(this.num1)+parseInt(this.num2)
            }
        }
    });
</script>
</body>
</html>

image.png

** 可以通过创建的vue实例对象的Route监听路由的变化vue.$route**
console.log(vue.$route);

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

推荐阅读更多精彩内容