Vue2.0學習筆記(二)--路由與頁面間導航

一、vue-router

1.安裝
npm install vue-router -D
2.使用
vue-router 是一個插件,需要在 Vue 的全局引用中通過 Vue.use()將它引用到 Vue 實例當中。在我們的工程中。main.js是程序入口文件,所有的全局性配置都會放在這里面。
3.路由配置
頁面就是組件,那么一個路由定義就該與一個組件相對應。第一個頁面應該是“首頁”,也就是默認路由。
4.配置一個簡單的路由
準備兩個頁面,格式相同即可:

    <!--/Home.vue-->
    <template>
        <div>Home</div>
    </template>
    <style></style>
    <script>
        export default {}
    </script>

在 main.js 中

import Vue from 'vue'
import App from './App'
import router from './router'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  template: '<App/>',
  components: {
    App
  }
})

在 router.js 中配置路由

import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '@/components/Home'
import Explorer from '@/components/Explorer'
import Cart from '@/components/Cart'
import Me from '@/components/Me'

Vue.use(VueRouter)

export default new VueRouter({
  routes: [
    {
      path: '/home',
      name: 'home',
      component: Home
    }, {
      path: '/explorer',
      name: 'explorer',
      component: Explorer
    }
  ]
})

以后凡是遇到配置文件,就可以單獨配置,在 main.js 中僅引用配置到全局變量。

二、路由的模式

1.URL

  • history 地址模式:http://localhost/home
  • 非 history 地址模式:http://localhost/#home
    2.三種模式詳解
  • Hash:使用 URL hash 值來作為路由。支持所有瀏覽器,包括不支持 HTML5 History API 的瀏覽器。
  • History:依賴 HTML5 History API 和服務器配置。查看 HTML5 History 模式。
  • Abstract:支持所有 JavaScript 運行環境,如 Node.js 服務器端。如果發現沒有瀏覽器 API,路由會自動強制進入這個模式。
    模式配置方式:
export default new VueRouter({
    mode: 'history',
    routes: [
        {
          path: '/home',
          name: 'home',
          component: Home
        }, {
          path: '/explorer',
          name: 'explorer',
          component: Explorer
        }
      ]
    })

三、路由與導航

1.vue-router 提供的兩個指令標簽

  • <router-view>——渲染路徑匹配到的視圖組件,它還可以內嵌自己的<router-view>,根據嵌套路徑渲染嵌套組件。
  • <router-link>——支持用戶在具有路由功能的應用中(點擊)導航。
    <template>
      <div id="app">
        <div class="tabs">
          <ul>
            <li>
              <router-link :to="{ name : 'home' }">
                Home
              </router-link>
            </li>
            <li>
              <router-link :to="{ name : 'explorer' }">
                Explorer
              </router-link>
            </li>
          </ul>
        </div>
    
        <div class="content">
          <router-view></router-view>
        </div>
      </div>
    </template>

使用<router-link :to="{ name : 'explorer' }">的形式而不用<router-link :to="/explorer">,給每一個路由取一個名字,避免更改路由時需要再改導航的路徑。
2.指定輸出元素
不指定輸出元素時,代碼最終的輸出結果會是:

<ul>
    <li>
       <a href="#>
          <div>Home</div>
       </a>
     </li>
      <li>...</li>
</ul>

其實我們并不需要<a>標簽,可以通過屬性指定我們可以直接輸出到<li>標簽上節省出更多的代碼。<router-link :to="{ name : 'home' }" tag="li">

3.動態路由

routes:[{
    name: 'BookDetails',
    path: '/book/:id',
    component: BookDetails
}]

在參數名之前加上“:”,然后將參數寫在路由的 path 內。
<router-link>中我們可以加入一個 params 的屬性來指定具體的參數值:

<router-link :to="{name: 'BookDetials', params: { id : 1 }" >
</router-link>

參數值的讀取方式:

export default {
    created () {
        const bookID = this.$router.params.id
    }
}

