天天看點

vue.js學習筆記(二)——vue-router詳解

一、前言

要學習vue-router就要先知道這裡的路由是什麼?為什麼我們不能像原來一樣直接用标簽編寫連結哪?vue-router如何使用?常見路由操作有哪些?等等這些問題,就是本篇要探讨的主要問題

vue.js學習筆記(二)——vue-router詳解

二、vue-router是什麼

這裡的路由并不是指我們平時所說的硬體路由器,這裡的路由就是SPA(單頁應用)的路徑管理器。再通俗的說,vue-router就是WebApp的連結路徑管理系統。

vue-router是Vue.js官方的路由插件,它和vue.js是深度內建的,适合用于建構單頁面應用。vue的單頁面應用是基于路由群組件的,路由用于設定通路路徑,并将路徑群組件映射起來。傳統的頁面應用,是用一些超連結來實作頁面切換和跳轉的。在vue-router單頁面應用中,則是路徑之間的切換,也就是元件的切換。路由子產品的本質 就是建立起url和頁面之間的映射關系。

至于我們為啥不能用a标簽,這是因為用Vue做的都是單頁應用,就相當于隻有一個主的index.html頁面,是以你寫的标簽是不起作用的,你必須使用vue-router來進行管理。

三、vue-router實作原理

SPA(single page application):單一頁面應用程式,隻有一個完整的頁面;它在加載頁面時,不會加載整個頁面,而是隻更新某個指定的容器中内容。單頁面應用(SPA)的核心之一是: 更新視圖而不重新請求頁面;vue-router在實作單頁面前端路由時,提供了兩種方式:Hash模式和History模式;根據mode參數來決定采用哪一種方式。

1、Hash模式:

