[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.快速创建服务端渲染