Andy's blog

If you always do what you've always done, you'll always get what you've always got.

0%

Vue-router簡介

參考資料:


Vue Router簡介

Vue Router就是由前端模擬的路由,跟過去不同的是,換頁通常會由後端處理。而Vue Router存在就是為了實現SPA(單頁式應用),當我們切換畫面時候就不需要向後端發出請求。
https://ithelp.ithome.com.tw/upload/images/20191011/20114645YbmE2Kc44N.png

安裝方式

一、方法一
1.npm install vue-router
不用寫成這樣npm install vue-router --save
因為,Npm5.0.0版本後,安裝的套件會預設自動加入dependency
連結說明

2.接著在終端機中輸入 npm run serve
補充:使用npm run dev,會出錯因為package.json沒有這行指令
vue开发—-npm run dev 报错:missing script:dev
原因:
npm run dev是Vue CLI2指令
npm run serve則是Vue CLI3指令

兩者不可以混用喔!

3.接著要在router.js啟用Vue.use(VueRouter)

二、方法二
創建新的檔案時( vue create project),就直接勾選Vue router,Vue就會幫我們直接新增router.js

以上兩種方式,都可以安裝Vue Router


路由配置介紹

組件名詞介紹

<router-view></router-view> 呈現路由配置元件
<router-link></router-link> 路由路徑
main.js 進路點
Vue Components(如:app.vue檔) 分頁內容

路由配置教學

配置路由會在router.jsmain.jsapp.vue這三個檔案設定

  • router.js
    主要負責處理路由檔案配置管理。
    https://ithelp.ithome.com.tw/upload/images/20191011/20114645s9G1Y2S8jv.png
    補充:

1.@是絕對路徑,src 目錄的縮寫
2.export default 是 ES6 的模組匯出概念

  • main.js
    Webpack進入點
    https://ithelp.ithome.com.tw/upload/images/20191011/20114645XFRZWs5HCz.png
  • app.vue
    在這被拿來當作首頁使用,若有其他預設首頁可以自行更換
    https://ithelp.ithome.com.tw/upload/images/20191011/20114645hbPqdR5BJj.png

補充:首頁路徑問題

1.我們可以把‘/‘路徑視為預設載入首頁
2.假設今天,我們沒有‘/‘也沒有redirect指令如下,這時候載入畫面就會是空白的喔!這原理就如同建立網頁沒有設 index.html(首頁) 即使輸入網址,網頁也是顯示錯誤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
export default new Router({
routes: [
{
path: '/login',
name: 'Login',
component: Login
},
{
path: '/admin',
name: 'Dashboard',
component: Dashboard,
children: [
{
path: 'products',
name: 'Products',
component: Products,
meta: { requiresAuth: true },
}
]
}
]
})

小結論:

預設首頁要使用‘/‘redirect指令,不然網頁會空白

巢狀路由

