[toc]
思路:
vue-router的原理主要在于,它會監聽路由的變化,然后根據路由對應的組件,在routeMap里去尋找需要渲染到頁面上的組件,并通過h函數渲染到router-view上。
這里有兩方面可以說的,一個是路由的兩種模式,history和hash模式,另外一個就是new Router這個過程發生了是什么
vue router在創建后會被掛載到vue實例上,使得vue可以通過this.$router操作router
vue-router存在兩種模式,history模式和hash模式
### 1.vue-router核心原理
監聽頁面路由的變化,在routeMap里找到對應路由需要渲染的組件,并通過render函數
渲染到router
### 2.new Router的時候以及掛載router對象的時候發生了什么
#### 1.new Router過程
1.首先new Router對象的時候,會把傳入routes數組傳入,并建立一套path和組件的routeMap映射關系
2.監聽path變化的事件,比如load, hashchange(hash模式), popState(history模式),并且通過vue提供的defineReactive方法,將path變成響應式的,這樣會觸發router-view組件的render函數,根據path獲取對應的component,通過h函數渲染出來
3.為什么defineReactive把path變成響應式了,就可以觸發render的更新?
這里用了一個發布訂閱的思想,在渲染router-view組件的時候,獲取了path,這個時候添加了一個watcher,并且收集到dep中,當path改變的時候,就會通知dep上的notify()發布方法,通知watcher執行update,使得router-view重新渲染了
#### 2.掛載過程
1.構造函數提供一個install方法,接收傳入的Vue構造函數
2.混入mixin 的beforeCreate生命周期,在這時掛載$router
3.在全局上創建兩個組件,router-link和router-view,router-link控制路由的跳轉,router-view或租routeMap中對應的組件,并通過render函數渲染出來
```js
Vue.mixin({
beforeCreate() {
// 全局混入,將來在組件實例化的時候才執行
// 此時 router 實例已經存在
// this 代表組件實例
if (this.$options.router) {
// 掛載
Vue.prototype.$router = this.$options.router
}
}
})
```
### 2.history模式和hash模式
1.history和hash在顯示上的區別在于url后綴里hash模式多了一個#號
2.hash模式修改的是錨點之后的url,并不會引起頁面的刷新,監聽的是window的load以及hashchange事件
```js
// 監聽事件
window.addEventListener('hashchange', this.onHashChange.bind(this))
window.addEventListener('load', this.onHashChange.bind(this))
// 將 # 號后面的字符串截取
onHashChange() {
this.current = window.location.hash.slice(1)
}
```
3.history模式沒有#,修改路由會導致頁面的刷新,這里跳轉頁面用的是h5提供的popstate以及replaceState方法,這兩個方法改變url的path部分不會引起頁面刷新
```js
history.pushState(null, '', el.getAttribute('href'))
```
4.history模式下的vue項目,需要后端配置路由
```js
location / {
try_files $uri $uri/ /index.html;
}
```
- 0. MVC和MVVM
- 1. v-model無法實時更新的解決辦法
- 1. Vue 指令
- 1. v-cloak&v-text&v-html
- 2. v-bind
- 3. v-model
- 7. v-for指令的幾種使用方式
- 8. v-if和v-show的使用
- 2. 事件修飾符
- 3. 通過屬性設置樣式
- 1. 通過屬性綁定設置元素class
- 2. 通過屬性綁定設置元素style
- 4. 自定義指令
- 11. 自定義全局指令
- 12. 自定義私有指令
- 5. 過濾器
- 6. 鍵盤指令
- 7. 生命周期
- 8. vue-resource
- 9. 動畫
- 1. 使用過渡類名實現動畫
- 2. 使用animate.css實現動畫
- 3. 鉤子函數實現小球半場動畫
- 10. 組件
- 1. 全局組件的創建方式
- 2. 私有組件的創建方式
- 3. 組件中的data和methods
- 4. component元素
- 5. 組件配合transition元素實現動畫
- 6. 父組件傳參傳方法
- 11. 路由
- 1. 什么是路由
- 2. vue-router的使用
- 3. 使用router-link&query方式傳遞參數
- 4. 使用param傳值
- 5. 使用children屬性實現路由嵌套
- 6. router-view之間獲取父級data
- 7. 實現路由跳轉的幾種方式
- 12. 設置緩存
- 13. $ref 操作DOM&獲取自定義屬性
- 14. 初始化一個項目
- 15. 使用并封裝一個axios方法
- 17. vuex
- 18. watch 監聽 data數據
- 19. keep alive 緩存路由組件
- vue效果實現
- 1. 實現頂部根據滑動漸隱漸現
- 2. 制作一個動畫包裹組件
- 20. vue 中的數據類操作
- 第三方工具&ui
- 1. vant-ui
- 1. 上拉加載更多
- 2. 使用圖片預加載
- 2. better-scroll
- 1. 實現上下滑動效果
- 2. 實現兩欄式點擊滑動跳轉
- vue3
- compositionApi
- 2. ref 和 reactive
- 4. watch
- 5. watchEffect
- 7.使用ref操作dom
- effect副作用
- 1. 新特性
- 3. 生命周期
- 6.定義props
- 實現自定義組件v-model
- vue面試題
- 1.對mvvm的理解
- 2.vue2和vue3響應式數據的理解
- 3.vue中如何檢測數組的變化
- 4.vue中如何進行依賴收集
- 5.如何理解vue中的模板編譯原理
- 6.vue生命周期以及原理
- 7.vue組件data為什么必須是個函數
- 8.vue-router原理
- 9.vue.mixin原理
- 10.$nextTick原理
- 11.computed和watch的區別
- vue SSR服務端渲染
- 1.什么是服務端渲染
- 2.快速創建服務端渲染