1. 程式人生 > 其它 >vue2+vue3重點知識筆記 ----非原創

vue2+vue3重點知識筆記 ----非原創

# 筆記

## 腳手架檔案結構

├── node_modules
├── public
│ ├── favicon.ico: 頁籤圖示
│ └── index.html: 主頁面
├── src
│ ├── assets: 存放靜態資源
│ │ └── logo.png
│ │── component: 存放元件
│ │ └── HelloWorld.vue
│ │── App.vue: 彙總所有元件
│ │── main.js: 入口檔案
├── .gitignore: git版本管制忽略的配置
├── babel.config.js: babel的配置檔案
├── package.json: 應用包配置檔案
├── README.md: 應用描述檔案
├── package-lock.json:包版本控制檔案

## 關於不同版本的Vue

1. vue.js與vue.runtime.xxx.js的區別:
1. vue.js是完整版的Vue,包含:核心功能 + 模板解析器。
2. vue.runtime.xxx.js是執行版的Vue,只包含:核心功能;沒有模板解析器。
2. 因為vue.runtime.xxx.js沒有模板解析器,所以不能使用template這個配置項,需要使用render函式接收到的createElement函式去指定具體內容。

## vue.config.js配置檔案

1. 使用vue inspect > output.js可以檢視到Vue腳手架的預設配置。
2. 使用vue.config.js可以對腳手架進行個性化定製,詳情見:https://cli.vuejs.org/zh

## ref屬性

1. 被用來給元素或子元件註冊引用資訊(id的替代者)
2. 應用在html標籤上獲取的是真實DOM元素,應用在元件標籤上是元件例項物件(vc)
3. 使用方式:
1. 打標識:```<h1 ref="xxx">.....</h1>``` 或 ```<School ref="xxx"></School>```
2. 獲取:```this.$refs.xxx```

## props配置項

1. 功能:讓元件接收外部傳過來的資料

2. 傳遞資料:```<Demo name="xxx"/>```

3. 接收資料:

1. 第一種方式(只接收):```props:['name'] ```

2. 第二種方式(限制類型):```props:{name:String}```

3. 第三種方式(限制類型、限制必要性、指定預設值):

```js
props:{
name:{
type:String, //型別
required:true, //必要性
default:'老王' //預設值
}
}
```

> 備註:props是隻讀的,Vue底層會監測你對props的修改,如果進行了修改,就會發出警告,若業務需求確實需要修改,那麼請複製props的內容到data中一份,然後去修改data中的資料。

## mixin(混入)

1. 功能:可以把多個元件共用的配置提取成一個混入物件

2. 使用方式:

第一步定義混合:

```
{
data(){....},
methods:{....}
....
}
```

第二步使用混入:

​ 全域性混入:```Vue.mixin(xxx)```
​ 區域性混入:```mixins:['xxx'] ```

## 外掛

1. 功能:用於增強Vue

2. 本質:包含install方法的一個物件,install的第一個引數是Vue,第二個以後的引數是外掛使用者傳遞的資料。

3. 定義外掛:

```js
物件.install = function (Vue, options) {
// 1. 新增全域性過濾器
Vue.filter(....)

// 2. 新增全域性指令
Vue.directive(....)

// 3. 配置全域性混入(合)
Vue.mixin(....)

// 4. 新增例項方法
Vue.prototype.$myMethod = function () {...}
Vue.prototype.$myProperty = xxxx
}
```

4. 使用外掛:```Vue.use()```

## scoped樣式

1. 作用:讓樣式在區域性生效,防止衝突。
2. 寫法:```<style scoped>```

## 總結TodoList案例

1. 元件化編碼流程:

​ (1).拆分靜態元件:元件要按照功能點拆分,命名不要與html元素衝突。

​ (2).實現動態元件:考慮好資料的存放位置,資料是一個元件在用,還是一些元件在用:

​ 1).一個元件在用:放在元件自身即可。

