Vue-Router 動態路由匹配


Vue-Router 動態路由匹配

1,路由參數變化(match 模式)

舉例:

const router = new VueRouter({

  routes: [

       // 動態路徑參數 以冒號開頭,  /user/foo 和 /user/bar 都將映射到相同的路由

       { path: '/user/:id', component: User }

  ]

});

 

/user/:username/post/:post_id 多個路由變量,也都可以再 this.$route.params中獲取

注意: 從 /user/foo 到 /user/bar組件會被復用,組件不會卸載再加載不會觸發生命周期鈎子,可以使用監聽器監聽 $route 觀察路徑變化,組件內作出正確的響應,2.2版本提供 beforeRouteUpdate 路由鈎子使用此場景

 

 

2,匹配任意路徑或導航到404

通配符 路由,有通配符路由的地址,應該放在路由配置后面,保證路由執行順序

{

    // 會匹配所有路徑,,用途:放在路由配置最后,,不管輸入什么地址都是不在范圍內,需要轉到404

    path: '*'

}

{

    // 會匹配以 `/user-` 開頭的任意路徑

    path: '/user-*'

}

需要獲取匹配到的路徑的模糊字段值,可以從 params 中的 pathMatch 獲取

如果是 History模式,跳轉到未知路徑需要報404,因為history模式下路徑會訪問后端發器請求,需要后台服務配合解決404的場景。

 

高級匹配模式  和 匹配優先級

https://github.com/pillarjs/path-to-regexp#parameters path-to-regexp 匹配一個或多個,匹配一類等高級用法。

優先級:  匹配的優先級就按照路由的定義順序:誰先定義的,誰的優先級就最高。

 

 

3,嵌套路由 

路由組件配置中需要增加 children 字段,字段值結構一致,表示子路由路徑。

在index入口的html結構中,div id為app的標簽內使用增加了 <router-view></router-view> 這是頂層視圖出口,一個 <router-view>表示一個視口。

所以,如果需要實現 子路由路徑跳轉切換,就要增加一個 <router-view> 作為新的路由視口,渲染在 children 所在的 component的 <router-view></router-view> 里。

可以path為空會定位到父級根路徑。

編程式的導航

  • this.$router.push(location, onComplete, onAbort)

普通的導航跳轉是使用導航鏈接 <router-link>,也可以通過編寫代碼來實現同樣的效果,

this.$router.push 會向history路徑棧中push一個路徑,達到和 router-link一樣的效果。注意: 路徑上需要有對應的參數。

傳參方式:  4中
字符串形式

router.push('home')

對象

router.push({ path: 'home' })

命名的路由

router.push({ name: 'user',  params: { userId: '123' }})   會自動轉換成 /user/123

router.push({ path: `/user/${userId}` })   只有這兩種方式可以給router傳 params。

以下方式調用無效!!!   變成  /user 因為不能是path

router.push({ path: 'user',  params: { userId: '123' }})   

帶查詢參數

router.push({ path: 'register', query: { plan: 'private' }})   query 可以對應 path。 轉換為 /register?plan=private

 

注意: 以上規則同時適用於  link  的  to 。

push、replace   修改路徑時,會執行回調函數,onComplete(調用完成)  onAbort (路由終止)

  • this.$router.replace(location, onComplete ?, onAbort ?)

replace 和 push 的區別:

唯一的區別是replace不會向history中添加新的記錄,僅僅是替換掉當前history

  • this.$router.go(Integer)

表示history記錄中向前或向后進行多少步。 如果超過history中的步數會靜默失敗。

 

 

4,路由命名視圖

具名視圖可以提供視圖分塊的效果,在同一路徑下,對應多個視圖不同組件的更新,一個components中設置的組件跳轉。

<router-view></router-view>

<router-view name="a"></router-view>

<router-view name="b"></router-view>

視圖嵌套:多層嵌套,多個視圖的情況,需要注意 components 中組件的配置,和 router-view 中的name 對齊。

routes: [

   {

       path: '/',

       components: {    // 此處有component 單個組件和 多個組件 帶有s的區別

           default: Bind,

           a: AccountManage,

           b: IMManage

       }

   }]

 

5,重定向和別名

 

路徑重定向:  參數類型支持 3 種,字符串,對象,函數返回值

{

   path: '/',

   redirect: '/newpath',

   redirect: { name: 'newpath' },

   redircet: to => {

      // ....to 僅僅是當前路徑對象的信息,不是路由守衛。

      return "/newpath/`${other}`"

   }

}

重定向是把一個路徑替換成其他路徑,渲染新的路徑的組件,別名有所不同,設置別名訪問路徑和訪問別名是一樣的。不過,需要注意,alias別名的名稱如果要覆蓋已有路徑規則,需要放在路徑名的配置之前,因為優先級從前向后。

 

 

6,路由組件傳參

 

在組件中直接使用 this.$route.params 會降低組件復用的靈活性,那咋辦?

解耦將變量以props的形式傳遞給組件。 也更加方便,組件的重用和測試

 

大致有 3 種在路由配置中給組件傳遞props的模式:布爾模式,對象模式,函數模式

 

{

      path:'/newsinfo/:content',    // 如果不想在地址欄展示參數可以不寫content,

                                               // router.push(name, params)  可以傳參,且不展示在URL。

      name:'newsinfo',                 // router.push(path, query),可以傳參,格式是?content=value 會展示。

      props:true,

      component: () =>apply('NewsInfo')

},

const User = {

   props: ['id'],

   template: '<div>User {{ id }}</div>'

}

const router = new VueRouter({

   routes: [

       { path: '/user/:id', component: User, props: true },

       // 對於包含命名視圖的路由,分別給每個命名視圖添加 `props` 選項: 處理多視圖公用路由傳參的情況

       {

          path: '/user/:id',

          components: { default: User, sidebar: Sidebar },

          props:            { default: true, sidebar: false }

       }

    ]

})

props 除了使用bool型(會將params設置為組件的屬性),還可以使用

對象型(使用對象型,對象作為組件的屬性),

函數型(函數返回值作為組件的屬性,必須盡量保證函數是純函數,只在調用時返回給組件一個可靠的值)

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM