欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue守衛(wèi)零基礎(chǔ)介紹

 更新時間:2022年09月30日 16:20:19   作者:月光曬了很涼快  
導(dǎo)航守衛(wèi)就是路由跳轉(zhuǎn)過程中的一些鉤子函數(shù),這個過程中觸發(fā)的這些函數(shù)能讓你有操作一些其他的事兒的時機(jī),這就是導(dǎo)航守衛(wèi),守衛(wèi)適用于切面編程,即把一件事切成好幾塊,然后分給不同的人去完成,提高工作效率,也可以讓代碼變得更加優(yōu)雅

1. 全局導(dǎo)航守衛(wèi)

語法:

# 守衛(wèi)參數(shù)
    + to: Route: 即將要進(jìn)入的目標(biāo) 路由對象
    + from: Route: 當(dāng)前導(dǎo)航正要離開的路由
    + next: Function: 一定要調(diào)用該next方法,否則路由不向下執(zhí)行,頁面空白。

# 全局前置守衛(wèi),當(dāng)一個導(dǎo)航觸發(fā)時,立刻觸發(fā)前置守衛(wèi),
router.beforeEach((to, from, next) => {
  // ...
  next()
})

//全局解析守衛(wèi),等到路由獨(dú)享守衛(wèi)和組件內(nèi)守衛(wèi)都解析完畢后執(zhí)行
router.beforeResolve((to, from, next) => {
  // ...
  next()
})

# 全局后置鉤子,全部守衛(wèi)執(zhí)行完畢后執(zhí)行
// 此鉤子不會接受 next 函數(shù)也不會改變導(dǎo)航本身
router.afterEach((to, from) => {
  // ...
})

全局導(dǎo)航守衛(wèi)執(zhí)行順序:

news.js(這個文件是從 index.js 文件中抽取拆分出來的,最終要被引入到 insex.js 文件中):

import News from '@/views/News'
import Detail from '@/views/Detail'
import Login from '@/views/Login'
const routes = [
    {
        path: '/news',
        component: News,
    },
    {
        path: '/news/:id',
        name: 'xw',
        component: Detail,
    },
    {
        // 這是登錄頁
        path: '/login',
        component: Login,
    }
]
export default routes

index.js:

import Vue from 'vue'
import VueRouter from 'vue-router'
import news from './routes/news'
// 以插件的方式添加
Vue.use(VueRouter)
// 實(shí)例化路由對象及配置路由表
const routes = [...news]
const router = new VueRouter({
  // 路由模式
  mode: 'history',
  // 路由規(guī)則表
  routes
})
// 全局守衛(wèi) 每次切換頁面都會執(zhí)行到
// 前置
router.beforeEach((to, from, next) => {
  console.log('全局 --- beforeEach')
  next()
})
// 解析
router.beforeResolve((to, from, next) => {
  console.log('全局 --- beforeResolve')
  next()
})
// 后置
router.afterEach((to, from) => {
  console.log('全局 --- afterEach')
})
export default router

登錄頁(index.vue):

<template>
  <div>
    <button>登錄用戶</button>
  </div>
</template>
<script>
export default {
}
</script>
<style lang="scss" scoped></style>

現(xiàn)在我們有這樣一個需求,用戶只有在登錄成功之后,才能訪問新聞頁面,該怎么做呢?

index.js:

import Vue from 'vue'
import VueRouter from 'vue-router'
import news from './routes/news'
// 以插件的方式添加
Vue.use(VueRouter)
// 實(shí)例化路由對象及配置路由表
const routes = [...news]
const router = new VueRouter({
  // 路由模式
  mode: 'history',
  // 路由規(guī)則表
  routes
})
// 用全局前置守衛(wèi)判斷用戶是否登錄
router.beforeEach((to, from, next) => {
  // 在使用導(dǎo)航守衛(wèi)來驗(yàn)證用戶是否登錄,一定要把登錄頁面路由排除掉,防止死循環(huán)
  // 如果沒有在本地存儲中獲取到token值,并且即將跳轉(zhuǎn)的頁面不是登錄頁
  if (!sessionStorage.getItem('token') && to.path != '/login') {
    // 到登錄頁面
    // next('/login')
    // replace: true表示跳轉(zhuǎn)到登錄頁面后,不允許回退
    next({ path: '/login', replace: true })
  } else {
    next()
  }
})
export default router

2. 路由獨(dú)享守衛(wèi)

語法:

const router = new VueRouter({
  routes: [
    {
      path: '/foo',
      component: Foo,
      beforeEnter: (to, from, next) => {
        // ...
		next()
      }
    }
  ]
})

使用:

news.js(這個文件是從 index.js 文件中抽取拆分出來的,最終要被引入到 insex.js 文件中):

