欢迎光临散文网 会员登陆 & 注册

高频面试题 Vue02

2023-02-27 19:03 作者:麦菜ggb  | 我要投稿

    

 哈哈哈哈哈哈哈

    我是麦菜,又宅又菜的麦菜

    话不,我直接进入正题


一、Vue的基本原理 ?

二、双向数据绑定的原理 ?

四、MVVM、MVC、MVP的区别 ?

三、使用 Object.defineProperty() 来进行数据 劫持有什么缺点 ?

五、Computed 和 Watch 的区别 ?

六、 Computed 和 Methods 的区别 ?


一、Vue的基本原理 ?

    当一个Vue实例创建时

    Vue会遍历data中的属性

    用 Object.defineProperty(vue3.0使用proxy )

    将它们转为 getter/setter

    并且在内部追踪相关依赖

    在属性被访问和修改时通知变化

    每个组件实例都有相应的 watcher 程序实例

    它会在组件渲染的过程中把属性记录为依赖

    之后当依赖项的setter被调用时

    会通知watcher重新计算

    从而致使它关联的组件得以更新

二、双向数据绑定的原理 ?

    Vue.js 是采用

    数据劫持结合发布者-订阅者模式的方式

    通过Object.defineProperty()来劫持

    各个属性的setter、getter

    在数据变动时发布消息给订阅者

    触发相应的监听回调

原理步骤主要分为:

   (1)需要observe的数据对象进行递归

    遍历包括子属性对象的属性

    都加上setter和getter这样的话

    给这个对象的某个值赋值

    就会触发setter

    那么就能监听到了数据变化 

   (2)compile解析模板指令步骤

    将模板中的变量替换成数据

    然后初始化渲染页面视图

    并将每个指令对应的节点绑定更新函数

    添加监听数据的订阅者

    一旦数据有变动

    收到通知

    更新视图 

   (3)Watcher订阅者是Observer和Compile之间

    通信的桥梁

    主要做的事情是: 

    ①在自身实例化时往属性订阅器(dep)里面添加自己 

    ②自身必须有一个update()方法 

    ③待属性变动dep.notice()通知时

    能调用自身的update()方法

    并触发Compile中绑定的回调

    则功成身退

   (4)MVVM作为数据绑定的入口

    整合Observer、Compile和Watcher三者

    通过Observer来监听自己的model数据变化

    通过Compile来解析编译模板指令

    最终利用Watcher搭起Observer和Compile之间的

    通信桥梁

    达到数据变化 -> 视图更新;

    视图交互变化(input) -> 数据model变更的

  双向绑定效果

三、使用 Object.defineProperty() 来进行数据劫持

有什么缺点?

    在对一些属性进行操作时

    使用这种方法无法拦截

    比如通过下标方式修改数组数据或者给对象

    新增属性

    这都不能触发组件的重新渲染

    因为 Object.defineProperty 不能拦截到

    这些操作

    更精确的来说

    对于数组而言

    大部分操作都是拦截不到的

    只是 Vue 内部通过重写函数的方式解决了

    这个问题

    在 Vue3.0 中已经不使用这种方式了

    而是通过使用 Proxy 对对象进行代理

    从而实现数据劫持

    使用Proxy 的好处是它可以完美的监听到

    任何方式的数据改变

    唯一的缺点是兼容性的问题

    因为 Proxy 是 ES6 的语法

四、MVVM、MVC、MVP的区别 ?

    MVC、MVP 和 MVVM 是三种常见的

    软件架构设计模式

    主要通过分离关注点的方式来组织代码结构

    优化开发效率

    在开发单页面应用时

    往往一个路由页面对应了一个脚本文件

    所有的页面逻辑都在一个脚本文件里

    页面的渲染、数据的获取

    对用户事件的响应所有的应用逻辑

    都混合在一起

    这样在开发简单项目时

    可能看不出什么问题

    如果项目变得复杂

    那么整个文件就会变得冗长、混乱

    这样对项目开发和后期的项目维护是

    非常不利的

(1)MVC :

    MVC 通过分离 

    Model、View 和 Controller

    的方式来组织代码结构

    其中 View 负责页面的显示逻辑

    Model 负责存储页面的业务数据

    以及对相应数据的操作

    并且 View 和 Model 应用了观察者模式

    当 Model 层发生改变的时候它会通知

    有关 View 层更新页面

    Controller 层是 View 层和 Model 层的纽带

    它主要负责用户与应用的响应操作

    当用户与页面产生交互的时候

    Controller 中的事件触发器就开始工作了

    通过调用 Model 层

    来完成对 Model 的修改

    然后 Model 层再去通知 View 层更新

