Vue二、vue-router路由的各個部分的使用

vue-router官方文檔
官方給的文檔很詳細跨扮,我從在我搭的框架實際應用上講述一下vue-router如何在項目中封裝并引用。

1示惊、概念簡介

引用官方的一句話

使用Vue + Vue Router創(chuàng)建單頁應用程序非常簡單好港。借助Vue.js,我們已經(jīng)在使用組件組成應用程序米罚。將Vue Router添加到混合中時钧汹,我們要做的只是將組件映射到路由,并讓Vue Router知道在何處渲染它們

個人理解

通常的html網(wǎng)頁录择,跳轉(zhuǎn)到另一個頁面都需要在瀏覽器中刷新一下拔莱,等待服務器響應將頁面?zhèn)骰貋硗虢担绻醒舆t,會有一段時間的空白塘秦,對用戶體驗效果不佳讼渊,于是,單頁面應用應運而生尊剔,因為在一開始就加載出所有頁面的內(nèi)容爪幻,所以首頁加載的速度會很慢。vue的強大之處就在于vue-router的應用以及后續(xù)的一些內(nèi)容须误。

(1)vue-router可以通過html5的history API或者hash實現(xiàn)單頁應用挨稿,即不刷新跳轉(zhuǎn),切換地址京痢,只是頁面上的組件的切換奶甘;vue-router就是路由,用于頁面跳轉(zhuǎn)祭椰。
(2)組件之間的嵌套臭家,就像后臺管理系統(tǒng)一樣,左邊欄和頂部欄保持不變方淤,只變換中間像變換的部分(利用children實現(xiàn)钉赁,官方叫命名路線),也可以實現(xiàn)由多個組件的組成的頁面的跳轉(zhuǎn)(官方叫命名視圖)臣淤。
(3)只要在main.js和App.vue以及路由文件中配置好橄霉,可以:后綴.vue中使用<router-link :to="...">后綴.js文件中使用router.push(...)實現(xiàn)頁面或者組件之間的跳轉(zhuǎn)。官方文檔給的很詳細邑蒋,包括歷史記錄等等姓蜂。
(4)樹狀結(jié)構(gòu)!R降酢钱慢!這個是單頁面應用的核心概念 ,有了樹狀結(jié)構(gòu)卿堂,我們就不需要把路由全部都注冊在整體的根節(jié)點上束莫,每一個節(jié)點都是下一個節(jié)點的根節(jié)點。

components.png

(5)vue-router可以實現(xiàn)頁面間傳參草描、路由重定向览绿、起別名等其他功能;

2穗慕、那么又有一個問題來了饿敲,如果如果我想用戶沒有登陸的時候,讓他不能跳轉(zhuǎn)到首頁逛绵,而是跳到登陸注冊的頁面呢怀各?

這就需要用到一個叫做導航守衛(wèi)的東西倔韭,它的原理很簡單,就是通過重定向或取消導航來保護導航瓢对。

官網(wǎng)給出了
(1)寿酌、router.beforeEach
(2)、router.afterEach
(3)硕蛹、在定義的組件的路由里beforeEnter
(4)醇疼、在定義的組件中beforeRouteEnterbeforeRouteUpdate法焰、 beforeRouteLeave

這里做一個關(guān)于登陸注冊的例子僵腺,結(jié)合localStorage,檢測路由

// 使用 router.beforeEach 注冊一個全局前置守衛(wèi)壶栋,判斷用戶是否登陸
router.beforeEach((to, from, next) => {
  if (to.path === '/login' || to.path === '/forgetPsd' || to.path === '/register') {
    next();
  } else {
    let token = localStorage.getItem('token');
   // 檢測本地localStorage是否存在token
    if (!token) {
      next('/login');
    } else {
      next();
    }
  }
});

這里每個保護函數(shù)都接收三個參數(shù):

  • to: Route:被導航到的目標Route對象

  • from: Route:正在遠離的當前路線。

  • next: Function:必須調(diào)用此函數(shù)才能解決普监,next中參數(shù)詳見官方文檔贵试,最常用next(),導航將被確認(就是繼續(xù)下去不攔截了)凯正。

3毙玻、小例子

import Vue from 'vue'
import Router from 'vue-router'


