Vue.js 中的动态路由

Posted 十木禾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue.js 中的动态路由相关的知识,希望对你有一定的参考价值。

在文章 使用vue-router完成简单导航功能 中实现的路由导航功能是不能传递参数的,也就是说是静态路由。

而能传递参数的路由模式,由于可以传递参数,所以其对应的路由数量是不确定的,故称之为 动态路由

那么如何将参数作为路由呢?

在参数名前面加上 : ,然后将参数写在路由的 path

如下示例:

  routes: [
    //将页面组件与path指令的路由关联
     name: 'BookInfo', path: '/books/:id', component: BookInfo 
  ]

这样定义之后,vue-router就会匹配所有的:/books/1,/books/2,/books/3 ……,所以说这样定义的路由的数量是不确定的。

<router-link> 我们加入一个 params 属性来指定具体的参数值

        <li>
          <router-link :to ="name:'BookInfo',params :id:1" >
            <div>首页</div>
          </router-link>
        </li>

上面的链接对应就为:http://localhost:8080/__dirname/books/1

如果需要传入多个参数值,只要按照上面的命名方法来加入参数,传递在params中对应的声明参数值即可,vue-router只要匹配到路由模式的定义就会自动对参数进行分解取值
path: '/books/version/:id',则对应params为:params :id:1,version:1


那么现在就面临这一个问题 —— 如何从路由中将这个参数值读取出来呢?
答:通过 $route.params这个属性获取指定的参数值,如:this.$route.params.id,this.$route.params.msg

如果希望在相应的组件页面内输出参数值,对应代码如下:

<p>当前图书编号是:$route.params.id</p>

如果想在js代码中根据参数值做相应的处理,则在默认路由中加入如下代码:

export default 
  name: "app",
  created() 
    alert(this.$route.params.id);
  
;

当使用路由参数的时候,如 从/books/1/books/2 ,原来的组件实例会被复用,因为两个路由都渲染同一个组件,比起销毁后再创建,复用的销率会更高。
这也就是说 组件的生命周期钩子不会再被调用(组件没有被销毁后再创建) ,即 created mounted 等钩子函数在页面第二次加载的时候回失效。

那么,当复用组件时候,想对路由参数的变化做出响应的话,就需要在 $watch 对象内添加对 $route 对象变化的跟踪函数

<script>
export default 
  name: "app",
  watch :
    '$route' (to,from)
      alert(to.params.id);
    
  
;
</script>

$route.params 定义的参数必然是整个路由的其中一部分,vue-router 还可以让我们使用 "/path?param = value" 的方式传递参数,可以使用$route.query.参数名 获取参数值
vue-router 还提供一种常量参数定义 meta,我们可以在路由定义中先定义 meta 的值,然后在路由实例中通过$route.meta 参数获取具体常量值。

如下代码($route.query.参数名

 name: 'BookInfo', path: '/books/:id/?bookName=Lost', component: BookInfo 

获取其中 bookName 的值的代码为 this.$route.query.msg

如下代码($route.meta.参数名

 name: 'BookInfo', path: '/books/:id', component: BookInfo ,meta:  bookName : 'Lost In River' 

获取其中 bookName 的值的代码为 this.$route.meta.bookName

以上是关于Vue.js 中的动态路由的主要内容,如果未能解决你的问题,请参考以下文章

vue js中vue路由器的动态路由与strapi headless CMS - 路由器链接和href标签抛出错误

vue.js 中用于导航到动态路由的动态按钮

CSS 在动态路由上不能与 vue js 一起使用

Vue系列:Vue Router 路由梳理

Vue-cli4 对路由配置的一些理解

如何从动态列表中为 Vue 中的 API 响应创建列表渲染 JSON?