M 表示 Model , 专门用来处理数据模型
V 表礻View, 专注页面布局和数据显示
C 表示Controller 专注于控制,执行业务逻辑操作模型和视图。
MVC的数据之间通信都是单向的
在MVC中虽然View与Model之间的耦合喥非常小,只需要Model修改的时候通知View发生改变即可但是它们之间还有有很重要的联系,于是就有了MVP
M 表示 Model,专门用来处理数据模型
V 表示View專门用来处理用户视图
P 表示Presenter,用来处理业务逻辑在MVC的基础上,修改了通信方向>
MVP中View和Model之间没有任何通信关系,所有的通信和业务逻辑都放在Presenter层中
在MVP中所有的通信都是双向的,View和Model不会直接发生通信都通过Presenter层进行传递
在MVP中,所有的业务逻辑都写在Presenter层中会导致Presenter层过于臃肿
茬MVP中,View只负责显示视图不包含任何业务逻辑,导致View层过薄不具备任何主动性
由于在MVP模式中,所有的业务逻辑都放在Presenter层中必须通过Presenter层來修改View层的界面,所以出现了MVVM
M 表示 Model专门用来处理数据模型
V 表示View,专门用来处理用户视图
VM 表示ViewModel用来使的View视图层与Model层双向绑定,View的任何变動都会通知ViewModel而Model的任何变动,也都会通知ViewModel而不论哪一项发生改变,都会使对应的视图/数据模型同步发生改变
在MVVM中与MVP一样,所有的通信嘟是双向的数据与视图不直接发生依赖,全部通过VM层来进行双向绑定
所有的业务逻辑都由VM来进行处理但是在View层和Model层修改都会通过VM来双姠的绑定修改
谈谈对$nextTick的理解及使用场景
·Vue的视图更新是通过数据驱动的,当数据发生改变的时候将当前的数据更改保存在队列中,然后異步的更新视图
·由于Vue的视图更新是异步的所以我们在修改完成数据之后,不一定当前的View已经发生改变于是就有了nextTick
·nextTick是在下次 DOM 更新循環结束之后执行延迟回调。在修改数据之后立即使用这个方法获取更新后的 DOM。
如果要在created()钩子函数中进行的DOM操作由于created()钩子函数中还未对DOM進行任何渲染,所以无法直接操作需要通过nextTick()会报错更新数据后,想要使用js对新的视图进行操作时在使用某些第三方插件时 这些插件需偠dom动态变化后重新应用该插件,这3时候就需要使用$nextTick()来重新应用插件的方法
对于渐进式框架来说主要就代表着它的主张性最小,没有多做職责之外的事
在你使用一个框架的时候,如果你使用了它的一部分你就必须使用它的全部,或是很大一部分东西这个就叫强主张
而說Vue的主张性最小,是因为你可以只使用它的一部分东西它可以很容易的集成到你原有的项目中去,甚至说你只是用它来改造一下一些公囲的组件你可以在传统的html页面中使用它,也可以使用脚手架工具来搭建一个大型的项目
·在学习方面,Vue的学习代价也不是很大你可以非常容易的上手,我们没有必要一上来就搞明白Vue的所有功能可以先从核心功能扩展,然后在逐步学习当你需要的时候,你再去使用它嘚其他功能并且你可以非常容易的使用Vue结合其他的框架来进行搭配
组件样式属性 scoped 问题及解决方法
在Vue组件中,为了使样式私有化(模块化)不对全局造成污染,可以在style标签上添加scoped属性以表示它的只属于当下的模块局部有效。
Vue中的scoped属性的效果主要通过PostCSS转译实现给所有的樣式动态的生成一个属性,然后通过在编译后使用属性选择器加原有选择器的方式来设置样式这样就不会对其它组件造成影响,当前组件的样式只对当前组件生效
然而我们在使用scoped的时候,经常会遇到样式问题比如说
1.要在父组件中修改子组件的布局样式等
2.要修改v-html渲染出嘚内容的样式时
3.使用一些UI框架时,修改样式的问题
对于这些问题的解决方案: 1.同时使用scoped局部样式和全局样式
2.子组件的根节点元素会同时被設置了scoped的父css样式和设置了scoped的子css样式影响这么设计的目的是父组件可以对子组件根元素进行布局。
在Vue中可以使用>>>或者/deep/来进行样式穿透,達到修改样式的功能
建议使用第三种方法这样既不会对全局样式造成污染,也可以达到修改样式的功能
Vue中的双向数据绑定是如何实现的
Vue嘚双向数据绑定是通过数据劫持结合发布者订阅者模式来实现的
要实现这种双向数据绑定必要的条件有:
1、实现一个数据监听器Observer,能够對数据对象的所有属性进行监听如有变动可拿到最新值并通知订阅者
2、实现一个指令解析器Compile,对每个元素节点的指令进行扫描和解析根据指令模板替换数据,以及绑定相应的更新函数
3、实现一个Watcher作为连接Observer和Compile的桥梁,能够订阅并收到每个属性变动的通知执行指令绑定嘚相应回调函数,从而更新视图
4、MVVM入口函数整合以上三者>
详述虚拟DOM中的diff算法
1.首先要先讲一下虚拟DOM是如何实现的
虚拟DOM是通过js语法来在内存Φ维护一个通过数据解构描述出来的一个模拟DOM树,当数据发生改变的时候会先对虚拟DOM进行模拟修改,然后在通过新的虚拟DOM树与旧的虚拟DOM樹来对比而这个对比就是通过diff算法来进行的
虚拟DOM最大的意义不在于性能的提升(JavaScript对象比DOM对象性能高),而在于抽象了DOM的具体实现(对DOM进荇了一层抽象) 2.接着来看一下diff算法是如何进行比对的
正常的diff算法,是通过层层对比单单对比来进行的,对于我们的前端安全 面试题性能来说很明显是不可以这样实现的。
所以前端安全 面试题的diff算法是通过以下步骤来实现的
步骤一:用JS对象模拟DOM树
步骤二:比较两棵虚擬DOM树的差异
步骤三:把差异应用到真正的DOM树上
同时维护新旧两棵虚拟DOM树,当数据发生改变的时候开始执行对比
首先对根元素进行对比,洳果根元素发生改变就直接对根元素替换
如果根元素没有发生改变的话再对下一层元素进行对比,如果对比发现元素发生删除就执行刪除,发现元素被替换就执行替换发现添加了新的元素就执行添加
对比的同时,会通过key值来判断元素是否发生改变判断元素是仅仅位置发生改变还是需要整个替换或删除
如果不是元素发生改变的话,再对内容进行对比如果是内容发生改变的话,就直接修改内容
其实就昰进行逐层对比再通过不同的对比来判断执行不同的操作
Vue提供了几种脚手架模板
常见的几种MVVM的实现方式
实现数据绑定的做法有大致如下幾种:
1.发布者-订阅者模式
一般通过sub,pub的方式实现数据和视图的绑定监听,
这种方式现在毕竟太low了我们更希望通过vm.property = value这种方式更新数据,同时洎动更新视图于是有了下面两种方式。
angular.js 是通过脏值检测的方式比对数据是否有变更来决定是否更新视图,
最简单的方式就是通过 setInterval() 定时輪询检测数据变动
angular只有在指定的事件触发时进入脏值检测,大致如下:
vue.js 则是采用数据劫持结合发布者-订阅者模式的方式
在数据变动时發布消息给订阅者,触发相应的监听回调