[TOC]
>[success] # 路由守衛
~~~
1.具體介紹可以看路由章節
~~~
>[info] ## 全局守衛
~~~
1.全局守衛的三個時期'beforeEach'、'beforeResolve'、'afterEach',三個時期具
體執行時期參考'路由守衛章節'
~~~
>[danger] ##### 使用'beforeEach' 做一個攔截登錄
~~~
1.首先'beforeEach'是所有路由中最早觸發的,因此我們整個登錄攔截
在'beforeEach' 周期做操作
2.小提示:一般判斷用戶是否登錄,都是根據'session' 來進行操作決定,因此我們
可以把'session' 數據保存在一個全局變量中,通過在'beforeEach'判斷'session'
是否存在
3.根據上面的提示我們可以勾畫出一個邏輯,用來判斷保存全局'session'的值來
決定跳轉頁面的順序,但是 我們可以在進一步優化,比如已經登錄的用戶,在訪問
登錄頁我們讓他直接跳轉到首頁,不需要用戶再次點擊登錄
4.根據上面的兩個提示基本可以勾勒出一個在'beforeEach'的一個登錄判斷
5.下面代碼還需要自己創建一個'login.vue'的視圖組件,和需要在'router' 文件夾
下的'router.js' 中去注冊組件和路由之間的關系
6.下面的to調用的方法可以參考官方文檔'https://router.vuejs.org/zh/api/#%E8%B7%AF%E7%94%B1%E5%AF%B9%E8%B1%A1'
這里再次說明下 這里的'to'等同于'route'和'$route' 因此他們的方法是通用的
7.下面的next中使用等同于'router-link' 中的'to'的使用方式,下面的next中網頁跳轉使
用的都是命名路由的方式
8.下面案例中'HAS_LOGINED' 表示全局儲存的session,這面案例中false表
示沒有登錄,true表示登錄
~~~
* 在router 文件夾下的index.js 中書寫一下代碼
~~~
import Vue from 'vue'
import Router from 'vue-router'
import routes from './router'
Vue.use(Router)
const router = new Router({
routes,
})
// 到時候這里可以做一個全局變量專門保存session
const HAS_LOGINED = false
router.beforeEach((to, from, next)=>{
if(to.name !== 'login'){
if(HAS_LOGINED) next()
else next({name:'login'})
}else{
if(HAS_LOGINED){
console.log('觸發')
next({name:'home'})
} else{
console.log('觸發')
next()
}
}
});
export default router
~~~
>[danger] ##### 'beforeResolve' 詳細可以參考路導航守衛章節
>[danger] ##### 'afterEach' 在路由結束時候去做一些事
~~~
1.注意'afterEach' 沒有 'next' 因為已經是最后階段了所以不需要'next()'
~~~
* 在 router 文件下的index.js 中配置這個周期(因為是最后一個周期所以不需要next 往下傳遞)
~~~
router.afterEach((to, from)=>{
console.log('都結束了')
});
~~~
>[info] ## 路由獨享守衛
~~~
1.路由獨享守衛'beforeEnter',在渲染改組件路由確認前調用
2.根據上面的解釋,我們我可以推測出這方法應該寫的位置,這個路由和組
件綁定的位置在我們這個目錄中'router' 文件夾下的'router.js' 中去配置的,
路由和組件的關系,因此這個方法的調用也應該在這個地方
3.可以做一些 判斷頁面是從哪里來的判斷
~~~
>[danger] ##### 案例
* 在 router 文件下 的router.js 中進行路由獨享守衛配置
~~~
import Home from '@/views/Home.vue'
export default [
{
path: '/about',
name: 'about',
// 我是路由的一個屬性是about 的專屬
beforeEnter(to, from, next){
console.log('beforeEnter 路由中的路由');
next();
},
component: () => import(/* webpackChunkName: "about" */ '@/views/About.vue')
},
]
~~~
>[info] ## 組件內守衛
~~~
1.組件內守衛分三個階段:
'beforeRouteEnter'、'beforeRouteUpdate'、'beforeRouteLeave'三個階段會在不同時刻觸發
2.'beforeRouteEnter' 在還沒有進入該組件之前觸發,一般用獲取異步請求
,可以替代vue生命周期中獲取數據請求
3.'beforeRouteUpdate'在動態路由中使用,由于動態路由中切換路由的時候
,猶豫綁定的是同一個組件因此在不會在重新渲染,但是為了可以讓組件中
的內容重新渲染,有兩種方法第一種使用watch 監聽,但這種需要使
用'props'寫法,另一種就是在'beforeRouteUpdate' 它會監聽到動態路由的改
變,因此可以在這個周期中異步動態路由對應的數據
4.'beforeRouteLeave' 離開組件的時候觸發,可以對表單一些校驗未提交的
時候觸發詢問用戶是否到下一個頁面官方的說法這個離開守衛通常用來禁止
用戶在還未保存修改前突然離開。該導航可以通過 next(false) 來取消。
~~~
>[danger] ##### 案例
~~~
1.在'路由篇章中的導航守衛' 有詳細的案例講解,這里的案例只是簡單說明
2.案例中做了一個離開詢問
3..'beforeRouteUpdate'在動態路由中使用 這里具體用法見路由篇章
~~~
~~~
<template>
<div class="about">
<h1>This is an about page</h1>
</div>
</template>
<script>
export default {
beforeRouteEnter(to, from, next){
// 路由進入組件之前觸發,
// 正因為還沒有進入組件前觸發想獲取組件實例本身也就是this,需要在next中操作
next(
vm =>{
console.log(this)
}
)
},
beforeRouteLeave(to, from, next){
// 路由即將離開組件的時候調用
// 做一些詢問,詢問
const leave = confirm('你確定離開么')
if(leave) next()
else next(false)
}
}
</script>
~~~
>[info] ## 路由元信息
~~~
1.路由元信息的便簽屬性是'meta',這個在html中是個常見的標簽,有時候,
我們會把html 的meta一些配置參數放到這里,下面的案例就是動態生成,
html的title
2.分析上面要做的事,首先每個頁面都有'title',因此他們是公共的方法,可以給這
個方法提取到我們的'lib' 文件夾下的'util.js' 中
3.下面思考觸發的時機,整個觸發的時機最好的點就是'beforeEach'階段是這個路
由最開始的階段
4.我們在給'beforeEach'這個階段使用我們定義的方法時候,兩個知識點,一個是
要導入我們寫的方法,另一個'if(條件){執行}'這種邏輯代碼可以縮寫成,
'條件&&執行'
~~~
* 在lib的util.js 寫的更改title方法(直接改變當前頁面的title)
~~~
export const setTitle = (title)=>{
window.document.title = title || 'admin';
};
~~~
* 在路由中定義 meta 的title 名稱,這里我們只在about 的視圖組件定義
~~~
import Home from '@/views/Home.vue'
export default [
{
path: '/about',
name: 'about',
meta:{
title:"首頁",
},
beforeEnter(to, from, next){
next()
},
component: () => import(/* webpackChunkName: "about" */ '@/views/About.vue')
}
]
~~~
* 在router 文件下的index.js 配置的路由守衛'beforeEach'中配置
~~~
import Vue from 'vue'
import Router from 'vue-router'
import routes from './router'
import {setTitle} from "../lib/util";
Vue.use(Router);
const HAS_LOGINED = true;
const router = new Router({
routes
});
router.beforeEach((to, from, next)=>{
to.meta && setTitle(to.meta.title);
if(to.name ==='login'){
if(HAS_LOGINED) next({name:'home'});
else next()
}else{
if(HAS_LOGINED) next();
else next({name:'login'})
}
});
router.afterEach((to, from)=>{
console.log('都結束了')
});
export default router
~~~
- Vue--基礎篇章
- Vue -- 介紹
- Vue -- MVVM
- Vue -- 創建Vue實例
- Vue -- 模板語法
- Vue -- 指令用法
- v-cloak -- 遮蓋
- v-bind -- 標簽屬性動態綁定
- v-on -- 綁定事件
- v-model -- 雙向數據綁定
- v-for -- 只是循環沒那么簡單
- 小知識點 -- 計劃內屬性
- key -- 屬性為什么要加
- 案例說明
- v-if/v-show -- 顯示隱藏
- v-for 和 v-if 同時使用
- v-pre -- 不渲染大大胡語法
- v-once -- 只渲染一次
- Vue -- class和style綁定
- Vue -- filter 過濾器
- Vue--watch/computed/fun
- watch -- 巧妙利用watch思想
- Vue -- 自定義指令
- Vue -- $方法
- Vue--生命周期
- Vue -- 專屬ajax
- Vue -- transition過渡動畫
- 前面章節的案例
- 案例 -- 跑馬燈效果
- 案例 -- 選項卡內容切換
- 案例-- 篩選商品
- 案例 -- 搜索/刪除/更改
- 案例 -- 用computed做多選
- 案例 -- checked 多選
- Vue--組件篇章
- component -- 介紹
- component -- 使用全局組件
- component -- 使用局部組件
- component -- 組件深入
- component -- 組件傳值父傳子
- component -- 組件傳值子傳父
- component -- 子傳父語法糖拆解
- component -- 父組件操作子組件
- component -- is 動態切換組件
- component -- 用v-if/v-show控制子組件
- component -- 組件切換的動畫效果
- component -- slot 插槽
- component -- 插槽2.6
- component -- 組件的生命周期
- component -- 基礎組件全局注冊
- VueRouter--獲取路由參數
- VueRouter -- 介紹路由
- VueRouter -- 安裝
- VueRouter -- 使用
- VueRouter--router-link簡單參數
- VueRouter--router-link樣式問題
- VueRouter--router-view動畫效果
- VueRouter -- 匹配優先級
- vueRouter -- 動態路由
- VueRouter -- 命名路由
- VueRouter -- 命名視圖
- VueRouter--$router 獲取函數
- VueRouter--$route獲取參數
- VueRouter--路由嵌套
- VueRouter -- 導航守衛
- VueRouter -- 寫在最后
- Vue--模塊化方式結構
- webpack--自定義配置
- webpack -- 自定義Vue操作
- VueCli -- 3.0可視化配置
- VueCli -- 3.0 項目目錄
- Vue -- 組件升級篇
- Vue -- 組件種類與組件組成
- Vue -- 組件prop、event、slot 技巧
- Vue -- 組件通信(一)
- Vue -- 組件通信(二)
- Vue -- 組件通信(三)
- Vue -- 組件通信(四)
- Vue -- 組件通信(五)
- Vue -- 組件通信(六)
- Vue -- bus非父子組件通信
- Vue -- 封裝js插件成vue組件
- vue組件分裝 -- 進階篇
- Vue -- 組件封裝splitpane(分割面板)
- UI -- 正式封裝
- Vue -- iview 可編輯表格案例
- Ui -- iview 可以同時編輯多行
- Vue -- 了解遞歸組件
- UI -- 正式使用遞歸菜單
- Vue -- iview Tree組件
- Vue -- 利用通信仿寫一個form驗證
- Vue -- 使用自己的Form
- Vue -- Checkbox 組件
- Vue -- CheckboxGroup.vue
- Vue -- Alert 組件
- Vue -- 手動掛載組件
- Vue -- Alert開始封裝
- Vue -- 動態表單組件
- Vue -- Vuex組件的狀態管理
- Vuex -- 參數使用理解
- Vuex -- state擴展
- Vuex -- getters擴展
- Vuex--mutations擴展
- Vuex -- Action 異步
- Vuex -- plugins插件
- Vuex -- v-model寫法
- Vuex -- 更多
- VueCli -- 技巧總結篇
- CLI -- 路由基礎
- CLI -- 路由升級篇
- CLI --異步axios
- axios -- 封裝axios
- CLI -- 登錄寫法
- CLI -- 權限
- CLI -- 簡單權限
- CLI -- 動態路由加載
- CLI -- 數據性能優化
- ES6 -- 類的概念
- ES6類 -- 基礎
- ES6 -- 繼承
- ES6 -- 工作實戰用類數據管理
- JS -- 適配器模式
- ES7 -- 裝飾器(Decorator)
- 裝飾器 -- 裝飾器修飾類
- 裝飾器--修飾類方法(知識擴展)
- 裝飾器 -- 裝飾器修飾類中的方法
- 裝飾器 -- 執行順序
- Reflect -- es6 自帶版本
- Reflect -- reflect-metadata 版本
- 實戰 -- 驗證篇章(基礎)
- 驗證篇章 -- 搭建和目錄
- 驗證篇章 -- 創建基本模板
- 驗證篇章 -- 使用
- 實戰 -- 更新模型(為了迎合ui升級)
- 實戰 -- 模型與接口對接
- TypeSprict -- 基礎篇章
- TS-- 搭建(一)webpack版本
- TS -- 搭建(二)直接使用
- TS -- 基礎類型
- TS -- 枚舉類型
- TS -- Symbol
- TS -- interface 接口
- TS -- 函數
- TS -- 泛型
- TS -- 類
- TS -- 類型推論和兼容
- TS -- 高級類型(一)
- TS -- 高級類型(二)
- TS -- 關于模塊解析
- TS -- 聲明合并
- TS -- 混入
- Vue -- TS項目模擬
- TS -- vue和以前代碼對比
- TS -- vue簡單案例上手
- Vue -- 簡單弄懂VueRouter過程
- VueRouter -- 實現簡單Router
- Vue-- 原理2.x源碼簡單理解
- 了解 -- 簡單的響應式工作原理
- 準備工作 -- 了解發布訂閱和觀察者模式
- 了解 -- 響應式工作原理(一)
- 了解 -- 響應式工作原理(二)
- 手寫 -- 簡單的vue數據響應(一)
- 手寫 -- 簡單的vue數據響應(二)
- 模板引擎可以做的
- 了解 -- 虛擬DOM
- 虛擬dom -- 使用Snabbdom
- 閱讀 -- Snabbdom
- 分析snabbdom源碼 -- h函數
- 分析snabbdom -- init 方法
- init 方法 -- patch方法分析(一)
- init 方法 -- patch方法分析(二)
- init方法 -- patch方法分析(三)
- 手寫 -- 簡單的虛擬dom渲染
- 函數表達解析 - h 和 create-element
- dom操作 -- patch.js
- Vue -- 完成一個minVue
- minVue -- 打包入口
- Vue -- new實例做了什么
- Vue -- $mount 模板編譯階段
- 模板編譯 -- 分析入口
- 模板編譯 -- 分析模板轉譯
- Vue -- mountComponent 掛載階段
- 掛載階段 -- vm._render()
- 掛載階段 -- vnode
- 備份章節
- Vue -- Nuxt.js
- Vue3 -- 學習
- Vue3.x --基本功能快速預覽
- Vue3.x -- createApp
- Vue3.x -- 生命周期
- Vue3.x -- 組件
- vue3.x -- 異步組件???
- vue3.x -- Teleport???
- vue3.x -- 動畫章節 ??
- vue3.x -- 自定義指令 ???
- 深入響應性原理 ???
- vue3.x -- Option API VS Composition API
- Vue3.x -- 使用set up
- Vue3.x -- 響應性API
- 其他 Api 使用
- 計算屬性和監聽屬性
- 生命周期
- 小的案例(一)
- 小的案例(二)-- 泛型
- Vue2.x => Vue3.x 導讀
- v-for 中的 Ref 數組 -- 非兼容
- 異步組件
- attribute 強制行為 -- 非兼容
- $attrs 包括 class & style -- 非兼容
- $children -- 移除
- 自定義指令 -- 非兼容
- 自定義元素交互 -- 非兼容
- Data選項 -- 非兼容
- emits Option -- 新增
- 事件 API -- 非兼容
- 過濾器 -- 移除
- 片段 -- 新增
- 函數式組件 -- 非兼容
- 全局 API -- 非兼容
- 全局 API Treeshaking -- 非兼容
- 內聯模板 Attribute -- 非兼容
- key attribute -- 非兼容
- 按鍵修飾符 -- 非兼容
- 移除 $listeners 和 v-on.native -- 非兼容
- 在 prop 的默認函數中訪問 this -- ??
- 組件使用 v-model -- 非兼容
- 渲染函數 API -- ??
- Slot 統一 ??
- 過渡的 class 名更改 ???
- Transition Group 根元素 -- ??
- v-if 與 v-for 的優先級對比 -- 非兼容
- v-bind 合并行為 非兼容
- 監聽數組 -- 非兼容