說說 vue-router 元件的高階應用

deniro發表於2019-04-05

說說 vue-router 元件的高階應用

1 動態設定頁面標題

頁面標題是由 <title></title> 來控制的,因為 SPA 只有一個 HTML,所以當切換到不同的頁面時,標題是不會發生變化的。必須通過 JavaScript 來修改 <title></title> 中的內容:

window.document.title ='xxx'
複製程式碼

有一種思路是在每個頁面的 *.vue 的 mounted 鉤子函式中,通過 JavaScript 來修改 <title></title> 中的內容。這種方式固然可行,但如果頁面很多,就會顯著增加維護成本,而且修改邏輯都是一樣的。有沒有更好的方法呢?

我們可以利用 vue-router 元件的導航鉤子 beforeEach 函式,在路由發生變化時,統一設定。

import VueRouter from 'vue-router';
...

//載入 vue-router 外掛
Vue.use(VueRouter);

/*定義路由匹配表*/
const Routers = [{
    path: '/index',
    component: (resolve) => require(['./router/views/index.vue'], resolve),
    meta: {
        title: '首頁'
    }
},
    //一次性載入
    // {
    //     path: '/index',
    //     component: require('./router/views/index.vue')
    // },
    {
        path: '/about',
        component: (resolve) => require(['./router/views/about.vue'], resolve),
        meta: {
            title: '關於'
        }
    },
    {
        path: '/article/:id',
        component: (resolve) => require(['./router/views/article.vue'], resolve)
    }
    ,
    {//當訪問的頁面不存在時,重定向到首頁
        path: '*',
        redirect: '/index'
    }
]

//路由配置
const RouterConfig = {
    //使用 HTML5 的 History 路由模式
    mode: 'history',
    routes: Routers
};
//路由例項
const router = new VueRouter(RouterConfig);

//動態設定頁面標題
router.beforeEach((to, from, next) => {
    window.document.title = to.meta.title;
    next();
})

new Vue({
    el: '#app',
    router: router,
    render: h => h(Hello)
})

複製程式碼

我們在路由匹配表中,為那些需要標題的頁面,配置了 meta title 屬性:

meta: {
        title: 'xxx'
}
複製程式碼

然後在 beforeEach 導航鉤子函式中,從路由物件中獲取 meta title 屬性,用於標題設定。beforeEach 有三個入參:

引數 說明
to 當前導航,即將要進入的路由物件。
from 當前導航,即將要離開的路由物件。
next 呼叫 next() 之後,才會進入下一步。

效果:

說說 vue-router 元件的高階應用

2 長頁面跳轉自動返回頂端

假設第一個頁面較長,使用者滾動檢視到底部,這時如果又跳轉到另一個頁面,那麼滾動條是會預設停在上一個頁面的所在位置的。這種場景比較好的設計是:跳轉後會自動返回頂端。這可以通過 afterEach 鉤子函式來實現,程式碼如下:

router.afterEach((to, from, next) => {
    window.scrollTo(0, 0);
});
複製程式碼

組合使用 beforeEach 與 afterEach,還可以實現:從一個頁面跳轉到另一個頁面時,出現 Loading 動畫,當新頁面載入後,再結束動畫。

3 登陸驗證

某些頁面設定了許可權,只有賬號登陸過,才能訪問;否則跳轉到登入頁。假設我們使用 localStorage 來判斷是否登陸。

HTML5 的 localStorage 特性,用於本地儲存。它的出現,解決了 cookie 儲存空間不足的問題 cookie 中每條 cookie 的儲存空間只有 4k) ,而 localStorage 中一般是 5M,這在不同的瀏覽器中 大小略有不同 。

router.beforeEach((to, from, next) => {
    if (window.localStorage.getItem('token')) {
        next();
    } else {
        next('/login');
    }
});
複製程式碼

next() 入參,如果是 false,會不導航;如果為路徑,則會導航到指定路徑下的頁面。

相關文章