1.什么是MVVM?
MVVM是Model-View-ViewModel的缩写。MVVM是一种设计思想。Model 层代表数据模型,可以在Model中定义数据修改和操作的业务逻辑;View 代表UI 组件,它负责将数据模型转化成UI 展现出来,ViewModel 是一个同步View 和 Model的对象。
在MVVM架构下,View 和 Model 之间并没有直接的联系,而是通过ViewModel进行交互,Model 和 ViewModel 之间的交互是双向的, 因此View 数据的变化会同步到Model中,而Model 数据的变化也会立即反应到View 上。
ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,而View 和 Model 之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。
衍生问题1:MVVM跟MVC有什么区别?
mvvm它实现了View和Model的自动同步,也就是当Model的属性改变时,我们不用再自己手动操作Dom元素,来改变View的显示,而是改变属性后该属性对应View层显示会自动改变,因此开发者只需要专注对数据的维护操作即可。
MVC是单向通信。也就是View跟Model,必须通过Controller来承上启下。
mvvm 主要解决了 mvc 中大量的 DOM 操作使页面渲染性能降低,加载速度变慢,影响用户体验。和当 Model 频繁发生变化,开发者需要主动更新到 View 。
2.vue 的双向绑定的原理是什么?(v-model)
所谓双向绑定,指的就是我们在js中的vue实例中的data与其渲染的dom元素上的内容保持一致,两者无论谁被改变,另一方也会相应的更新为相同的数据。
vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。
1.实现一个监听器Observer,用来劫持并监听所有属性,如果有变动的,就通知订阅者。
2.实现一个订阅者Watcher,可以收到属性的变化通知并执行相应的函数,从而更新视图。
3.实现一个解析器Compile,可以扫描和解析每个节点的相关指令,并根据初始化模板数据以及初始化相应的订阅器。
3.vue的虚拟dom怎么实现的?diff算法?时间复杂度?
什么是虚拟dom?
虚拟dom就是用一个js对象来描述dom节点。可以通过该对象来生成真实的dom节点。实际上它只是一层对真实 DOM 的抽象。最终可以通过一系列操作使这棵树映射到真实环境上。
简单来说,可以把Virtual DOM 理解为一个简单的JS对象,并且最少包含标签名( tag)、属性(attrs)和子元素对象( children)三个属性。不同的框架对这三个属性的命名会有点差别。
对于虚拟DOM,咱们来看一个简单的实例,就是下图所示的这个,详细的阐述了模板 → 渲染函数 → 虚拟DOM树 → 真实DOM
的一个过程
Virtual DOM
并没有完全实现DOM
,Virtual DOM
最主要的还是保留了Element
之间的层次关系和一些基本属性. 你给我一个数据,我根据这个数据生成一个全新的Virtual DOM
,然后跟我上一次生成的Virtual DOM
去 diff
,得到一个Patch
,然后把这个Patch
打到浏览器的DOM
上去。
我们可以通过javascript
对象表示的树结构来构建一棵真正的dom
树,当数据状态发生变化时,可以直接修改这个javascript
对象,接着对比修改后的javascript
对象,记录下需要对页面做的dom
操作,然后将其应用到真正的dom
树,实现视图的更新,这个过程就是Virtual DOM
的核心思想。
怎么实现虚拟dom的(虚拟dom的原理)?
使用js根据dom
树的结构来构建一个对象,当数据状态发生变化时,可以直接修改这个js
对象,接着对比修改后的js
对象,记录下需要对页面做的dom
操作,然后将其应用到真正的dom
树,实现视图的更新,这个过程就是Virtual DOM
的核心思想。
diff算法是干嘛的?
要知道渲染真实DOM的开销是很大的,比如有时候我们修改了某个数据,如果直接渲染到真实dom上会引起整个dom树的重绘和重排,有没有可能我们只更新我们修改的