import News from '@/views/News'
import Detail from '@/views/Detail'
import Login from '@/views/Login'
const routes = [
  {
    path: '/news',
    component: News,
  },
  {
    path: '/news/:id',
    name: 'xw',
    component: Detail,
  },
    {
      // 這是登錄頁
      path: '/login',
      component: Login,
      // 路由獨(dú)享守衛(wèi) 
      // 只有當(dāng)前的路由規(guī)則才生效,比如登錄頁面的路由獨(dú)享守衛(wèi)在進(jìn)入新聞頁面時就不會生效
      // 路由獨(dú)享守衛(wèi)在每次進(jìn)入到當(dāng)前路由頁面時都會執(zhí)行
      beforeEnter: (to, from, next) => {
        console.log('路由獨(dú)享守衛(wèi) ==login -- --- beforeEnter')
        next()
      }
    }
]
export default routes

3. 組件內(nèi)守衛(wèi)

語法:

你可以在路由組件內(nèi)直接定義以下路由導(dǎo)航守衛(wèi):

const Foo = {
  template: `...`,
  //執(zhí)行完全局前置守衛(wèi)和路由獨(dú)享守衛(wèi),就會執(zhí)行當(dāng)前函數(shù)
  beforeRouteEnter (to, from, next) {
    // 在渲染該組件的對應(yīng)路由被 confirm 前調(diào)用
    // 不!能!獲取組件實(shí)例 `this`
    // 因?yàn)楫?dāng)守衛(wèi)執(zhí)行前,組件實(shí)例還沒被創(chuàng)建
  },
  //動態(tài)路由參數(shù)改變就會觸發(fā)這個函數(shù)
  beforeRouteUpdate (to, from, next) {
    // 在當(dāng)前路由改變,但是該組件被復(fù)用時調(diào)用
    // 舉例來說,對于一個帶有動態(tài)參數(shù)的路徑 /foo/:id,在 /foo/1 和 /foo/2 之間跳轉(zhuǎn)的時候,
    // 由于會渲染同樣的 Foo 組件,因此組件實(shí)例會被復(fù)用。而這個鉤子就會在這個情況下被調(diào)用。
    // 可以訪問組件實(shí)例 `this`
  },
  //離開當(dāng)前頁面時調(diào)用
  beforeRouteLeave (to, from, next) {
    // 導(dǎo)航離開該組件的對應(yīng)路由時調(diào)用
    // 可以訪問組件實(shí)例 `this`
  }
}

所有守衛(wèi)和生命周期函數(shù)的執(zhí)行順序:

news.js(這個文件是從 index.js 文件中抽取拆分出來的,最終要被引入到 insex.js 文件中):

import News from '@/views/News'
import Detail from '@/views/Detail'
import Login from '@/views/Login'
const routes = [
  {
    path: '/news',
    component: News,
  },
  {
    path: '/news/:id',
    name: 'xw',
    component: Detail,
    beforeEnter: (to, from, next) => {
      console.log('路由獨(dú)享守衛(wèi) -- detail --- beforeEnter')
      next()
    }
  },
    {
      // 這是登錄頁
      path: '/login',
      component: Login,
      // 路由獨(dú)享守衛(wèi) 
      // 只有當(dāng)前的路由規(guī)則才生效,比如登錄頁面的路由獨(dú)享守衛(wèi)在進(jìn)入新聞頁面時就不會生效
      // 路由獨(dú)享守衛(wèi)在每次進(jìn)入到當(dāng)前路由頁面時都會執(zhí)行
      beforeEnter: (to, from, next) => {
        console.log('路由獨(dú)享守衛(wèi) ==login -- --- beforeEnter')
        next()
      },
    }
]
export default routes

詳情頁(index.vue):

<template>
  <div>
    <h3>新聞詳情頁</h3>
  </div>
</template>
<script>
export default {
  // 當(dāng)路由訪問到此組件時,執(zhí)行此鉤子函數(shù)
  beforeRouteEnter(to, from, next) {
    console.log("組件 --- beforeRouteEnter");
    next();
  },
  // 離開當(dāng)前路由組件
  beforeRouteLeave(to, from, next) {
    console.log("組件 --- beforeRouteLeave");
    next();
  },
  // 路由參數(shù)的改變,觸發(fā)路由組件守衛(wèi)
  beforeRouteUpdate(to, from, next) {
    console.log(this);
    console.log("組件 --- beforeRouteUpdate");
    next();
  },
  // 和生命周期函數(shù)比較以下執(zhí)行順序
  // 所有路由解析完畢以后,才開始執(zhí)行生命周期函數(shù)
  beforeCreate() {
    console.log('組件 === beforeCreate')
  },
  beforeDestroy() {
    console.log('組件 === beforeDestroy')
  },
  destroyed() {
    console.log('組件 === destroyed')
  },
};
</script>
<style lang="scss" scoped></style>

下面我們來看beforeRouteUpdate函數(shù)什么時候執(zhí)行。

詳情頁(index.vue):

