第三十四节:Vue路由:Vue-router动态路由

前沿:

上面我们定义的路由,都是严格匹配的:

只有router-link 中的to属性和 js 中一条路由route中 path 一模一样,

才能显示相应的组件component. 但有时现实却不是这样的,


例如: 如下的需求:

当我们访问网站并登录成功后,它会显示 " 欢迎你,+ 你的名字" 。

不同的用户登录, 只是显示“你的名字” 部分不同,其它部分是一样的。

这就表示,它是一个组件,假设是user组件。不同的用户(就是用户的id不同),它都会导航到同一个user 组件中。这样我们在配置路由的时候,就不能写死, 就是路由中的path属性,

那我们接下来就看看动态路由应该如何设置:


1. 动态路由的配置

1.1 回顾node中的动态路由

其实在之前的node课程中,就提到多动态路由的配置,

例如:
我希望 用来在访问/students/100001/students/100002的时候

都能匹配到同一个路由,走同一个路由处理函数, 咱们就得定义/students/:sid的路由

此时:sid就是动态的部分,这条路由就是动态路由,同时可以利用req.params.sid来获取路由的不同部分的数据


1.2 vue-router中动态路由

vue-router中动态路由的定义和node差别不太,唯一的差别就在动态路由参数的获取,先看动态路由的定义:

组件信息

<!-- 首页组件 -->
<template>
    <div id="home">
        <h2>首页</h2>
        <p>首页页面</p>
    </div>
</template>

<!-- 用户组件 -->
<template>
    <div id="user">
        <h2>用户</h2>
        <p>用户页面</p>
    </div>
</template>

配置动态路由

// router.js文件
// 配置路由映射关系
const routes = [
    {
        path:'/',
        redirect: "/home"
    },
    {
        path:'/home',
        component: Home
    },
    {
        path:'/user/:uname',
        component: User
    },
];

路由使用

<!-- app.vue 文件 -->
<div id="app">
    <router-link to="/home">首页</router-link>

    <!--  增加两个到user组件的导航,使用不同的to属性 -->
    <router-link to="/user/zhangsan">用户张三</router-link>

    <router-link to="/user/lisi">用户李四</router-link>
    
    
    <router-view></router-view>
</div>

通过示例的展示结果, 当你点击用户张三或者用户李四都能进入到User组件中

路由/user/:uname就是一个动态的路由,

:uname部分为任何值都可以匹配到这个路由, 也都会展示User组件


那么问题来了, 在动态路由中,怎么获取到动态部分?

如果不能获取动态的值,如果在页面中展示欢迎谁呢


2. 动态路由参数的获取

2.1 动态路由参数获取的认识

其实,当整个vue-router 注入到根实例后,在组件的内部,可以通过this.$route 来获取到 router 实例。

它有一个params 属性,就是来获得这个动态部分的。

我们可以在计算属性中打印组件实例,看看组件实例上关于$route的值是什么

User组件中:

export default {
    name:"user",
    computed:{
        username(){
            console.log(this)  // 组件实例
            return 123
        }
    }
}

打印结果:

$route值_图1.png

通过打印结果就知道

  1. 组件实例对象上有一个$route属性,这个属性的值是一个对象
  2. $route对象中path属性就是最终匹配成功的路径
  3. $route对象中params属性就是动态路由数据, 是以键值对的形式获取


2.2 获取动态路由参数

修改用户组件,展示欢迎信息

<template>
    <div id="user">
        <h2>用户</h2>
        <p>用户页面</p>
        <p>欢迎你: {{ username }}</p>
    </div>
</template>

<script>
    export default {
        name:"user",
        computed:{
            username(){
                return this.$route.params.uname
            }
        }
    }
</script>

此时当你切换内容的时候,就会显示不同的信息

也可以直接将内容渲染到页面

代码如下

<template>
    <div id="user">
        <h2>用户</h2>
        <p>用户页面</p>
        <!-- 在模板中使用数据不用加this -->
        <p>欢迎你: {{ $route.params.uname }}</p>
    </div>
</template>

<script>
    export default {
        name:"user",
    }
</script>


3. $route监听

这里还有一个问题,就是动态路由在来回切换时,由于它们都是指向同一组件,vue不会销毁再创建这个组件.而是复用这个组件,

因此,当第一次点击 用户张三 的时候,vue 把对应的组件渲染出来,但在用户张三, 用户李四点击来回切换的时候,这个组件就不会发生变化了。

这时如果想要在组件来回切换的时候做点事情,那么只能在组件内部(user.vue中)利用watch 来监听$route 的变化。把上面的代码用监听$route 实现

<script>
    export default {
        data () {
            return {
                dynamicSegment: ''
            }
        },
        watch: {
            $route (to,from){
                // to,from表示User组件内$route的改变
                console.log(to);
                console.log(from);
                this.dynamicSegment = to.params.id
            }
        }
    }
</script>


4. 关于router-link中的to属性

说明:

  1. 在当前示例中,我们使用了,两个路由导航,真实的案例中可能就只有一个导航
  2. 根据登录的用户不同,router-link中的to属性指定的路由为不同的路由
  3. 那么我们就需要让router-link中to属性成为动态改变

修改示例:

<template>
    <div id="app">
        <router-link to="/home">首页</router-link>

        <!-- 动态to属性 -->
        <router-link :to="'/user/' + uname">用户</router-link>

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

<script>
    export default {
        name: 'App',
        data(){
            return {
                uname:"张三",    
            }
        }
    }
</script>

示例说明:

  1. to属性使用了v-bind动态绑定,因此to属性值不在是字符串,而是表达式
  2. 因此在表达式中把'/user/'字符串和uname变量组合为不同的路由
  3. uname变量根据data中的数据发生改变, 不用的用户登录,uname就为不同的数据,可以从表单中获取.

这样我们就可以通过数据动态改变路由, 一个导航实现了动态路由处理.

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