解決刷新頁面不觸發(fā) vue-router 的 beforeEach 鉤子的問題

問題

在使用 Vue.js 開發(fā)項目時,會用到 vue-router 模塊來進(jìn)行路由管理麻捻。為了在用戶訪問每個頁面之前判斷用戶是否有訪問該頁面權(quán)限,需要用到 vue-router 的 beforeEach 全局鉤子呀袱,在這個鉤子中進(jìn)行權(quán)限判斷贸毕,決定允許或拒絕用戶訪問,或者是跳轉(zhuǎn)到登錄界面夜赵。

代碼如下(vue-router 1.0):

Vue.use(Router)

// routing
var router = new Router()

router.map({
  '/reject': {
    component: RejectView
  },
  '/login': {
    component: LoginView
  }
})

router.start(App, '#app')

router.beforeEach(function (transition) {
  if ( transition.to.path.indexOf('/login') === 0) {
    transition.next()
    return
  }
  if (document.cookie.indexOf('isLogin=true') < 0) {
    router.go('/login?redirect=' + transition.to.path)
    transition.next()
  } else {
    var cname = transition.to.params.cname
    if (cname !== undefined) {
      var has_permission = store.state.userInfo.power[Nav[cname]]
      if (!has_permission) {
        router.go('/reject')
        transition.next()
        return
      }
    }
    transition.next()
  }
})

然而出現(xiàn)一個bug崖咨,當(dāng)我手動 F5 刷新頁面時,卻沒有觸發(fā) beforeEach 鉤子油吭。

原因

查詢 vue-router1.0 的說明文檔,文檔上的 Basic Usage 代碼如下:

// Load the plugin
Vue.use(VueRouter)

// Define some components
var Foo = {
    template: '<p>This is foo!</p>'
}

var Bar = {
    template: '<p>This is bar!</p>'
}

// The router needs a root component to render.
// For demo purposes, we will just use an empty one
// because we are using the HTML as the app template.
// !! Note that the App is not a Vue instance.
var App = {}

// Create a router instance.
// You can pass in additional options here, but let's
// keep it simple for now.
var router = new VueRouter()

// Define some routes.
// Each route should map to a component. The "component" can
// either be an actual component constructor created via
// Vue.extend(), or just a component options object.
// We'll talk about nested routes later.
router.map({
    '/foo': {
        component: Foo
    },
    '/bar': {
        component: Bar
    }
})

// Now we can start the app!
// The router will create an instance of App and mount to
// the element matching the selector #app.
router.start(App, '#app')

可以發(fā)現(xiàn)署拟,樣例中把 router.start(App, '#app') 這行代碼放在了最后婉宰。因為這一步是創(chuàng)建和掛載根實例,是啟動路由的最后一步推穷,需要在定義路由實例和配置路由之后進(jìn)行心包。

解決

修改以后的代碼如下:

Vue.use(Router)

// routing
var router = new Router()

router.map({
  '/reject': {
    component: RejectView
  },
  '/login': {
    component: LoginView
  }
})


router.beforeEach(function (transition) {
  if ( transition.to.path.indexOf('/login') === 0) {
    transition.next()
    return
  }
  if (document.cookie.indexOf('isLogin=true') < 0) {
    router.go('/login?redirect=' + transition.to.path)
    transition.next()
  } else {
    var cname = transition.to.params.cname
    if (cname !== undefined) {
      var has_permission = store.state.userInfo.power[Nav[cname]]
      if (!has_permission) {
        router.go('/reject')
        transition.next()
        return
      }
    }
    transition.next()
  }
})

router.start(App, '#app')

總結(jié)

在使用 vue-router 模塊時,掛載根實例的步驟要放在最后馒铃,不然會導(dǎo)致配置不成功蟹腾。

參考資料


文章標(biāo)題:解決刷新頁面不觸發(fā) vue-router 的 beforeEach 鉤子的問題
文章作者:Ciel Ni
文章鏈接:http://www.cielni.com/2017/06/30/vue-router-beforeEach/
有問題或建議歡迎在我的博客討論痕惋,轉(zhuǎn)載或引用希望標(biāo)明出處,感激不盡娃殖!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末值戳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子炉爆,更是在濱河造成了極大的恐慌堕虹,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芬首,死亡現(xiàn)場離奇詭異赴捞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)郁稍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門赦政,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人耀怜,你說我怎么就攤上這事恢着。” “怎么了封寞?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵然评,是天一觀的道長。 經(jīng)常有香客問我狈究,道長碗淌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任抖锥,我火速辦了婚禮亿眠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘磅废。我一直安慰自己纳像,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布拯勉。 她就那樣靜靜地躺著竟趾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宫峦。 梳的紋絲不亂的頭發(fā)上岔帽,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機(jī)與錄音导绷,去河邊找鬼犀勒。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贾费。 我是一名探鬼主播钦购,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼褂萧!你這毒婦竟也來了押桃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤箱玷,失蹤者是張志新(化名)和其女友劉穎怨规,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锡足,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡波丰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了舶得。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掰烟。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沐批,靈堂內(nèi)的尸體忽然破棺而出纫骑,到底是詐尸還是另有隱情,我是刑警寧澤九孩,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布先馆,位于F島的核電站,受9級特大地震影響躺彬,放射性物質(zhì)發(fā)生泄漏煤墙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一宪拥、第九天 我趴在偏房一處隱蔽的房頂上張望仿野。 院中可真熱鬧,春花似錦她君、人聲如沸脚作。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽球涛。三九已至,卻和暖如春校镐,著一層夾襖步出監(jiān)牢的瞬間亿扁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工灭翔, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓肝箱,卻偏偏與公主長得像哄褒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子煌张,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

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

  • 用Vue.js + vue-router創(chuàng)建單頁應(yīng)用呐赡,是非常簡單的,基本是這樣的: 組件 → 路由 → 渲染地方 ...
    阿go閱讀 1,396評論 0 0
  • vue2有著深度繼承的路由插件骏融,即:vue-router链嘀,其中文的API地址。 vue-router與其他的路由(...
    白水螺絲閱讀 17,528評論 0 17
  • 避開一月的寒風(fēng) 繞過二月的余雪 我在三月的河堤 遙望四月的梨花 傾聽五月的鳥語 想念六月的你 七月里你在溪邊浣衣 ...
    南庸啊閱讀 238評論 0 2
  • 2017年成長收獲: 001價值觀的初步形成档玻。 2017年怀泊,我最大的收獲是,初步形成自己的價值觀误趴,有了自己的評判體...
    顧塵埃閱讀 142評論 2 2
  • 電線桿是城市的十字架 落滿麻雀
    七只河童閱讀 233評論 0 0