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

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

1、概念簡介

引用官方的一句話

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

個人理解

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

(1)vue-router可以通過html5的history API或者h(yuǎn)ash實現(xiàn)單頁應(yīng)用,即不刷新跳轉(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)。官方文檔給的很詳細(xì),包括歷史記錄等等。
(4)樹狀結(jié)構(gòu)?。?!這個是單頁面應(yīng)用的核心概念 ,有了樹狀結(jié)構(gòu),我們就不需要把路由全部都注冊在整體的根節(jié)點上,每一個節(jié)點都是下一個節(jié)點的根節(jié)點。

components.png

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

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

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

官網(wǎng)給出了
(1)、router.beforeEach
(2)、router.afterEach
(3)、在定義的組件的路由里beforeEnter
(4)、在定義的組件中beforeRouteEnter、beforeRouteUpdatebeforeRouteLeave

這里做一個關(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:被導(dǎo)航到的目標(biāo)Route對象

  • from: Route:正在遠(yuǎn)離的當(dāng)前路線。

  • next: Function:必須調(diào)用此函數(shù)才能解決,next中參數(shù)詳見官方文檔,最常用next(),導(dǎo)航將被確認(rèn)(就是繼續(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: '任務(wù)列表'
          }
        }
      ]
    },
    {
      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'
      }
    }
  ]
})
// 導(dǎo)航守衛(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 : 將路由器導(dǎo)出,必不可少

4、思考

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容