Vue2.0學(xué)習(xí)筆記(二)--路由與頁(yè)面間導(dǎo)航

一凸丸、vue-router

1.安裝
npm install vue-router -D
2.使用
vue-router 是一個(gè)插件,需要在 Vue 的全局引用中通過(guò) Vue.use()將它引用到 Vue 實(shí)例當(dāng)中袱院。在我們的工程中甲雅。main.js是程序入口文件,所有的全局性配置都會(huì)放在這里面坑填。
3.路由配置
頁(yè)面就是組件,那么一個(gè)路由定義就該與一個(gè)組件相對(duì)應(yīng)弛姜。第一個(gè)頁(yè)面應(yīng)該是“首頁(yè)”脐瑰,也就是默認(rèn)路由。
4.配置一個(gè)簡(jiǎn)單的路由
準(zhǔn)備兩個(gè)頁(yè)面廷臼,格式相同即可:

    <!--/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
    }
  ]
})

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

二寂恬、路由的模式

1.URL

  • history 地址模式:http://localhost/home
  • 非 history 地址模式:http://localhost/#home
    2.三種模式詳解
  • Hash:使用 URL hash 值來(lái)作為路由。支持所有瀏覽器辖试,包括不支持 HTML5 History API 的瀏覽器涕蜂。
  • History:依賴(lài) HTML5 History API 和服務(wù)器配置专酗。查看 HTML5 History 模式。
  • Abstract:支持所有 JavaScript 運(yùn)行環(huán)境牙咏,如 Node.js 服務(wù)器端。如果發(fā)現(xiàn)沒(méi)有瀏覽器 API嘹裂,路由會(huì)自動(dòng)強(qiáng)制進(jìn)入這個(gè)模式妄壶。
    模式配置方式:
export default new VueRouter({
    mode: 'history',
    routes: [
        {
          path: '/home',
          name: 'home',
          component: Home
        }, {
          path: '/explorer',
          name: 'explorer',
          component: Explorer
        }
      ]
    })

三、路由與導(dǎo)航

1.vue-router 提供的兩個(gè)指令標(biāo)簽

  • <router-view>——渲染路徑匹配到的視圖組件寄狼,它還可以?xún)?nèi)嵌自己的<router-view>丁寄,根據(jù)嵌套路徑渲染嵌套組件。
  • <router-link>——支持用戶(hù)在具有路由功能的應(yīng)用中(點(diǎn)擊)導(dǎo)航。
    <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">伊磺,給每一個(gè)路由取一個(gè)名字盛正,避免更改路由時(shí)需要再改導(dǎo)航的路徑。
2.指定輸出元素
不指定輸出元素時(shí)奢浑,代碼最終的輸出結(jié)果會(huì)是:

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

其實(shí)我們并不需要<a>標(biāo)簽蛮艰,可以通過(guò)屬性指定我們可以直接輸出到<li>標(biāo)簽上節(jié)省出更多的代碼。<router-link :to="{ name : 'home' }" tag="li">

3.動(dòng)態(tài)路由

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

在參數(shù)名之前加上“:”雀彼,然后將參數(shù)寫(xiě)在路由的 path 內(nèi)壤蚜。
<router-link>中我們可以加入一個(gè) params 的屬性來(lái)指定具體的參數(shù)值:

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

參數(shù)值的讀取方式:

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

使用路由參數(shù)時(shí),例如從/books/1導(dǎo)航到/books/2徊哑,原來(lái)的組件實(shí)例會(huì)被復(fù)用袜刷,比起銷(xiāo)毀再創(chuàng)建復(fù)用則顯得更加高效,不過(guò)莺丑,這也意味著組件的生命周期鉤子不會(huì)被重復(fù)調(diào)用著蟹,也就是說(shuō)created、mounted 等鉤子函數(shù)在頁(yè)面第二次加載時(shí)會(huì)失效梢莽。那么萧豆,當(dāng)組件復(fù)用時(shí),想對(duì)路由參數(shù)的變化做響應(yīng)的話(huà)昏名,就需要在 watch 對(duì)象唄添加$route 對(duì)象變化的跟蹤函數(shù):

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

4.前套路由
在 route.js 的配置中涮雷,要顯示子視圖與子路由的對(duì)應(yīng)。利用 children 數(shù)組屬性就可以定義子路由了轻局。

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

子路由中的路徑就不需要加上"/"了洪鸭,生成時(shí)主路由的 path 會(huì)被自動(dòng)添加到自路由前。另外仑扑,以"/"開(kāi)頭會(huì)被當(dāng)做根路徑览爵,就不要加"/"了。

5.切頁(yè)動(dòng)畫(huà)
Vue 提供了 transition 的封裝組件镇饮。
有4個(gè)(CSS)類(lèi)名在 enter/leave 的過(guò)度中切換:

  • CSS 類(lèi)名-enter
  • CSS 類(lèi)名-enter-active
  • CSS 類(lèi)名-leave
  • CSS 類(lèi)名-leave-active

四蜓竹、導(dǎo)航狀態(tài)樣式