(2)MVVM:

  MVVM 分为

    Model、View、ViewModel:


    Model代表数据模型

    数据和业务逻辑都在Model层中定义; 


    View代表UI视图

    负责数据的展示;


    ViewModel负责监听Model中数据的改变

    并且控制视图的更新

    处理用户交互操作;


    Model和View并无直接关联

    而是通过ViewModel来进行联系的

    Model和ViewModel之间有着

    双向数据绑定的联系

    因此当Model中的数据改变时

    会触发View层的刷新

    View中由于用户交互操作而改变的数据

    也会在Model中同步

    这种模式实现了 Model和View的数据

    自动同步

    因此开发者只需要专注于数据的

    维护操作即可

    而不需要自己操作DOM

(3)MVP: 

    MVP 模式与 MVC 唯一不同的在于

    Presenter 和 Controller

    在 MVC 模式中使用观察者模式

    来实现当 Model 层数据发生变化的时候

    通知 View 层的更新

    这样 View 层和 Model 层耦合在一起

    当项目逻辑变得复杂的时候

    可能会造成代码的混乱

    并且可能会对代码的复用性造成一些问题

    MVP 的模式通过使用 Presenter 来实现

    对 View 层和 Model 层的解耦

    MVC 中的Controller 只知道 Model 的接口

    因此它没有办法控制 View 层的更新

    MVP 模式中

    View 层的接口暴露给了 Presenter 

    因此可以在 Presenter 中将 Model 的变化

    和 View 的变化绑定在一起

    以此来实现 View 和 Model 的同步更新

    这样就实现了对 View 和 Model 的解耦

    Presenter 还包含了其他的响应逻辑

五、Computed 和 Watch 的区别 ?

    对于Computed:

    它支持缓存

    只有依赖的数据发生了变化

    才会重新计算 不支持异步

    当Computed中有异步操作时

    无法监听数据的变化 computed的值会

    默认走缓存

    计算属性是基于它们的响应式依赖进行

    缓存的

    也就是基于data声明过

    或者父组件传递过来的props中的数据

    进行计算的

    如果一个属性是由其他属性计算而来的

    这个属性依赖其他的属性

    一般会使用computed 如果computed属性

    的属性值是函数

    那么默认使用get方法

    函数的返回值就是属性的属性值;

    在computed中

    属性有一个get方法和一个set方法

    当数据发生变化时

    会调用set方法

    对于Watch:

    它不支持缓存

    数据变化时

    它就会触发相应的操作 支持异步监听

    监听的函数接收两个参数

    第一个参数是最新的值

    第二个是变化之前的值 当一个属性发生

    变化时

    就需要执行相应的操作 

    监听数据必须是data中声明的或者父组件

    传递过来的props中的数据

    当发生变化时

    会触发其他操作

    函数有两个的参数:

    immediate:

    组件加载立即触发回调函数 deep:

    深度监听

    发现数据内部的变化

    在复杂数据类型中使用

    例如数组中的对象发生变化

    需要注意的是

    deep无法监听到数组和对象内部的变化

    当想要执行异步或者昂贵的操作以

    响应不断的变化时

    就需要使用watch

    总结:

    computed 计算属性 : 依赖其它属性值

    并且 computed 的值有缓存

    只有它依赖的属性值发生改变

    下一次获取 computed 的值时才会

    重新计算 computed 的值

    watch 侦听器 : 更多的是观察的作用

    无缓存性

    类似于某些数据的监听回调

    每当监听的数据变化时都会执行回调

    进行后续操作

    运用场景:

    当需要进行数值计算,并且依赖于其它

    数据时

    应该使用 computed

    因为可以利用 computed 的缓存特性

    避免每次获取值时都要重新计算

    当需要在数据变化时执行异步或开销

    较大的操作时

    应该使用 watch

    使用 watch 选项允许执行

    异步操作 ( 访问一个 API )

    限制执行该操作的频率

    并在得到最终结果前

    设置中间状态

    这些都是计算属性无法做到的

六、 Computed 和 Methods 的区别 ?

    可以将同一函数定义为一个 method 

    或者一个计算属性

    对于最终的结果

    两种方式是相同的 不同点:

    computed: 计算属性是基于它们的

    依赖进行缓存的

    只有在它的相关依赖发生改变时才会重新求值;

    method 调用总会执行该函数

    

    我是麦菜,能不能点个赞

    感谢你的观看

高频面试题 Vue02的评论 (共 条)

分享到微博请遵守国家法律