一、MVVM 的理解
M表示Model(模型),可以简单理解为业务逻辑和数据。 V表示View(视图),可以简单理解为界面显示的内容。VM表示ViewModel(视图模型),可以将ViewMode看作是Model和View的连接桥。View可以通过事件绑定Model,Model可以通过数据绑定View,通过ViewMode可以实现数据和视图的完全分离。(前端工程师只需要关注结果即可,不需要人为的去操作,这种编程范式就是声明式编程)

MVVM框架优点:
① 低耦合 view可以独立于model变化和修改
② 可重用性 很多view可以用同一个viewmodel
③ 独立开发
④ 可测试 可以针对viewmodel来写测试,测试界面
二、Vue的双向数据绑定原理
vue实现数据双向绑定主要是:
采用数据劫持(Object.defineProperty()) 结合 发布者-订阅者模式 的方式。

三、Vue组件之间的参数传递
1、父传子: props
2、 子传父: $emit
3、父访问子: $children 或 $refs(ref) (使用this.$children取组件对象)
4、子访问父: $parent (使用this.$parent取父组件对象)
5、访问根组件: $root (使用this.$root取父组件对象)
6、使用路由传值:
(1)动态路由传值,取值通过 this.$route.params
(2)路由的query传值, 取值通过 this.$route.query
7、Vuex(组件状态管理) 核心概念:State Getters Mutations Actions Modules
8、全局组件传值
9、eventBus全局的事件总线,就是创建一个事件中心,相当于中转站,可以用它来传递事件和接收事件。
注: 项目比较小时,用eventBus比较合适, 虽然也有不少人推荐直接用VUEX,具体来说看需求咯。技术只是手段,目的达到才是王道。
四、vue的生命周期函数
1、挂载阶段(一次生命周期的过程,只会触发一次)
(1)beforeCreate实例创建之前 拿不到 data 中的数据
(2)created实例创建完成,从这里开始才能获取到数据,在这里发送 ajax 请求
(3)beforeMount挂载之前,模板编译完成但是页面还看不到效果.获取不了真的 DOM 数据,\$refs 也不能使用
(4)mounted挂载完成,这时真实 DOM 数据才更新了,可以获取到真实的 DOM 数据。 \$refs 也可以使用了,在这里发送 ajax 请求
2、更新阶段(一次生命周期的过程,会触发多次)
(1)beforeUpdate更新之前, 真实 DOM 还没有更新
(2)updated 更新完成,真实 DOM 已经更新了
3、销毁阶段(一次生命周期的过程,只会触发一次)
(1) 调用实例的 \$destroy() 方法,让实例进入销毁阶段
(2) v-if 控制组件。如果条件是 false, 那么控制的那个组件的销毁阶段就开始了。
(3)beforeDestroy销毁之前,做一些清除工作,比如清除计时器、清除全局的事件监听等。
(4)destroyed销毁完成,这个生命周期函数里面,我们没什么好处理的。
五、vuex的理解与使用
1、专门 为 vue提供的状态管理器
2、大部分项目都可以不用,如果是一个单页面应用程序,也就是说使用了路由,并且多个路由页面组件之间需要共享数据的时候。
store (仓库,将项目中需要共享的数据统一存放的位置)
1、state 专门存放状态数据的,可以理解为普通组件的data选项一样。
2、getters 里面专门存放getter,是针对当前仓库的state数据或者是其他的getter数据做的二次计算。可以理解为普通组件的computed选项一样。
3、mutations 里面专门存放mutation。mutation其实就是一个函数,接收两个参数(state,payload),这个函数是唯一能够修改仓库state数据的地方,里面必须是同步的函数,不要使用异步函数,异步函数可以放在actions里面操作。
4、actions 里面专门存放action。action其实就是一个函数,接收两个参数(context,payload),这个函数类似于mutation函数,但是他不能直接去修改state数据,他可以间接的通过调用mutation来修改state。
5、modules 可以将仓库进行拆分

六、对keep-alive 的了解
keep-alive是一个抽象组件,它是Vue的内置组件。
keep-alive可以实现组件的缓存,当组件切换时不会对当前组件进行卸载。
1 、 常用的属性有:
include:设置会被缓存的组件。
exclude:设置不会被缓存的组件。
2 、 keep-alive相关的生命周期钩子函数:
activated: 进入页面时触发。(常用来实现每次进入页面的时候重新获取最新的数据)
deactivated:退出页面时触发。
七、Vue的父组件和子组件生命周期函数执行顺序
1. 加载渲染过程
父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted
2. 更新过程
父beforeUpdate->子beforeUpdate->子updated->父updated
3. 销毁过程
父beforeDestroy->子beforeDestroy->子destroyed->父destroyed
详细解释参考:父子组件执行顺序.
八、computed和watch的区别及使用场景
computed使用场景:
当页面中有某些数据依赖其他数据进行变动的时候,可以使用计算属性
watch使用场景:
数据变化时执行异步或开销较大的操作,可以随时修改状态的变化
详细解释: 在大部分情况下我们都会使用computed,但如果要在数据变化的同时进行异步操作或者是比较大的开销,那么watch为最佳选择。watch为一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。
九、vue的路由
两种模式
hash 模式:在浏览器中符号“#”,#以及#后面的字符称之为hash,用window.location.hash读取;特点:hash虽然在URL中,但不被包括在HTTP请求中;用来指导浏览器动作,对服务端安全无用,更改hash值不会重加载页面。
history 模式:history采用HTML5的新特性;且提供了两个新方法:pushState(),replaceState(), 可以对浏览器历史记录栈进行修改,以及popState事件的监听到状态变更
十、vue中key 值的作用
当Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用“就地复用”策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。key的作用主要是为了高效的更新虚拟DOM。