寫法其實跟一般路由配置相同,差異點僅在於巢狀路由會新增一個children配置底下分頁路由,以下就由我簡單示範一下。

  • Page.vue檔案:
    說明:我們會在要配置路由主頁,新增路由配置
    https://ithelp.ithome.com.tw/upload/images/20191011/201146459c5iPJmzZF.png
  • Router.js檔案:
    說明:所有路由檔案路徑配置都是在router.js檔案下,新增巢狀僅是在特定頁面下新增children:[ { } ]而已
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    {
    path:'/page',//對應的虛擬路徑
    name:'分頁',//元件呈現的名稱
    component:Page,//對應元件
    children:[
    {
    path:'',//如果沒有填入入境,元件child1預設會是主頁
    name:'child1',
    component:child
    },
    {
    path:'child2',
    name:'child2',
    component:child2
    ]
    },

    動態路由

    前置作業:

1.安裝 Vue-axios NPM安裝連結
2.安裝 random Api 連結

使用目的:

切換不同id時候,置換對應內容。開發時候會由後端提供定義好的id,前端在拿來套用切換即可。應用在後端權限控制上 參考文章
參考文件:路由對象屬性介紹
寫法拆解如下:

  • Router.js檔案
    https://ithelp.ithome.com.tw/upload/images/20191011/20114645I33Gjs3n97.png
  • 分頁:child3.vue
    https://ithelp.ithome.com.tw/upload/images/20191011/20114645XK3hRP3Nwo.png
  • Main.js
    https://ithelp.ithome.com.tw/upload/images/20191011/20114645pELcjeLRBv.png

同一個頁面載入不同元件

補充:router-view
「我們可以透過 vue-router 的設定檔來定義整體網站的路由規則,利用 router-view 來定位子路由組件渲染的出口,並可允許訂定多組具名 router-view 來一次顯示多個子組件於單一子路由中。」
白話文:父組件中會包含 router-view作為子組件的渲染出口!

  • index.js
    https://ithelp.ithome.com.tw/upload/images/20191011/201146450w3dCkq2mr.png
    說明:補充1,因為child1如果不填寫入徑,會預設上層項目。故,我們要將
    上層”name”隱藏
  • App.vue
    這邊可以視為首頁,換句話說就是整個 vue 包在最外層的父元件
    https://ithelp.ithome.com.tw/upload/images/20191011/20114645PbFRWfL6VY.png
  • Menu.vue 和 page.vue
    https://ithelp.ithome.com.tw/upload/images/20191011/20114645RnaqTRzu77.png

問題詢問

我把檔案做了以下調整
1.上方App.vue檔中,我移除<router-view name=“menu”></router-view>
2.在上方page.vue中新增 <router-view name=“menu”></router-view>
結果畫面只出現child1分頁內容,為何?
https://ithelp.ithome.com.tw/upload/images/20191011/20114645OkhNWhAzQ4.png
A:因為如果我把<router-view name=“menu”></router-view>放在page.vue中,我們會把menu變成page 的子組件,因此畫面上不會出現。
如果更改為下面範例:

1
2
3
4
5
6
7
8
{
path: '',
name: 'child 1',
components:{
default: child,
menu: Menu,
},
},

畫面就可以成功出現摟
https://ithelp.ithome.com.tw/upload/images/20191011/20114645eAxvgxo5Bw.png

小結論

router-view
白話文:父組件中會包含 router-view作為子組件的渲染出口!
參考文章:跟著 Vue 闖盪前端世界
https://ithelp.ithome.com.tw/upload/images/20191011/20114645ccGwYDGlsl.png


常用Vue Router 參數設定

Router建構選項

參考文件

  • mode
    可以將路由中#移除,但建議還是保留預設狀態即可(原因是因為移除後,就必須和後端配合路由切換)
  • linkActiveClass
    可以將標籤className替換
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    export default new VueRouter({
    mode:'history',
    // 可以將路由中#移除,但必須提醒若將#移除就不是前端模擬路由。
    // 而是後端切換路由,因此後端路徑也必須重新配置
    linkActiveClass:'active', //標籤className替換
    routes: [
    {
    path: '/index', //對應的虛擬路徑
    name: 'home', //元件呈現的名稱
    component: Home, //對應元件
    },
    ]
    });

    切換路徑方法

    文件參考
    https://ithelp.ithome.com.tw/upload/images/20191011/20114645i5HRHGJC26.png
    補充說明:
  • 為何官網上寫router.push(‘/page/child2’),而我們這邊卻使用
    this.$router.push(‘/page/child2’)呢?
    A:原因在於我們在main.js中,有先執行了 vue.use(….),因此外部資源會被掛載到 vue 內。所以就可以使用 this 來呼叫這些資源
  • 比較:
    router.push() 會向history添加新記錄,當用戶點擊瀏覽器後退按鈕時,則回到之前的URL。
    router.replace() 不會向history添加新記錄