Vue.use(Router)
const router = new Router({
  mode: 'history',
  routes: [
    {
      path: '/',
      redirect: '/index'
    },

    {
      path: '/',
      component: resolve => require(['@/components/common/home.vue'], resolve),
      meta: { title: '全局文件' },
      children: [
        {
          path: '/index',
          component: resolve => require(['@/views/index.vue'], resolve),
          meta: {
            title: '系統(tǒng)首頁'
          }
        },
        {
          path: '/TaskList',
          component: resolve => require(['@/views/TaskList.vue'], resolve),
          meta: {
            title: '任務列表'
          }
        }
      ]
    },
    {
      path: '/forgetPsd',
      component: resolve => require(['@/views/ForgetPsd.vue'], resolve),
      meta: {
        title: '忘記密碼'
      }
    },
   {
      path: '/login',
      component: resolve => require(['@/views/login.vue'], resolve),
      meta: {
        title: '登陸'
       }
    },
    {
      path: '/register',
      component: resolve => require(['@/views/register.vue'], resolve),
      meta: {
        title: '注冊'
      }
    },
    {
      path: '*',
      component: resolve => require(['@/views/404.vue'], resolve),
      meta: {
        title: '404'
      }
    }
  ]
})
// 導航守衛(wèi)
// 使用 router.beforeEach 注冊一個全局前置守衛(wèi),判斷用戶是否登陸
router.beforeEach((to, from, next) => {
  if (to.path === '/login' || to.path === '/forgetPsd' || to.path === '/register') {
    next();
  } else {
    let token = localStorage.getItem('token');

    if (token === null || token === '' || token === undefined) {
      next('/login');
    } else {
      next();
    }
  }
});

export default router;

開頭設(shè)置mode: 'history'是為了取消vue初始化的項目中路由最前面的#號
path : 自定義的路徑
name:路由的名稱(這個是用來做菜單選中狀態(tài)的廊散,所以一定要寫)
compoment:用來掛載組件 resolve => require(['@/XX/XXX.vue'], resolve) 是異步加載的寫法
@ : @指的是src目錄桑滩,后面的是目錄中的Vue文件,在指定目錄下一定要有鴨
export default router : 將路由器導出,必不可少

4允睹、思考

(1)vue-router底層是如何貫穿整個vue項目實現(xiàn)路由跳轉(zhuǎn)的运准?

(2)如何將路由寫的更加優(yōu)雅易懂,熟練運用別名缭受、懶加載胁澳、守衛(wèi)、過渡動效米者、錯誤處理等操作韭畸?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蔓搞,隨后出現(xiàn)的幾起案子胰丁,更是在濱河造成了極大的恐慌,老刑警劉巖喂分,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锦庸,死亡現(xiàn)場離奇詭異,居然都是意外死亡妻顶,警方通過查閱死者的電腦和手機酸员,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進店門蜒车,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人幔嗦,你說我怎么就攤上這事酿愧。” “怎么了邀泉?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵嬉挡,是天一觀的道長。 經(jīng)常有香客問我汇恤,道長庞钢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任因谎,我火速辦了婚禮基括,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘财岔。我一直安慰自己风皿,他們只是感情好,可當我...
    茶點故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布匠璧。 她就那樣靜靜地躺著桐款,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夷恍。 梳的紋絲不亂的頭發(fā)上魔眨,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天,我揣著相機與錄音酿雪,去河邊找鬼遏暴。 笑死,一個胖子當著我的面吹牛指黎,可吹牛的內(nèi)容都是我干的拓挥。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼袋励,長吁一口氣:“原來是場噩夢啊……” “哼侥啤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起茬故,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤盖灸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后磺芭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赁炎,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了徙垫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讥裤。...
    茶點故事閱讀 38,711評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖姻报,靈堂內(nèi)的尸體忽然破棺而出己英,到底是詐尸還是另有隱情,我是刑警寧澤吴旋,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布损肛,位于F島的核電站,受9級特大地震影響荣瑟,放射性物質(zhì)發(fā)生泄漏治拿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一笆焰、第九天 我趴在偏房一處隱蔽的房頂上張望劫谅。 院中可真熱鬧,春花似錦嚷掠、人聲如沸同波。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至戴尸,卻和暖如春粟焊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孙蒙。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工项棠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挎峦。 一個月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓香追,卻偏偏與公主長得像,于是被迫代替她去往敵國和親坦胶。 傳聞我的和親對象是個殘疾皇子透典,可洞房花燭夜當晚...
    茶點故事閱讀 43,595評論 2 350

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