<template>
  <div>
    <h3>新聞詳情頁</h3>
    <router-link to="/news/1">111</router-link><br />
    <router-link to="/news/2">222</router-link><br />
    <router-link to="/news/3">333</router-link>
  </div>
</template>
<script>
export default {
  // 當(dāng)路由訪問到此組件時,執(zhí)行此鉤子函數(shù)
  beforeRouteEnter(to, from, next) {
    console.log("組件 --- beforeRouteEnter");
    next();
  },
  // 離開當(dāng)前路由組件
  beforeRouteLeave(to, from, next) {
    console.log("組件 --- beforeRouteLeave");
    next();
  };
  // 路由參數(shù)的改變,觸發(fā)路由組件守衛(wèi)
  // 可以用來監(jiān)聽頁面是否發(fā)生變化
  beforeRouteUpdate(to, from, next) {
    // console.log(this);
    console.log("組件 --- beforeRouteUpdate");
    next();
  },
  // 監(jiān)聽器也可以用來監(jiān)聽頁面是否發(fā)生變化
  // watch:{
  //   '$route'(n){
  //     console.log('watch --- ' ,n);
  //   }
  // },
  // 和生命周期函數(shù)比較以下執(zhí)行順序
  // 所有路由解析完畢以后,才開始執(zhí)行生命周期函數(shù)
  beforeCreate() {
    console.log('組件 === beforeCreate')
  },

  beforeDestroy() {
    console.log('組件 === beforeDestroy')
  },
  destroyed() {
    console.log('組件 === destroyed')
  },
};
</script>
<style lang="scss" scoped></style>

到此這篇關(guān)于Vue守衛(wèi)零基礎(chǔ)介紹的文章就介紹到這了,更多相關(guān)Vue守衛(wèi)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue之創(chuàng)建項(xiàng)目及目錄方式

    Vue之創(chuàng)建項(xiàng)目及目錄方式

    這篇文章主要介紹了Vue之創(chuàng)建項(xiàng)目及目錄方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 實(shí)現(xiàn)一個 Vue 吸頂錨點(diǎn)組件方法

    實(shí)現(xiàn)一個 Vue 吸頂錨點(diǎn)組件方法

    這篇文章主要介紹了實(shí)現(xiàn)一個 Vue 吸頂錨點(diǎn)組件方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Vue.js第二天學(xué)習(xí)筆記(vue-router)

    Vue.js第二天學(xué)習(xí)筆記(vue-router)

    這篇文章主要為大家詳細(xì)介紹了Vue.js第二天的學(xué)習(xí)筆記,關(guān)于vue-router的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Vue中@click事件的常見修飾符用法總結(jié)

    Vue中@click事件的常見修飾符用法總結(jié)

    這篇文章主要給大家介紹了關(guān)于Vue中@click事件的常見修飾符用法的相關(guān)資料,@click事件修飾符是在Vue組件中用來修改@click事件行為的特殊標(biāo)記,需要的朋友可以參考下
    2023-10-10
  • Vue編寫炫酷的時鐘插件

    Vue編寫炫酷的時鐘插件

    這篇文章主要為大家詳細(xì)介紹了Vue編寫炫酷的時鐘插件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • vue使用wavesurfer.js解決音頻可視化播放問題

    vue使用wavesurfer.js解決音頻可視化播放問題

    Wavesurfer.js是一款基于HTML5?canvas和Web?Audio的聲紋可視化插件,功能十分強(qiáng)大,在Vue框架中嵌入使用該插件,今天重點(diǎn)給大家介紹下vue使用wavesurfer.js解決音頻可視化播放問題,感興趣的朋友一起看看吧
    2022-04-04
  • VSCode Vue開發(fā)推薦插件和VSCode快捷鍵(小結(jié))

    VSCode Vue開發(fā)推薦插件和VSCode快捷鍵(小結(jié))

    這篇文章主要介紹了VSCode Vue開發(fā)推薦插件和VSCode快捷鍵(小結(jié)),文中通過圖文表格介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Vue生命周期介紹和鉤子函數(shù)詳解

    Vue生命周期介紹和鉤子函數(shù)詳解

    這篇文章主要給大家介紹了關(guān)于Vue生命周期介紹和鉤子函數(shù)的相關(guān)資料,對大家學(xué)習(xí)或者使用vue2具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨小編一起來看看吧
    2021-10-10
  • 簡單了解前端漸進(jìn)式框架VUE

    簡單了解前端漸進(jìn)式框架VUE

    這篇文章主要介紹了前端漸進(jìn)式框架VUE的相關(guān)資料,文中講解的非常細(xì)致,幫助大家開始學(xué)習(xí)VUE,感興趣的朋友可以了解下
    2020-07-07
  • vue中使用hover選擇器無效的問題

    vue中使用hover選擇器無效的問題

    這篇文章主要介紹了vue中使用hover選擇器無效的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10

最新評論