# [Vue cli] Vue router路由配置 ###### tags: `Vue.js` ## 新增路由路徑及連結 ``` <ul class="navbar-nav mr-auto"> <li class="nav-item "> <router-link class="nav-link" :to="{name:'HelloWorld'}">Hello</router-link > </li> <li class="nav-item "> <router-link class="nav-link" to="/Page">Page</router-link > </li> </ul> ``` 其中程式碼中 router-link 是切換路由的標籤,可以直接給定定義好的完整 url ,如 to="/Page",或者給定定義的命名好的路由物件 :to="{name:‘HelloWorld’}",注意傳物件的時候要加上 v-bind。 除了聲明式外,也可在程式中利用 this.$router.push('/Page'); 或 this.$router.push('{name:'HelloWorld'}'); 進行跳轉,需注意的是,在實務中要使用文件所提到 method ,如:router.push,需加上前綴變成 this.$router.push 才能成功調用。 <font color="red">比起傳送完整的 url ,個人更喜歡傳送路由物件,可讀性更高,程式維護起來也比較容易</font>,尤其當還需要傳遞 params 與 query 時,還可以避免做字串串接。 ## router-view顯示配置說明 ``` <router-view></router-view> ``` <router-view>放置在Dashboard下指定區域,跳轉並顯示各個vue元件的畫面(children內的子元件),只要在index.js內的路徑依附在Dashboard陣列內即可。 ``` path:'/admin', name:'Dashboard', component: Dashboard, children:[ { path:'products', //巢狀http://admin/products name:'products', component: Products, meta: { requiresAuth: true }, }, { path:'orders', //巢狀http://admin/orders name:'orders', component: Order, }, ``` ## 使用動態路由切換頁面 Ajax 結果 以博客來為例,在商品介紹頁中皆使用了相同版型,並仔細觀察相對應的網址,可以發現網址皆為 https://www.books.com.tw/products/商品ID 的樣式。在 Vue 中這樣的情況可以採用動態路由來實做,將符合 products/:id 這樣的路由,全導向特定商品介紹的元件,而實際載入的商品資料由 id 來控制。 ``` created(){ const id = this.$route.params.id; this.$http.get(`https://randomuser.me/api/?seed=${id}`).then((res)=>{ const personalData = res.data.results[0]; this.name = personalData.name; }) }, ``` `https://randomuser.me/api/?seed=${id}` 這是由 randomuser 所提供的 API ,給定一個 seed 後,會回傳特定使用者資料,而所送出的 seed 是取自 `this.$route.params.id `,也就是 url 匹配所定義的匹配模式後,所得到的路徑參數路徑參數 。 this.$http.get 是一個非同步的動作,最終取得一個 Promise ,必須再呼叫 then 將個人資料取出放入變數,最終將變數在 UI 中呈現。 總結:在router先設定:id做動態路由,再到指定Vue元件以params公式來取得動態id的資料,再依照API指示post至後端資料庫。 ## 命名路由,同一個路徑載入兩個頁面元件 如果時候想同時(同級)展示多個元件,例如建置一個 layout 時,會存在 sidebar 、 header 、 footer …等元件,這時可以使用命名路由來載入,即在 layout 中添加命名 router-view。一般來說,如果router-view沒有設置名字,那麼預設為 default。命名則需加入name="名稱"就可跟預設做區隔。 ``` <template> <div class="hello"> <router-view name="menu"></router-view> <div class="card" style="width: 18rem;"> <router-view></router-view> </div> </div> </template> ``` 並在 router 設定相對定的設置。一個路由若要選染多個元件,並需改用 components(有 s),預設元件放置default,命名的部分則寫入vue元件裡的router-view的名稱,及router支援的import路徑名稱 ``` { name: "Page", path: "/Page", components: { default: Page, menu: menuComponent, }, children:[...] } ```