vue2.0一起在懵逼的海洋里越陷越深(六)

前言

本文章系列:vue2.0一起在懵逼的海洋里越陷越深 (http://leenty.com/tags/vuejs/)
演示場(chǎng)地vue2.0 Demo,這是源碼地址,覺得靠譜的話歡迎加星跟隨,有問題歡迎評(píng)論和指正??
aaaa
在vue開發(fā)SPA應(yīng)用的過程中绰疤,多數(shù)情況下我們需要解決一個(gè)問題
就是在路由跳轉(zhuǎn)的過程中需要更新你SPA應(yīng)用的title 损肛,
這一節(jié)不說其他帚桩,就展示如何使用vue-router導(dǎo)航鉤子去解決這么一個(gè)問題吹榴。
接下來就愉快的去玩耍啦!

紅紅火火恍恍惚惚

正文

好的,介紹下背景,我有這么一個(gè)博客的demo疟游,里面有多個(gè)版塊,每個(gè)版塊有著不同的名稱(title)
先看一下Demo的路由結(jié)構(gòu)

vue2.leenty.com
├── home                # 首頁(yè)版塊
├── article             # 文章版塊
│   ├── vue2-1            # 具體文章一
│   ├── vue2-2            # 具體文章二
│   ├── vue2-3            # 具體文章三
│   ├── vue2-4            # 具體文章四
│   ├── vue2-5            # 具體文章五
│   └── vue2-6            # 具體文章六
└── demo                # 演示版塊
    └── demo-1            # 具體演示一

好的痕支,接下來要實(shí)現(xiàn)的是在切換路由的時(shí)候同時(shí)的去切換你頁(yè)面的title

思路

這里思路是使用vue-router的路由全局導(dǎo)航鉤子去解決這個(gè)問題
在路由對(duì)象里添加一個(gè)title字段以供路由全局導(dǎo)航鉤子讀取并更新頁(yè)面title

配置路由

所以第一步颁虐,先在路由對(duì)象里添加這一個(gè)字段。
打開src/routes.js
(源文件地址:https://github.com/leenty/vue2/blob/master/src/routes.js)
(注意是routes.js,這是咱用來存放路由對(duì)象的文件)
在原有數(shù)據(jù)的基礎(chǔ)上添加title
這里其實(shí)vue1.0和vue2.0的實(shí)現(xiàn)是差不多的卧须,所以vue1.0也是可以使用的另绩。
vue2.0路由對(duì)象提供了一個(gè)meta字段來給你存放一些其他信息,所以這里就可以用來存放title
vue1.0的話是沒有這個(gè)字段的花嘶,所以可以直接與path平級(jí)笋籽。
具體如下:

const routes = [
  {
    name: 'Home',
    path: '/',
    meta: {
      title: 'home' // 主頁(yè)的title為home
    },
    component: require('./components/Home.vue')
  },
  {
    name: 'Article',
    path: '/article',
    meta: {
      title: 'article' // 文章模塊相應(yīng)的title為article
    },
    component: require('./components/Article.vue'),
    children: [
      {
        name: 'vue2_1',
        path: '/article/vue2_1',
        meta: {
          title: 'vue2.0一起在懵逼的海洋里越陷越深(一)' // 子路由也是一樣的道理
        },
        component: require('./md/articles/vue2-1.md')
      },
      // ... 子路由和父路由都差不多,所以后面的就省略了
    ]
  },
  {
    name: 'Demo',
    path: '/demo',
    meta: {
      title: 'demo' // 演示模塊title為demo
    },
    component: require('./components/Demo.vue'),
    children: [
      {
        name: 'DemoVuexState',
        path: 'vuex_state',
        meta: {
          title: 'vuex演示'
        },
        component: require('./components/DemoVuexState.vue')
      }
    ]
  }
]

export default routes

如此這般椭员,各個(gè)頁(yè)面的title就預(yù)設(shè)好了

小明:”為什么title里不加上站點(diǎn)名后綴车海?像demo - leenty blog這樣?“
老師:“滾出去拆撼!”

其實(shí)是這樣的容劳,后綴如果一個(gè)個(gè)加也是可以的,但為什么不用語句幫我們加上去呢闸度?
這樣就一勞永逸啦,再也不用自己一個(gè)個(gè)打后綴了蚜印,哈哈哈莺禁,真TM機(jī)智!


mdzz

路由導(dǎo)航鉤子介紹

講一講這個(gè)所謂的全局導(dǎo)航鉤子窄赋,聽起來玄不愣登的哟冬。楼熄。。

導(dǎo)航是發(fā)生在路由改變時(shí)的事件浩峡,這也是為何網(wǎng)頁(yè)的導(dǎo)航條叫導(dǎo)航條的原因
尤大大的原話是:“正如其名可岂,vue-router 提供的導(dǎo)航鉤子主要用來攔截導(dǎo)航,讓它完成跳轉(zhuǎn)或取消翰灾。有多種方式可以在路由導(dǎo)航發(fā)生時(shí)執(zhí)行鉤子:全局的, 單個(gè)路由獨(dú)享的, 或者組件級(jí)的”
說的很明白缕粹,言簡(jiǎn)意賅,其實(shí)就是能讓你控制導(dǎo)航的一個(gè)方法而已
導(dǎo)航鉤子分為全局纸淮,單個(gè)路由獨(dú)享和組件級(jí)別的平斩。
但不論如何,導(dǎo)航鉤子都接受一個(gè)函數(shù)為參數(shù)咽块,并會(huì)在導(dǎo)航過程中調(diào)用這個(gè)函數(shù)绘面。
函數(shù)會(huì)被傳入3個(gè)參數(shù),分別為to, from, next
沒錯(cuò)侈沪,你看字面意思應(yīng)該理解了個(gè)大概揭璃,即:
from:你從哪里來?(問詢消息的小弟A)
to:要到哪里去亭罪?(問詢消息的小弟B)
next:讓不讓過去還得看老子我的瘦馍!(大哥你懂不)

上面這位大哥(next)會(huì)有三中方法!

next() // 默認(rèn)通過路由
next(false) // 中止導(dǎo)航皆撩,那么將會(huì)跳回到from的地址
next({ path: '/' }) // 跟一個(gè)路由參數(shù)對(duì)象扣墩,將會(huì)中止當(dāng)前導(dǎo)航并跳往指向的路由

好的,先看看全局的寫法
全局導(dǎo)航鉤子一共兩個(gè)扛吞,router.beforeEachrouter.afterEach
一個(gè)觸發(fā)于導(dǎo)航開始前呻惕,一個(gè)觸發(fā)于導(dǎo)航開始后。用法呢滥比,都是一樣的亚脆,如下!

const router = new VueRouter({ ... })

router.beforeEach((to, from, next) => {
  console.log('小弟B:哎呀媽呀盲泛!大兄弟濒持,這是要去哪呀?', to)
  console.log('小弟A:大兄弟寺滚,哪兒旮沓的呀柑营!', from)
  next(false) // 大哥:誰讓你過去的?
  // 調(diào)用next(false)中止導(dǎo)航村视,于是頁(yè)面回到跳轉(zhuǎn)前
})

router.afterEach((to, from, next) => {
  console.log('小弟B:哎呀媽呀官套!大兄弟,這是要去哪呀?', to)
  console.log('小弟A:大兄弟奶赔,哪兒旮沓的呀惋嚎!', from)
  next() // 大哥:過去吧!
  // 調(diào)用next通過路由
})
``

**單個(gè)路由獨(dú)享的鉤子**站刑,同樣是兩個(gè)方法`beforeEnter`和`afterEnter`另伍,同樣的套路。
套路如下:
```js
const router = new VueRouter({
  routes: [
    {
      path: '/demo',
      component: Demo,
      beforeEnter: (to, from, next) => {
        console.log('小弟B:哎呀媽呀绞旅!大兄弟摆尝,這是要去哪呀?', to)
        console.log('小弟A:大兄弟玻靡,哪兒旮沓的呀结榄!', from)
        next() // 大哥:過去吧!
        // 調(diào)用next通過路由
      },
      afterEnter: (to, from, next) => {
        console.log('小弟B:哎呀媽呀囤捻!大兄弟臼朗,這是要去哪呀?', to)
        console.log('小弟A:大兄弟蝎土,哪兒旮沓的呀视哑!', from)
        next({ path: '/' }) // 大哥:像那邊走!
        // 調(diào)用next({ path: '/' })中止導(dǎo)航誊涯,并跳到首頁(yè)
      }
    }
  ]
})

組件內(nèi)的鉤子挡毅,依然是一對(duì)基友方法beforeRouteEnterbeforeRouteLeave
套路還是一樣的0.0

const Demo = {
  template: `<div>this is a Demo </div>`,
  beforeRouteEnter (to, from, next) {
    console.log('小弟B:哎呀媽呀!大兄弟暴构,這是要去哪呀跪呈?', to)
    console.log('小弟A:大兄弟,哪兒旮沓的呀取逾!', from)
    next() // 大哥:過去吧耗绿!
    // 在渲染該組件的對(duì)應(yīng)路由被 confirm 前調(diào)用
    // 不!能砾隅!獲取組件實(shí)例 `this`
    // 因?yàn)楫?dāng)鉤子執(zhí)行前误阻,組件實(shí)例還沒被創(chuàng)建
  },
  beforeRouteLeave (to, from, next) {
    console.log('小弟B:哎呀媽呀!大兄弟晴埂,這是要去哪呀究反?', to)
    console.log('小弟A:大兄弟,哪兒旮沓的呀儒洛!', from)
    next() // 大哥:過去吧精耐!
    // 導(dǎo)航離開該組件的對(duì)應(yīng)路由時(shí)調(diào)用
    // 可以訪問組件實(shí)例 `this`
  }
}

配合路由全局導(dǎo)航鉤子去更新title

好的,三種都介紹完了琅锻,那么打開src/router.js黍氮,沒錯(cuò)唐含,這回是router.js浅浮,這是咱裝載路由的文件

在此之前沫浆,我們還需要知道在一個(gè)嵌套路由情況下的節(jié)點(diǎn)分布。
三個(gè)參數(shù)之一的to存在屬性to.matched,里面存在了一個(gè)包含路由節(jié)點(diǎn)的數(shù)組
順序是從子路由到根路由

好的滚秩,確定下title文案

router title
├── home leenty blog
├── article article - leenty blog
│ ├── vue2-1 vue2.0一起在懵逼的海洋里越陷越深(一) - article - leenty blog
│ ├── ... ... - article - leenty blog
│ └── vue2-6 vue2.0一起在懵逼的海洋里越陷越深(六) - article - leenty blog
└── demo demo - leenty blog
└── demo-1 具體演示1 - demo - leenty blog

里面的結(jié)構(gòu)是這樣的

import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes'

const title = 'leenty blog'
// 定義我們站點(diǎn)的名字

Vue.use(VueRouter)

/* eslint-disable no-new */
const router = new VueRouter({
  mode: 'history',
  linkActiveClass: 'u-link--Active',
  routes
})

// 路由導(dǎo)航鉤子专执,beforeEach,在路由進(jìn)入前調(diào)用
router.beforeEach((to, from, next) => {
  let titleStr = ''
  // 檢測(cè)是不是要跳轉(zhuǎn)首頁(yè)郁油,如果是本股,則不處理
  if (to.name !== 'Home') {
    // 倒序遍歷數(shù)組獲取匹配到的路由節(jié)點(diǎn),拼接各部分title
    for (let i = to.matched.length - 1; i >= 0; i--) {
      titleStr += `${to.matched[i].meta.title} - `
    }
  }
  // 添加站點(diǎn)名
  titleStr += title
  // 更新title
  document.title = titleStr
  // 繼續(xù)路由導(dǎo)航
  next()
})

export default router

ok桐腌,打完收工拄显!現(xiàn)在可以切換路由看看title有沒有在變化了。
可以看我的Demohttp://vue2.leenty.com案站,四處切換路由躬审,看看標(biāo)題如何變化吧!

其他

演示地址(http://vue2.leenty.com)
源碼地址(https://github.com/leenty/vue2)
github主頁(yè),覺得靠譜的話歡迎加星跟隨

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蟆盐,一起剝皮案震驚了整個(gè)濱河市承边,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌石挂,老刑警劉巖博助,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異痹愚,居然都是意外死亡富岳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門拯腮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窖式,“玉大人,你說我怎么就攤上這事疾瓮〔倍疲” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵狼电,是天一觀的道長(zhǎng)蜒灰。 經(jīng)常有香客問我,道長(zhǎng)肩碟,這世上最難降的妖魔是什么强窖? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮削祈,結(jié)果婚禮上翅溺,老公的妹妹穿的比我還像新娘脑漫。我一直安慰自己,他們只是感情好咙崎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布优幸。 她就那樣靜靜地躺著,像睡著了一般褪猛。 火紅的嫁衣襯著肌膚如雪网杆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天伊滋,我揣著相機(jī)與錄音碳却,去河邊找鬼。 笑死笑旺,一個(gè)胖子當(dāng)著我的面吹牛昼浦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播筒主,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼关噪,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了物舒?” 一聲冷哼從身側(cè)響起色洞,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冠胯,沒想到半個(gè)月后火诸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荠察,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年置蜀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悉盆。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盯荤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出焕盟,到底是詐尸還是另有隱情秋秤,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布脚翘,位于F島的核電站灼卢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏来农。R本人自食惡果不足惜鞋真,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一屉更、第九天 我趴在偏房一處隱蔽的房頂上張望号阿。 院中可真熱鬧,春花似錦泞辐、人聲如沸职车。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蓖柔。三九已至,卻和暖如春盾似,著一層夾襖步出監(jiān)牢的瞬間敬辣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工零院, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人村刨。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓告抄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嵌牺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子打洼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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