使用路由參數時,例如從/books/1導航到/books/2,原來的組件實例會被復用,比起銷毀再創建復用則顯得更加高效,不過,這也意味著組件的生命周期鉤子不會被重復調用,也就是說created、mounted 等鉤子函數在頁面第二次加載時會失效。那么,當組件復用時,想對路由參數的變化做響應的話,就需要在 watch 對象唄添加$route 對象變化的跟蹤函數:

export default {
    template: '...',
    watch: {
        '$route' (to, from) {
            // 對路由變化作出響應
        }
    }
}

4.前套路由
在 route.js 的配置中,要顯示子視圖與子路由的對應。利用 children 數組屬性就可以定義子路由了。

routes:[{
    name: 'Main',
    path: '/',
    component: Main,
    children: [
        {name: 'Home', path: 'home', component: Home,}
    ]
}]

子路由中的路徑就不需要加上"/"了,生成時主路由的 path 會被自動添加到自路由前。另外,以"/"開頭會被當做根路徑,就不要加"/"了。

5.切頁動畫
Vue 提供了 transition 的封裝組件。
有4個(CSS)類名在 enter/leave 的過度中切換:

  • CSS 類名-enter
  • CSS 類名-enter-active
  • CSS 類名-leave
  • CSS 類名-leave-active

四、導航狀態樣式

當用戶點擊 Tabs 上的任意一個標簽組件時,組件應該進入一個“激活”狀態。在默認情況下<router-link>對應的路由匹配成功,就會自動設置 class 屬性值為.router-link-active,如果我們想設置“激活”狀態樣式類名為 active,可以通過 active-clas 屬性進行設置。

<router-link :to=" { name: 'Home' } "
                    active-class="active" >
</router-link>

但如果要在頁面上這樣顯示聲明,每一個都寫一個,這樣就不 DRY 了。所以,可以在 router.js 中配置一下語句:

const router = new VueRouter ({
    // ...省略
    linkActiveClass: "active"
})

樣式激活是依據對 URL 的全包含匹配,也就意味這"/"跳轉到別的路由依舊會保持“激活”狀態。在這種情況下就需要使用精確匹配模式,使用 exact 屬性。

<router-link :to=" { name: 'Home' } " exact>
</router-link>

五、History 的控制

當我們在使用 HTML5的 History 模式的時候,每次路由的改變都會被“推”(push)到導航歷史中保留,在某些情況下我們并不需要瀏覽器這樣做,而是希望他能將原有的記錄進行替換。
首先,需要了解<router-link> 用兩種屬性來調用 Vue 實例內$router 對象的三個方法:

router 的方法 屬性 說明
push() 默認調用此方法
append() append 將目標 URL 追加到當前 URL 下
replace() replace 以目標 URL 替換現有的 URL

設置 replace 就會調用 router.replace() 而不是 router.push(),于是導航后就不會留下 History 記錄。

<router-link :to=" { name: 'Home' } " replace>
</router-link>

設置 append 屬性后,則在當前(相對)路徑前添加基本路徑。例如,從 /a 導航到相對路徑 b,如果沒有配置 append,則路徑為 /b,如果配置了,則為 /a/b。

六、關于 Fallback

當使用 History 模式的時候,點擊<router-link>會自動調到相應的路徑,但是在瀏覽器直接輸入" http://loacalhost/home"則會404,因為瀏覽器直接將這個地址發向服務器。
解決辦法是將所有發到服務器端的請求利用服務器端的 URLRewrite 模板重新轉發給/index.html。
常見:
Apache
在配置文件中加入 URLRewrite模塊配置
Nginx
將404頁面自動重定向到/index.html
Node.js(Express)
安裝 Fallback 插件
注意
一旦配置,服務器將不再返回404錯誤頁面,為避免這種情況,應該在 Vue 應用里覆蓋所有的路由情況,然后在給出一個404頁面。

const router = new VueRouter({
    mode: 'history',
    routes: [
        {path: '*', component: NotFoundComponent}
    ]
})
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內容