​ 2). 一些元件在用:放在他們共同的父元件上(<span style="color:red">狀態提升</span>)。

​ (3).實現互動:從繫結事件開始。

2. props適用於:

​ (1).父元件 ==> 子元件 通訊

​ (2).子元件 ==> 父元件 通訊(要求父先給子一個函式)

3. 使用v-model時要切記:v-model繫結的值不能是props傳過來的值,因為props是不可以修改的!

4. props傳過來的若是物件型別的值,修改物件中的屬性時Vue不會報錯,但不推薦這樣做。

## webStorage

1. 儲存內容大小一般支援5MB左右(不同瀏覽器可能還不一樣)

2. 瀏覽器端通過 Window.sessionStorage 和 Window.localStorage 屬性來實現本地儲存機制。

3. 相關API:

1. ```xxxxxStorage.setItem('key', 'value');```
該方法接受一個鍵和值作為引數,會把鍵值對新增到儲存中,如果鍵名存在,則更新其對應的值。

2. ```xxxxxStorage.getItem('person');```

​ 該方法接受一個鍵名作為引數,返回鍵名對應的值。

3. ```xxxxxStorage.removeItem('key');```

​ 該方法接受一個鍵名作為引數,並把該鍵名從儲存中刪除。

4. ``` xxxxxStorage.clear()```

​ 該方法會清空儲存中的所有資料。

4. 備註:

1. SessionStorage儲存的內容會隨著瀏覽器視窗關閉而消失。
2. LocalStorage儲存的內容,需要手動清除才會消失。
3. ```xxxxxStorage.getItem(xxx)```如果xxx對應的value獲取不到,那麼getItem的返回值是null。
4. ```JSON.parse(null)```的結果依然是null。

## 元件的自定義事件

1. 一種元件間通訊的方式,適用於:<strong style="color:red">子元件 ===> 父元件</strong>

2. 使用場景:A是父元件,B是子元件,B想給A傳資料,那麼就要在A中給B繫結自定義事件(<span style="color:red">事件的回撥在A中</span>)。

3. 繫結自定義事件:

1. 第一種方式,在父元件中:```<Demo @atguigu="test"/>``` 或 ```<Demo v-on:atguigu="test"/>```

2. 第二種方式,在父元件中:

```js
<Demo ref="demo"/>
......
mounted(){
this.$refs.xxx.$on('atguigu',this.test)
}
```

3. 若想讓自定義事件只能觸發一次,可以使用```once```修飾符,或```$once```方法。

4. 觸發自定義事件:```this.$emit('atguigu',資料)```

5. 解綁自定義事件```this.$off('atguigu')```

6. 元件上也可以繫結原生DOM事件,需要使用```native```修飾符。

7. 注意:通過```this.$refs.xxx.$on('atguigu',回撥)```繫結自定義事件時,回撥<span style="color:red">要麼配置在methods中</span>,<span style="color:red">要麼用箭頭函式</span>,否則this指向會出問題!

## 全域性事件匯流排(GlobalEventBus)

1. 一種元件間通訊的方式,適用於<span style="color:red">任意元件間通訊</span>。

2. 安裝全域性事件匯流排:

```js
new Vue({
......
beforeCreate() {
Vue.prototype.$bus = this //安裝全域性事件匯流排,$bus就是當前應用的vm
},
......
})
```

3. 使用事件匯流排:

1. 接收資料:A元件想接收資料,則在A元件中給$bus繫結自定義事件,事件的<span style="color:red">回撥留在A元件自身。</span>

```js
methods(){
demo(data){......}
}
......
mounted() {
this.$bus.$on('xxxx',this.demo)
}
```

2. 提供資料:```this.$bus.$emit('xxxx',資料)```

4. 最好在beforeDestroy鉤子中,用$off去解綁<span style="color:red">當前元件所用到的</span>事件。

## 訊息訂閱與釋出(pubsub)

