咱們在開發單頁面應用時,有時須要進入某個路由後基於參數從服務器獲取數據,那麼咱們首先要獲取路由傳遞過來的參數,從而完成服務器請求,因此,咱們須要瞭解路由傳參的幾種方式,如下方式同 vue-router@4
。前端
除了使用
<router-link>
建立 a 標籤來定義導航連接,咱們還能夠藉助 router 的實例方法,經過編寫代碼來實現。
params
傳遞
路徑參數 用冒號
:
表示。
const routes = [ // 動態段以冒號開始 { path: 'details/:id', name: "details", component: Details }, ]
router.push()
方法的參數能夠是一個字符串路徑,或者一個描述地址的對象。
const Home = { template: '<div @click="toDetails">To Details</div>', metheds: { toDetails() { // 字符串路徑 this.$router.push('/details/001') // 帶有路徑的對象 this.$router.push({path: '/details/001'}) // 命名路由,路由配置時,須要 name 字段 this.$router.push({ name: 'details', params: { id: '001' } }) } } }
注意,若是提供了 path
,params
會被忽略:vue
// `params` 不能與 `path` 一塊兒使用 router.push({ path: '/details', params: { id: '001' } }) // -> /details
當一個路由被匹配時,它的
params 的值將在每一個組件中以
this.$route.params
的形式暴露出來。
const Details = { template: '<div>Details {{ $route.params.id }} </div>', created() { // 監聽路由變化 this.$watch( () => this.$route.params, (toParams, previousParams) => { // 對路由變化作出響應... } ) }, }
query
傳遞這種狀況下 query
(查詢參數)傳遞的參數會顯示在 url 後面,如:/details/001?kind=car
。vue-router
使用 query
時,如下三種方式都是可行的:編程
this.$router.push('/details/001?kind=car')
this.$router.push({ path: '/details/001', query: { kind: "car" }})
this.$router.push({ name: 'details', params: { id: '001' }, query: { kind: 'car' }})
組件經過 $route.query
獲取:服務器
const Details = { template: '<div>Details {{ $route.query.kind }} </div>', created() { // 監聽路由變化 this.$watch( () => this.$route.query, (toParams, previousParams) => { // 對路由變化作出響應... } ) }, }
要對同一個組件中參數的變化作出響應的話,你能夠簡單地 watch$route
對象上的任意屬性,在這個場景中,就是$route.query
。
hash
傳遞經過此方式,url 路徑中帶有 hash
,例如:/details/001#car
。ide
使用 hash
時,如下三種方式都是可行的(同 query
):函數
this.$router.push('/details/001#car')
this.$router.push({ path: '/details/001', hash: '#car'})
this.$router.push({ name: 'details', params: { id: '001' }, hash: 'car'})
組件經過 $route.hash.slice(1)
獲取:this
const Details = { template: '<div>Details {{ $route.hash.slice(1) }} </div>', }
在組件中使用$route
會與路由緊密耦合,這限制了組件的靈活性,由於它只能用於特定的 URL。雖然這不必定是件壞事,但咱們能夠經過props
配置來解除這種行爲。
以解耦的方式使用 props
進行參數傳遞,主要是在路由配置中進行操做。url
當 props
設置爲 true
時,route.params
將被設置爲組件的 props。spa
例以下面的代碼是經過 $route
的方式獲取動態字段 id
:
const User = { template: '<div>User {{ $route.params.id }}</div>' } const routes = [{ path: '/user/:id', component: User }]
將上面的代碼替換成 props
的形式,以下:
const User = { props: ['id'], // 組件中經過 props 獲取 id template: '<div>User {{ id }}</div>' } // 路由配置中,增長 props 字段,並將值 設置爲 true const routes = [{ path: '/user/:id', component: User, props: true }]
注意:對於有命名視圖的路由,你必須爲每一個命名視圖定義 props
配置:
const routes = [ { path: '/user/:id', components: { default: User, sidebar: Sidebar }, // 爲 User 提供 props props: { default: true, sidebar: false } } ]
當 props
是一個對象時,它將原樣設置爲組件 props。當 props 是靜態的時候頗有用。
const routes = [ { path: '/hello', component: Hello, props: { name: 'World' } } ]
const Hello = { props: { name: { type: String, default: 'Vue' } }, template: '<div> Hello {{ name }}</div>' }
<Hello />
組件默認顯示 Hello Vue,但路由配置了 props
對象,當路由跳轉到 /hello
時,會顯示傳遞過來的 name
, 頁面會顯示爲 Hello World。
能夠建立一個返回 props 的函數。這容許你將參數轉換爲其餘類型,將靜態值與基於路由的值相結合等等。
使用函數模式時,返回 props 的函數接受的參數爲路由記錄 route
。
// 建立一個返回 props 的函數 const dynamicPropsFn = (route) => { return { name: route.query.say + "!" } } const routes = [ { path: '/hello', component: Hello, props: dynamicPropsFn } ]
當 URL 爲 /hello?say=World
時, 將傳遞 {name: 'World!'}
做爲 props 傳給 Hello
組件。
const Hello = { props: { name: { type: String, default: 'Vue' } }, template: '<div> Hello {{ name }}</div>' }
此時頁面將渲染:
注意:請儘量保持 props
函數爲無狀態的,由於它只會在路由發生變化時起做用。若是你須要狀態來定義 props,請使用包裝組件,這樣 vue 才能夠對狀態變化作出反應。
1. 經過 Vuex 進行傳遞
1. store 存儲狀態; 2. A 組件更改 store 中的狀態; 3. B 組件從 store 中獲取。
2. 經過前端本地存儲等方式
1. Local Storage; 2. Session Storage; 3. IndexedDB; 4. Web SQL; 5. Cookies。