當(dāng)用戶(hù)點(diǎn)擊 Tabs 上的任意一個(gè)標(biāo)簽組件時(shí),組件應(yīng)該進(jìn)入一個(gè)“激活”狀態(tài)盒让。在默認(rèn)情況下<router-link>對(duì)應(yīng)的路由匹配成功梅肤,就會(huì)自動(dòng)設(shè)置 class 屬性值為.router-link-active,如果我們想設(shè)置“激活”狀態(tài)樣式類(lèi)名為 active邑茄,可以通過(guò) active-clas 屬性進(jìn)行設(shè)置姨蝴。

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

但如果要在頁(yè)面上這樣顯示聲明,每一個(gè)都寫(xiě)一個(gè)肺缕,這樣就不 DRY 了左医。所以授帕,可以在 router.js 中配置一下語(yǔ)句:

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

樣式激活是依據(jù)對(duì) URL 的全包含匹配,也就意味這"/"跳轉(zhuǎn)到別的路由依舊會(huì)保持“激活”狀態(tài)浮梢。在這種情況下就需要使用精確匹配模式跛十,使用 exact 屬性。

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

五秕硝、History 的控制

當(dāng)我們?cè)谑褂?HTML5的 History 模式的時(shí)候芥映,每次路由的改變都會(huì)被“推”(push)到導(dǎo)航歷史中保留,在某些情況下我們并不需要瀏覽器這樣做远豺,而是希望他能將原有的記錄進(jìn)行替換奈偏。
首先,需要了解<router-link> 用兩種屬性來(lái)調(diào)用 Vue 實(shí)例內(nèi)$router 對(duì)象的三個(gè)方法:

router 的方法 屬性 說(shuō)明
push() 默認(rèn)調(diào)用此方法
append() append 將目標(biāo) URL 追加到當(dāng)前 URL 下
replace() replace 以目標(biāo) URL 替換現(xiàn)有的 URL

設(shè)置 replace 就會(huì)調(diào)用 router.replace() 而不是 router.push()躯护,于是導(dǎo)航后就不會(huì)留下 History 記錄惊来。

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

設(shè)置 append 屬性后,則在當(dāng)前(相對(duì))路徑前添加基本路徑棺滞。例如裁蚁,從 /a 導(dǎo)航到相對(duì)路徑 b,如果沒(méi)有配置 append继准,則路徑為 /b枉证,如果配置了,則為 /a/b移必。

六刽严、關(guān)于 Fallback

當(dāng)使用 History 模式的時(shí)候,點(diǎn)擊<router-link>會(huì)自動(dòng)調(diào)到相應(yīng)的路徑避凝,但是在瀏覽器直接輸入" http://loacalhost/home"則會(huì)404,因?yàn)闉g覽器直接將這個(gè)地址發(fā)向服務(wù)器眨补。
解決辦法是將所有發(fā)到服務(wù)器端的請(qǐng)求利用服務(wù)器端的 URLRewrite 模板重新轉(zhuǎn)發(fā)給/index.html管削。
常見(jiàn):
Apache
在配置文件中加入 URLRewrite模塊配置
Nginx
將404頁(yè)面自動(dòng)重定向到/index.html
Node.js(Express)
安裝 Fallback 插件
注意
一旦配置,服務(wù)器將不再返回404錯(cuò)誤頁(yè)面撑螺,為避免這種情況含思,應(yīng)該在 Vue 應(yīng)用里覆蓋所有的路由情況,然后在給出一個(gè)404頁(yè)面甘晤。

const router = new VueRouter({
    mode: 'history',
    routes: [
        {path: '*', component: NotFoundComponent}
    ]
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末含潘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子线婚,更是在濱河造成了極大的恐慌遏弱,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塞弊,死亡現(xiàn)場(chǎng)離奇詭異漱逸,居然都是意外死亡泪姨,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)饰抒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)肮砾,“玉大人,你說(shuō)我怎么就攤上這事袋坑≌檀Γ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵枣宫,是天一觀的道長(zhǎng)婆誓。 經(jīng)常有香客問(wèn)我,道長(zhǎng)镶柱,這世上最難降的妖魔是什么旷档? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮歇拆,結(jié)果婚禮上鞋屈,老公的妹妹穿的比我還像新娘。我一直安慰自己故觅,他們只是感情好厂庇,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著输吏,像睡著了一般权旷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贯溅,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天拄氯,我揣著相機(jī)與錄音,去河邊找鬼它浅。 笑死译柏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的姐霍。 我是一名探鬼主播鄙麦,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼镊折!你這毒婦竟也來(lái)了胯府?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤恨胚,失蹤者是張志新(化名)和其女友劉穎骂因,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赃泡,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侣签,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年塘装,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片影所。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蹦肴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猴娩,到底是詐尸還是另有隱情阴幌,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布卷中,位于F島的核電站矛双,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蟆豫。R本人自食惡果不足惜议忽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望十减。 院中可真熱鬧栈幸,春花似錦、人聲如沸帮辟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)由驹。三九已至芍锚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蔓榄,已是汗流浹背并炮。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甥郑,地道東北人渣触。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像壹若,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子皂冰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容