1. 一種元件間通訊的方式,適用於<span style="color:red">任意元件間通訊</span>。

2. 使用步驟:

1. 安裝pubsub:```npm i pubsub-js```

2. 引入: ```import pubsub from 'pubsub-js'```

3. 接收資料:A元件想接收資料,則在A元件中訂閱訊息,訂閱的<span style="color:red">回撥留在A元件自身。</span>

```js
methods(){
demo(data){......}
}
......
mounted() {
this.pid = pubsub.subscribe('xxx',this.demo) //訂閱訊息
}
```

4. 提供資料:```pubsub.publish('xxx',資料)```

5. 最好在beforeDestroy鉤子中,用```PubSub.unsubscribe(pid)```去<span style="color:red">取消訂閱。</span>

## nextTick

1. 語法:```this.$nextTick(回撥函式)```
2. 作用:在下一次 DOM 更新結束後執行其指定的回撥。
3. 什麼時候用:當改變資料後,要基於更新後的新DOM進行某些操作時,要在nextTick所指定的回撥函式中執行。

## Vue封裝的過度與動畫

1. 作用:在插入、更新或移除 DOM元素時,在合適的時候給元素新增樣式類名。

2. 圖示:<img src="https://img04.sogoucdn.com/app/a/100520146/5990c1dff7dc7a8fb3b34b4462bd0105" style="width:60%" />

3. 寫法:

1. 準備好樣式:

- 元素進入的樣式:
1. v-enter:進入的起點
2. v-enter-active:進入過程中
3. v-enter-to:進入的終點
- 元素離開的樣式:
1. v-leave:離開的起點
2. v-leave-active:離開過程中
3. v-leave-to:離開的終點

2. 使用```<transition>```包裹要過度的元素,並配置name屬性:

```vue
<transition name="hello">
<h1 v-show="isShow">你好啊!</h1>
</transition>
```

3. 備註:若有多個元素需要過度,則需要使用:```<transition-group>```,且每個元素都要指定```key```值。

## vue腳手架配置代理

### 方法一

​ 在vue.config.js中新增如下配置:

```js
devServer:{
proxy:"http://localhost:5000"
}
```

說明:

1. 優點:配置簡單,請求資源時直接發給前端(8080)即可。
2. 缺點:不能配置多個代理,不能靈活的控制請求是否走代理。
3. 工作方式:若按照上述配置代理,當請求了前端不存在的資源時,那麼該請求會轉發給伺服器 (優先匹配前端資源)

### 方法二

​ 編寫vue.config.js配置具體代理規則:

```js
module.exports = {
devServer: {
proxy: {
'/api1': {// 匹配所有以 '/api1'開頭的請求路徑
target: 'http://localhost:5000',// 代理目標的基礎路徑
changeOrigin: true,
pathRewrite: {'^/api1': ''}
},
'/api2': {// 匹配所有以 '/api2'開頭的請求路徑
target: 'http://localhost:5001',// 代理目標的基礎路徑
changeOrigin: true,
pathRewrite: {'^/api2': ''}
}
}
}
}
/*
changeOrigin設定為true時,伺服器收到的請求頭中的host為:localhost:5000
changeOrigin設定為false時,伺服器收到的請求頭中的host為:localhost:8080
changeOrigin預設值為true
*/
```

說明:

1. 優點:可以配置多個代理,且可以靈活的控制請求是否走代理。
2. 缺點:配置略微繁瑣,請求資源時必須加字首。

## 插槽

1. 作用:讓父元件可以向子元件指定位置插入html結構,也是一種元件間通訊的方式,適用於 <strong style="color:red">父元件 ===> 子元件</strong> 。

2. 分類:預設插槽、具名插槽、作用域插槽

3. 使用方式:

1. 預設插槽:

```vue
父元件中:
<Category>
<div>html結構1</div>
</Category>
子元件中:
<template>
<div>
<!-- 定義插槽 -->
<slot>插槽預設內容...</slot>
</div>
</template>
```