vue-router 預設 hash 模式 —— 使用 URL 的 hash 來模拟一個完整的 URL,于是當 URL 改變時,頁面不會重新加載。 hash(#)是URL 的錨點,代表的是網頁中的一個位置,單單改變#後的部分,浏覽器隻會滾動到相應位置,不會重新加載網頁,也就是說 #是用來指導浏覽器動作的,對伺服器端完全無用,HTTP請求中也不會不包括#;同時每一次改變#後的部分,都會在浏覽器的通路曆史中增加一個記錄,使用”後退”按鈕,就可以回到上一個位置;是以說Hash模式通過錨點值的改變,根據不同的值,渲染指定DOM位置的不同資料

2、History模式:

由于hash模式會在url中自帶#,如果不想要很醜的 hash,我們可以用路由的 history 模式,隻需要在配置路由規則時,加入"mode: ‘history’",這種模式充分利用 history.pushState API 來完成 URL 跳轉而無須重新加載頁面。

//main.js檔案中
const router = new VueRouter({
  mode: 'history',
  routes: [...]
})
           

當你使用 history 模式時,URL 就像正常的 url,例如 yoursite.com/user/id,比較好看!

不過這種模式要玩好,還需要背景配置支援。因為我們的應用是個單頁用戶端應用,如果背景沒有正确的配置,當使用者在浏覽器直接通路 oursite.com/user/id 就會傳回 404,這就不好看了。

是以呢,你要在服務端增加一個覆寫所有情況的候選資源:如果 URL 比對不到任何靜态資源,則應該傳回同一個 index.html 頁面,這個頁面就是你 app 依賴的頁面。

export const routes = [ 
  {path: "/", name: "homeLink", component:Home}
  {path: "/register", name: "registerLink", component: Register},
  {path: "/login", name: "loginLink", component: Login},
  {path: "*", redirect: "/"}]
           

此處就設定如果URL輸入錯誤或者是URL 比對不到任何靜态資源,就自動跳到到Home頁面

3、使用路由子產品來實作頁面跳轉的方式

方式1:直接修改位址欄

方式2:this.$router.push(‘路由位址’)

方式3:

四、vue-router使用方式

1:下載下傳 npm i vue-router -S

2:在main.js中引入 import VueRouter from ‘vue-router’;

3:安裝插件 Vue.use(VueRouter);

4:建立路由對象并配置路由規則

let router = new VueRouter({routes:[{path:'/home',component:Home}]});
           

5:将其路由對象傳遞給Vue的執行個體,options中加入 router:router

6:在app.vue中留坑

具體實作請看如下代碼:

//main.js檔案中引入
import Vue from 'vue';
import VueRouter from 'vue-router';
//主體
import App from './components/app.vue';
import Home from './components/home.vue'
//安裝插件
Vue.use(VueRouter); //挂載屬性
//建立路由對象并配置路由規則
let router = new VueRouter({
    routes: [
        //一個個對象
        { path: '/home', component: Home }
    ]
});
//new Vue 啟動
new Vue({
    el: '#app',
    //讓vue知道我們的路由規則
    router: router, //可以簡寫router
    render: c => c(App),
})
           

最後記得在在app.vue中“留坑”

//app.vue中
<template>
    <div>
        <!-- 留坑,非常重要 -->
        <router-view></router-view>
    </div>
</template>
<script>
    export default {
        data(){
            return {}
        }
    }
</script>
           

五、vue-router核心要點

1.vue-router如何參數傳遞

①用name傳遞參數

在路由檔案src/router/index.js裡配置name屬性

routes: [
    {
      path: '/',
      name: 'Hello',
      component: Hello
    }
]
           

模闆裡(src/App.vue)用$router.name來接收

比如:

{{ $router.name}}

②通過 标簽中的to傳參

這種傳參方法的基本文法:

<router-link :to="{name:xxx,params:{key:value}}">valueString</router-link>
           

比如先在src/App.vue檔案中

<router-link :to="{name:'hi1',params:{username:'jspang',id:'555'}}">Hi頁面1</router-link>
           

然後把src/router/index.js檔案裡給hi1配置的路由起個name,就叫hi1.

{path:'/hi1',name:'hi1',component:Hi1}
           

最後在模闆裡(src/components/Hi1.vue)用$route.params.username進行接收.

{{$route.params.username}}-{{$route.params.id}}
           

③vue-router 利用url傳遞參數----在配置檔案裡以冒号的形式設定參數。

我們在/src/router/index.js檔案裡配置路由

{
    path:'/params/:newsId/:newsTitle',
    component:Params
}
           

我們需要傳遞參數是新聞ID(newsId)和新聞标題(newsTitle).是以我們在路由配置檔案裡制定了這兩個值。 在src/components目錄下建立我們params.vue元件,也可以說是頁面。我們在頁面裡輸出了url傳遞的的新聞ID和新聞标題。

<template>
    <div>
        <h2>{{ msg }}</h2>
        <p>新聞ID:{{ $route.params.newsId}}</p>
        <p>新聞标題:{{ $route.params.newsTitle}}</p>
    </div>
</template>
<script>
export default {
  name: 'params',
  data () {
    return {
      msg: 'params page'
    }
  }
}
</script>
           

在App.vue檔案裡加入我們的标簽。這時候我們可以直接利用url傳值了

<router-link to="/params/198/jspang website is very good">params</router-link>|
           

2.單頁面多路由區域操作

在一個頁面裡我們有2個以上區域,我們通過配置路由的js檔案,來操作這些區域的内容

①App.vue檔案,在下面新寫了兩行标簽,并加入了些CSS樣式

<template>
  <div id="app">
    <img src="./assets/logo.png">
       <router-link :to="{name:'HelloWorld'}"><h1>H1</h1></router-link>
       <router-link :to="{name:'H1'}"><h1>H2</h1></router-link>
    <router-view></router-view>
    <router-view name="left" style="float:left;width:50%;height:300px;"/>
    <router-view name="right" style="float:right;width:50%;height:300px;"/>
  </div>
</template>
           

②需要在路由裡配置這三個區域,配置主要是在components字段裡進行

export default new Router({
    routes: [
      {
        path: '/',
        name: 'HelloWorld',
        components: {default: HelloWorld,
          left:H1,//顯示H1元件内容'I am H1 page,Welcome to H1'
          right:H2//顯示H2元件内容'I am H2 page,Welcome to H2'
        }
      },
      {
        path: '/h1',
        name: 'H1',
        components: {default: HelloWorld,
          left:H2,//顯示H2元件内容
          right:H1//顯示H1元件内容
        }
      }
    ]
  })
           

上邊的代碼我們編寫了兩個路徑,一個是預設的‘/’,另一個是‘/Hi’.在兩個路徑下的components裡面,我們對三個區域都定義了顯示内容。最後頁面展示如下圖:

vue.js學習筆記(二)——vue-router詳解

3.vue-router配置子路由(二級路由)

實際生活中的應用界面,通常由多層嵌套的元件組合而成。同樣地,URL中各段動态路徑也按某種結構對應嵌套的各層元件,例如:

vue.js學習筆記(二)——vue-router詳解

如何實作下圖效果(H1頁面和H2頁面嵌套在首頁中)?

vue.js學習筆記(二)——vue-router詳解

①首先用标簽增加了兩個新的導航連結

<router-link :to="{name:'HelloWorld'}">首頁</router-link>
<router-link :to="{name:'H1'}">H1頁面</router-link>
<router-link :to="{name:'H2'}">H2頁面</router-link>
           

②在HelloWorld.vue加入标簽,給子模闆提供插入位置

<template>
 <div class="hello">
   <h1>{{ msg }}</h1>
   <router-view></router-view>
 </div>
</template>
           

③在components目錄下建立兩個元件模闆 H1.vue 和 H2.vue 兩者内容類似,以下是H1.vue頁面内容:

<template>
 <div class="hello">
   <h1>{{ msg }}</h1>
 </div>
</template>
<script>
 export default {
   data() {
     return {
       msg: 'I am H1 page,Welcome to H1'
     }
   }
 }
</script>
           

④修改router/index.js代碼,子路由的寫法是在原有的路由配置下加入children字段。

routes: [
   {
     path: '/',
     name: 'HelloWorld',
     component: HelloWorld,
     children: [{path: '/h1', name: 'H1', component: H1},
       {path: '/h2', name: 'H2', component: H2}
     ]
   }
 ]
           

4.vue-router跳轉方法

<button @click="goToMenu" class="btn btn-success">Let's order!</button>
.....
<script>
  export default{
    methods:{
      goToMenu(){
        this.$router.go(-1)//跳轉到上一次浏覽的頁面
        this.$router.replace('/menu')//指定跳轉的位址
        this.$router.replace({name:'menuLink'})// 指定跳轉路由的名字下
        this.$router.push('/menu')通過push進行跳轉
        this.$router.push({name:'menuLink'})通過push進行跳轉路由的名字下
      }
    }
  }
</script>
           

5.404頁面的設定

使用者會經常輸錯頁面,當使用者輸錯頁面時,我們希望給他一個友好的提示頁面,這個頁面就是我們常說的404頁面。vue-router也為我們提供了這樣的機制。 ①設定我們的路由配置檔案(/src/router/index.js)

{
   path:'*',
   component:Error
}
           

這裡的path:’*'就是輸入位址不比對時,自動顯示出Error.vue的檔案内容

②在/src/components/檔案夾下建立一個Error.vue的檔案。簡單輸入一些有關錯誤頁面的内容。

<template>
    <div>
        <h2>{{ msg }}</h2>
    </div>
</template>
<script>
export default {
  data () {
    return {
      msg: 'Error:404'
    }
  }
}
</script>
           

此時我們随意輸入一個錯誤的位址時,便會自動跳轉到404頁面

vue