在文章使用vue-router完成簡單導航功能 中實現的路由導航功能是不能傳遞參數的,也就是說是靜態路由。而能傳遞參數的路由模式,由於可以傳遞參數,所以其對應的路由數量是不確定的,故稱之為 動態路由。
那麼如何將參數當作路由呢?
##如下範例:在參數名稱前面加上
:
,然後將參數寫在路由的path
內
routes: [ //将页面组件与path指令的路由关联 { name: 'BookInfo', path: '/books/:id', component: BookInfo } ]
vue-router就會符合所有的:
/books/1,/books/2,/books/3 …,所以說這樣定義的路由的數量是不確定的。
我們加入一個
params 屬性來指定特定的參數值
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;"> <li>
<router-link :to ="{name:&#39;BookInfo&#39;,params :{id:1}}" >
<p>首页</p>
</router-link>
</li></pre><div class="contentsignin">登入後複製</div></div><div class="contentsignin">登入後複製</div></div>
如果需要傳入多個參數值,只要按照上面的命名方法來加入參數,傳遞在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
動態路由
那麼如何將參數當作路由呢?在參數名稱前面加上:
##如下範例:,然後將參數寫在路由的
path內
routes: [ //将页面组件与path指令的路由关联 { name: 'BookInfo', path: '/books/:id', component: BookInfo } ]
這樣定義之後,
vue-router就會符合所有的:/books/1,/books/2,/books/3 …
,所以說這樣定義的路由的數量是不確定的。 在
我們加入一個params
屬性來指定特定的參數值<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;"> <li>
<router-link :to ="{name:&#39;BookInfo&#39;,params :{id:1}}" >
<p>首页</p>
</router-link>
</li></pre><div class="contentsignin">登入後複製</div></div><div class="contentsignin">登入後複製</div></div>
上面的連結對應就為: http://localhost:8080/__dirname/books/1
如那麼現在就面臨這一個問題- 如何從路由中將這個參數值讀取出來呢?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中的動態路由實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!