2. 具名插槽:

```vue
父元件中:
<Category>
<template slot="center">
<div>html結構1</div>
</template>

<template v-slot:footer>
<div>html結構2</div>
</template>
</Category>
子元件中:
<template>
<div>
<!-- 定義插槽 -->
<slot name="center">插槽預設內容...</slot>
<slot name="footer">插槽預設內容...</slot>
</div>
</template>
```

3. 作用域插槽:

1. 理解:<span style="color:red">資料在元件的自身,但根據資料生成的結構需要元件的使用者來決定。</span>(games資料在Category元件中,但使用資料所遍歷出來的結構由App元件決定)

2. 具體編碼:

```vue
父元件中:
<Category>
<template scope="scopeData">
<!-- 生成的是ul列表 -->
<ul>
<li v-for="g in scopeData.games" :key="g">{{g}}</li>
</ul>
</template>
</Category>

<Category>
<template slot-scope="scopeData">
<!-- 生成的是h4標題 -->
<h4 v-for="g in scopeData.games" :key="g">{{g}}</h4>
</template>
</Category>
子元件中:
<template>
<div>
<slot :games="games"></slot>
</div>
</template>

<script>
export default {
name:'Category',
props:['title'],
//資料在子元件自身
data() {
return {
games:['紅色警戒','穿越火線','勁舞團','超級瑪麗']
}
},
}
</script>
```
```

```

## Vuex

### 1.概念

​ 在Vue中實現集中式狀態(資料)管理的一個Vue外掛,對vue應用中多個元件的共享狀態進行集中式的管理(讀/寫),也是一種元件間通訊的方式,且適用於任意元件間通訊。

### 2.何時使用?

​ 多個元件需要共享資料時

### 3.搭建vuex環境

1. 建立檔案:```src/store/index.js```

```js
//引入Vue核心庫
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//應用Vuex外掛
Vue.use(Vuex)

//準備actions物件——響應元件中使用者的動作
const actions = {}
//準備mutations物件——修改state中的資料
const mutations = {}
//準備state物件——儲存具體的資料
const state = {}

//建立並暴露store
export default new Vuex.Store({
actions,
mutations,
state
})
```

2. 在```main.js```中建立vm時傳入```store```配置項

```js
......
//引入store
import store from './store'
......

//建立vm
new Vue({
el:'#app',
render: h => h(App),
store
})
```

### 4.基本使用

1. 初始化資料、配置```actions```、配置```mutations```,操作檔案```store.js```

```js
//引入Vue核心庫
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//引用Vuex
Vue.use(Vuex)

const actions = {
//響應元件中加的動作
jia(context,value){
// console.log('actions中的jia被呼叫了',miniStore,value)
context.commit('JIA',value)
},
}

const mutations = {
//執行加
JIA(state,value){
// console.log('mutations中的JIA被呼叫了',state,value)
state.sum += value
}
}

//初始化資料
const state = {
sum:0
}

//建立並暴露store
export default new Vuex.Store({
actions,
mutations,
state,
})
```

2. 元件中讀取vuex中的資料:```$store.state.sum```

3. 元件中修改vuex中的資料:```$store.dispatch('action中的方法名',資料)``` 或 ```$store.commit('mutations中的方法名',資料)```

> 備註:若沒有網路請求或其他業務邏輯,元件中也可以越過actions,即不寫```dispatch```,直接編寫```commit```

### 5.getters的使用

1. 概念:當state中的資料需要經過加工後再使用時,可以使用getters加工。

2. 在```store.js```中追加```getters```配置

```js
......

const getters = {
bigSum(state){
return state.sum * 10
}
}

//建立並暴露store
export default new Vuex.Store({
......
getters
})
```

3. 元件中讀取資料:```$store.getters.bigSum```

### 6.四個map方法的使用

