Vue——導航守衛

一、爲什麼使用導航守衛

在一個SPA應用中,網頁改變,他的標題也需要改變,網頁標題是通過

來顯示的,但是SPA只有一個固定的HTML,切換不同的頁面時,標題並不會改變,所以我們需要用導航守衛進行修改.

守衛包括:全局守衛、路由獨享守衛、組件內的守衛

二、如何修改

1、在index.js中寫 router.beforeEach()函數,它需要我們給他一個箭頭函數,箭頭函數包含有to, from, next三個參數,前兩個參數可以直接從當前route中拿到,所以我們可以在index中加入如下代碼

// 全局導航守衛(實現頁面跳轉,標題隨之更改)
router.beforeEach((to, from, next) =>{
  // congfrofrom跳轉到to
  document.title = to.matched[0].meta.title
  next()
  // matched是匹配了當前的信息,取其中第一個元素必然是當前組件信息
  // 注意:一定要有next,不然無法回調下一步
})

並且要給每個路由添加包含title信息的meta元數據,如下

// index.js

// 配置路由相關信息
import VueRouter from 'vue-router'
import Vue from 'vue'

// import Home from '../components/Home'
// import About from '../components/About'
// import User from '../components/User'

// 路由懶加載
const Home = () => import('../components/Home')
const HomeNews = () => import('../components/HomeNews')
const HomeMessage = () => import('../components/HomeMessage')

const About = () => import('../components/About')
const User = () => import('../components/User')
const Profile = () => import('../components/Profile')

// 1.通過Vue.use(插件),安裝插件
Vue.use(VueRouter)

// 2.創建VueRouter對象
const  routes =[
  {
    // 重定向到首頁,打開網頁就是首頁
    path: '',
    redirect: '/home'
  },
  {
    path: '/home',
    component: Home,
    meta: {
      title: '首頁'
    },
    // 添加屬於Home 的子組件,子組件路由path前面不需要加 '/ '
    children: [
      {
        path: '',
        redirect: 'news',
        // 元數據
        // meta: {
        //   title: '新聞'
        // }
      },
      {
        path: 'news',
        component: HomeNews,
        meta: {
          title: '新聞'
        }
      },
      {
        path: 'message',
        component: HomeMessage,
        meta: {
          title: '消息'
        }
      }
    ]
  },
  {
    path: '/about',
    component: About,
    meta: {
      title: '關於'
    }
  },
  {
    path: '/user/:abc',
    component: User,
    meta: {
      title: '用戶'
    }
  },
  {
    path: '/profile',
    component: Profile,
    meta: {
      title: '檔案'
    }
  }
]
const  router = new VueRouter({
  // 配置路由和組件之間的應用關係
  routes,
  // 將url改成常見的history模式,不用帶'#'的哈希
  mode: 'history',
  linkActiveClass: 'active'
})

// 全局導航守衛(實現頁面跳轉,標題隨之更改)
// 此處是前置守衛
router.beforeEach((to, from, next) =>{
  // congfrofrom跳轉到to
  document.title = to.matched[0].meta.title
  next()
  // 注意:一定要有next,不然無法回調下一步
})

// 3.將router對象傳入到Vue實例
export default router

需要注意的是,導航守衛中的箭頭函數的next是和生命週期中的鉤子函數有關,只有執行了next才能進入下一個鉤子,不然就會阻斷,並且next可以進行判斷後跳轉到其他頁面,可用於登錄等操作,詳情見官網。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章