1. <strong>mapState方法:</strong>用於幫助我們對映```state```中的資料為計算屬性

```js
computed: {
//藉助mapState生成計算屬性:sum、school、subject(物件寫法)
...mapState({sum:'sum',school:'school',subject:'subject'}),

//藉助mapState生成計算屬性:sum、school、subject(陣列寫法)
...mapState(['sum','school','subject']),
},
```

2. <strong>mapGetters方法:</strong>用於幫助我們對映```getters```中的資料為計算屬性

```js
computed: {
//藉助mapGetters生成計算屬性:bigSum(物件寫法)
...mapGetters({bigSum:'bigSum'}),

//藉助mapGetters生成計算屬性:bigSum(陣列寫法)
...mapGetters(['bigSum'])
},
```

3. <strong>mapActions方法:</strong>用於幫助我們生成與```actions```對話的方法,即:包含```$store.dispatch(xxx)```的函式

```js
methods:{
//靠mapActions生成:incrementOdd、incrementWait(物件形式)
...mapActions({incrementOdd:'jiaOdd',incrementWait:'jiaWait'})

//靠mapActions生成:incrementOdd、incrementWait(陣列形式)
...mapActions(['jiaOdd','jiaWait'])
}
```

4. <strong>mapMutations方法:</strong>用於幫助我們生成與```mutations```對話的方法,即:包含```$store.commit(xxx)```的函式

```js
methods:{
//靠mapActions生成:increment、decrement(物件形式)
...mapMutations({increment:'JIA',decrement:'JIAN'}),

//靠mapMutations生成:JIA、JIAN(物件形式)
...mapMutations(['JIA','JIAN']),
}
```

> 備註:mapActions與mapMutations使用時,若需要傳遞引數需要:在模板中繫結事件時傳遞好引數,否則引數是事件物件。

### 7.模組化+名稱空間

1. 目的:讓程式碼更好維護,讓多種資料分類更加明確。

2. 修改```store.js```

```javascript
const countAbout = {
namespaced:true,//開啟名稱空間
state:{x:1},
mutations: { ... },
actions: { ... },
getters: {
bigSum(state){
return state.sum * 10
}
}
}

const personAbout = {
namespaced:true,//開啟名稱空間
state:{ ... },
mutations: { ... },
actions: { ... }
}

const store = new Vuex.Store({
modules: {
countAbout,
personAbout
}
})
```

3. 開啟名稱空間後,元件中讀取state資料:

```js
//方式一:自己直接讀取
this.$store.state.personAbout.list
//方式二:藉助mapState讀取:
...mapState('countAbout',['sum','school','subject']),
```

4. 開啟名稱空間後,元件中讀取getters資料:

```js
//方式一:自己直接讀取
this.$store.getters['personAbout/firstPersonName']
//方式二:藉助mapGetters讀取:
...mapGetters('countAbout',['bigSum'])
```

5. 開啟名稱空間後,元件中呼叫dispatch

```js
//方式一:自己直接dispatch
this.$store.dispatch('personAbout/addPersonWang',person)
//方式二:藉助mapActions:
...mapActions('countAbout',{incrementOdd:'jiaOdd',incrementWait:'jiaWait'})
```

6. 開啟名稱空間後,元件中呼叫commit

```js
//方式一:自己直接commit
this.$store.commit('personAbout/ADD_PERSON',person)
//方式二:藉助mapMutations:
...mapMutations('countAbout',{increment:'JIA',decrement:'JIAN'}),
```

## 路由

1. 理解: 一個路由(route)就是一組對映關係(key - value),多個路由需要路由器(router)進行管理。
2. 前端路由:key是路徑,value是元件。

### 1.基本使用

1. 安裝vue-router,命令:```npm i vue-router```

2. 應用外掛:```Vue.use(VueRouter)```

3. 編寫router配置項:

```js
//引入VueRouter
import VueRouter from 'vue-router'
//引入Luyou 元件
import About from '../components/About'
import Home from '../components/Home'

//建立router例項物件,去管理一組一組的路由規則
const router = new VueRouter({
routes:[
{
path:'/about',
component:About
},
{
path:'/home',
component:Home
}
]
})

//暴露router
export default router
```

4. 實現切換(active-class可配置高亮樣式)

```vue
<router-link active-class="active" to="/about">About</router-link>
```

5. 指定展示位置

```vue
<router-view></router-view>
```

### 2.幾個注意點

1. 路由元件通常存放在```pages```資料夾,一般元件通常存放在```components```資料夾。
2. 通過切換,“隱藏”了的路由元件,預設是被銷燬掉的,需要的時候再去掛載。
3. 每個元件都有自己的```$route```屬性,裡面儲存著自己的路由資訊。
4. 整個應用只有一個router,可以通過元件的```$router```屬性獲取到。

### 3.多級路由(多級路由)

1. 配置路由規則,使用children配置項:

```js
routes:[
{
path:'/about',
component:About,
},
{
path:'/home',
component:Home,
children:[ //通過children配置子級路由
{
path:'news', //此處一定不要寫:/news
component:News
},
{
path:'message',//此處一定不要寫:/message
component:Message
}
]
}
]
```

2. 跳轉(要寫完整路徑):

```vue
<router-link to="/home/news">News</router-link>
```

### 4.路由的query引數

1. 傳遞引數

```vue
<!-- 跳轉並攜帶query引數,to的字串寫法 -->
<router-link :to="/home/message/detail?id=666&title=你好">跳轉</router-link>

<!-- 跳轉並攜帶query引數,to的物件寫法 -->
<router-link
:to="{
path:'/home/message/detail',
query:{
id:666,
title:'你好'
}
}"
>跳轉</router-link>
```

2. 接收引數:

```js
$route.query.id
$route.query.title
```

### 5.命名路由

1. 作用:可以簡化路由的跳轉。

2. 如何使用

1. 給路由命名:

```js
{
path:'/demo',
component:Demo,
children:[
{
path:'test',
component:Test,
children:[
{
name:'hello' //給路由命名
path:'welcome',
component:Hello,
}
]
}
]
}
```

2. 簡化跳轉:

```vue
<!--簡化前,需要寫完整的路徑 -->
<router-link to="/demo/test/welcome">跳轉</router-link>

<!--簡化後,直接通過名字跳轉 -->
<router-link :to="{name:'hello'}">跳轉</router-link>

<!--簡化寫法配合傳遞引數 -->
<router-link
:to="{
name:'hello',
query:{
id:666,
title:'你好'
}
}"
>跳轉</router-link>
```

### 6.路由的params引數

1. 配置路由,宣告接收params引數

```js
{
path:'/home',
component:Home,
children:[
{
path:'news',
component:News
},
{
component:Message,
children:[
{
name:'xiangqing',
path:'detail/:id/:title', //使用佔位符宣告接收params引數
component:Detail
}
]
}
]
}
```

2. 傳遞引數

```vue
<!-- 跳轉並攜帶params引數,to的字串寫法 -->
<router-link :to="/home/message/detail/666/你好">跳轉</router-link>

<!-- 跳轉並攜帶params引數,to的物件寫法 -->
<router-link
:to="{
name:'xiangqing',
params:{
id:666,
title:'你好'
}
}"
>跳轉</router-link>
```

> 特別注意:路由攜帶params引數時,若使用to的物件寫法,則不能使用path配置項,必須使用name配置!

3. 接收引數:

```js
$route.params.id
$route.params.title
```

### 7.路由的props配置

​ 作用:讓路由元件更方便的收到引數

```js
{
name:'xiangqing',
path:'detail/:id',
component:Detail,

//第一種寫法:props值為物件,該物件中所有的key-value的組合最終都會通過props傳給Detail元件
// props:{a:900}

//第二種寫法:props值為布林值,布林值為true,則把路由收到的所有params引數通過props傳給Detail元件
// props:true

//第三種寫法:props值為函式,該函式返回的物件中每一組key-value都會通過props傳給Detail元件
props(route){
return {
id:route.query.id,
title:route.query.title
}
}
}
```

### 8.```<router-link>```的replace屬性

1. 作用:控制路由跳轉時操作瀏覽器歷史記錄的模式
2. 瀏覽器的歷史記錄有兩種寫入方式:分別為```push```和```replace```,```push```是追加歷史記錄,```replace```是替換當前記錄。路由跳轉時候預設為```push```
3. 如何開啟```replace```模式:```<router-link replace .......>News</router-link>```

### 9.程式設計式路由導航

1. 作用:不借助```<router-link> ```實現路由跳轉,讓路由跳轉更加靈活

2. 具體編碼:

```js
//$router的兩個API
this.$router.push({
name:'xiangqing',
params:{
id:xxx,
title:xxx
}
})

this.$router.replace({
name:'xiangqing',
params:{
id:xxx,
title:xxx
}
})
this.$router.forward() //前進
this.$router.back() //後退
this.$router.go() //可前進也可後退
```

### 10.快取路由元件

1. 作用:讓不展示的路由元件保持掛載,不被銷燬。

2. 具體編碼:

```vue
<keep-alive include="News">
<router-view></router-view>
</keep-alive>
```

### 11.兩個新的生命週期鉤子

1. 作用:路由元件所獨有的兩個鉤子,用於捕獲路由元件的啟用狀態。
2. 具體名字:
1. ```activated```路由元件被啟用時觸發。
2. ```deactivated```路由元件失活時觸發。

### 12.路由守衛

1. 作用:對路由進行許可權控制

2. 分類:全域性守衛、獨享守衛、元件內守衛

3. 全域性守衛:

```js
//全域性前置守衛:初始化時執行、每次路由切換前執行
router.beforeEach((to,from,next)=>{
console.log('beforeEach',to,from)
if(to.meta.isAuth){ //判斷當前路由是否需要進行許可權控制
if(localStorage.getItem('school') === 'atguigu'){ //許可權控制的具體規則
next() //放行
}else{
alert('暫無許可權檢視')
// next({name:'guanyu'})
}
}else{
next() //放行
}
})

//全域性後置守衛:初始化時執行、每次路由切換後執行
router.afterEach((to,from)=>{
console.log('afterEach',to,from)
if(to.meta.title){
document.title = to.meta.title //修改網頁的title
}else{
document.title = 'vue_test'
}
})
```

4. 獨享守衛:

```js
beforeEnter(to,from,next){
console.log('beforeEnter',to,from)
if(to.meta.isAuth){ //判斷當前路由是否需要進行許可權控制
if(localStorage.getItem('school') === 'atguigu'){
next()
}else{
alert('暫無許可權檢視')
// next({name:'guanyu'})
}
}else{
next()
}
}
```

5. 元件內守衛:

```js
//進入守衛:通過路由規則,進入該元件時被呼叫
beforeRouteEnter (to, from, next) {
},
//離開守衛:通過路由規則,離開該元件時被呼叫
beforeRouteLeave (to, from, next) {
}
```

### 13.路由器的兩種工作模式

 

1. 對於一個url來說,什麼是hash值?—— #及其後面的內容就是hash值。
2. hash值不會包含在 HTTP 請求中,即:hash值不會帶給伺服器。
3. hash模式:
1. 地址中永遠帶著#號,不美觀 。
2. 若以後將地址通過第三方手機app分享,若app校驗嚴格,則地址會被標記為不合法。
3. 相容性較好。
4. history模式:
1. 地址乾淨,美觀 。
2. 相容性和hash模式相比略差。
3. 應用部署上線時需要後端人員支援,解決重新整理頁面服務端404的問題。