近期不断面试中,面试官都会提一些关于Vue相关的源码和“全家桶”之类的问题。那么针对这些提问,我们应该如何更好应答呢?在这里我把对Vue的理解整理出来供大家来参考。

1.Vue是什么?

Vue是一套构建用户界面的渐进式框架,也是一个非常典型的 MVVM 的程序结构(model-view-viewmodel)。

官方用语:

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

2.vue既然是MVVM结构比MVC好在哪里?

MVC模式是MVVM模式的基础,这两种模式更像是MVC模式的优化改良版,他们两个的MV即Model,view相同,不同的是MV之间的纽带部分。

☞什么是MVC?


MVC允许在不改变视图的情况下改变视图对用户输入的响应方式,用户把对View的操作交给了Controller处理,在Controller中响应View的事件调用Model的接口对数据进行操作,一旦Model发生变化便通知相关视图进行更新。

如果前端没有框架,只使用原生的html js,MVC模式可以这样理解。将html看成view;js看成controller,负责处理用户与应用的交互,响应对view的操作(对事件的监听),调用Model对数据进行操作,完成model与view的同步(根据model的改变,通过选择器对view进行操作);将js的ajax当做Model,也就是数据层,通过ajax从服务器获取数据。

☞什么是MVVM?


MVVM与MVC两者之间最大的区别就是:MVVM实现了对View和Model的自动同步,也就是当Model的属性改变时,我们不用再自己手动操作Dom元素来改变View的变化,而是改变其属性后,该属性对应的View层数据会自动改变。 以Vue为例:

 <div id="vueDemo"><p>{{ title }}</p><button v-on:click="clickEvent">hello word</button>
</div>
var vueDemo = new Vue({  el: '#vueDemo',  data: {    title: 'Hello Vue!'  },  methods: {    clickEvent: function () {      this.title = "hello word!"  }  }
})

这里的html => View层,可以看到这里的View通过模板语法来声明式的将数据渲染进DOM元素,当ViewModel对Model进行更新时,通过数据绑定更新到View。

Vue实例中的data相当于Model层,而ViewModel层的核心是Vue中的双向数据绑定,当Model发生变化时View也可以跟着实时更新,同理,View变化也能让Model发生变化。

总的看来,MVVM比MVC精简很多,不仅简化了业务与界面的依赖,还解决了数据频繁更新的问题,不用再用选择器操作DOM元素。因为在MVVM中,View不知道Model的存在,Model和ViewModel也观察不到View,这种低耦合模式提高代码的可重用性。

3.Vue响应式原理是什么?

Vue是基于 Object.defineProperty 来实现数据响应的,而 Object.defineProperty 是 ES5 中一个无法 shim 的特性,不支持IE8以下版本的浏览器。Vue通过Object.defineProperty的 getter/setter 方法对收集的依赖项进行监听,在属性被访问和修改时通知变化,进而更新视图数据; 受现代JavaScript 的限制 (以及废弃 Object.observe),Vue不能检测到对象属性的添加或删除。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让Vue转换它,这样才能让它是响应的。


观察者模式(Observer, Watcher, Dep)

先简介一下,后面的文章会具体的写到:

Observer类

主要用于给Vue的数据defineProperty增加getter/setter方法,并且在getter/setter中收集依赖或者发送通知进行更新。

Watcher类

用于观察数据(或者表达式)变化然后执行回调函数(其中也有收集依赖的过程),主要用于$watch API和指令上。

Dep类(Dependence依赖的缩写)

就是一个可观察对象,可以有不同指令订阅它(它是多播的)

观察者模式,跟发布/订阅模式有点像,但是其实略有不同。

发布/订阅模式是由统一的事件分发调度中心,on则往中心中数组加事件(订阅),emit则从中心中数组取出事件(发布),发布和订阅以及发布后调度订阅者的操作都是由中心统一完成。

但是观察者模式则没有这样的中心,观察者模式中包含observer观察者和subject主题对象。observer需要观察subject时,需要先到subject里进行注册subject对象持有observer对象的集合句柄,当subject对象的内部状态发生变化的时候,就会把这个变化通知所有的观察者。

4.Vue源码有过了解吗?

之前对Vue源码也是有点小小的研究,只不过没有很体系的记录,现在有点时间,那就做一次基础的总结吧。一方面要克服自己的惰性,另一方面也蛮想重新温故一遍。哈哈~~ 我们先来看一下Vue源码的目录结构吧:


熟悉每个模块具体的功能,对之后深入研究源码还是很有帮助的呢。 我偷偷告诉你,我更喜欢去理解下面那张思维导图哦,接下来的所有文章都会根据下图的各个环节做个分析哦!

我们可以先看一下概览:


我会同时更新在github上,你要是喜欢可以给个star,先谢谢啦~

1.浅析Vue源码(一)—— 造物创世

2.浅析Vue源码(二)—— initMixin(上)

3.浅析Vue源码(三)—— initMixin(下)

4.浅析Vue源码(四)—— $mount中template的编译--parse

5.浅析Vue源码(五)—— $mount中template的编译--optimize

6.浅析Vue源码(六)—— $mount中template的编译--generate

7.浅析Vue源码(七)——render到VNode的生成

8.浅析Vue源码(八)——依赖收集与监听

9.浅析Vue源码(九)——VirtualDOM与path

10.vue番外篇 -- vue-router浅析原理

11.Vue番外篇 -- vue.nextTick()浅析

Vue解析--如何应对面试官提问相关推荐

  1. vue 2.0响应式源码实践,麻麻,我再也不怕被面试官提问啦

    vue2.0/vue3.0响应式源码实践,麻麻,我再也不怕被面试官提问啦 写在前面 vue2.0响应式源码实现 1. 先创建一个对象 2.实现observer方法 3.接下来我们对observer函数 ...

  2. 大叔手记(12):我的一次面试经历(谈大叔如何应对面试官)

    本文目的 写本文的目的,大叔不是为了装逼(虽然说话的口气有时候也确实有点装逼,性格导致的,咳...我得改),其实大叔在公司也只是小罗罗,本文的目的主要是为了向大家展示如何通过各种软技能应对面试官,这个 ...

  3. 面试SEO岗位时会问的问题有哪些?SEO面试官提问

    面试seo岗位时会问的问题有哪些? 面试官会怎么样提问?[追梦者seo顾问团队] 作为一名SEOER来说,去某个企业做SEO优化的前提是必须要面对面试官问的SEO问题,其实笔者在面试多个SEO职位的时 ...

  4. 如何应对面试官的JVM调优问题

    为什么要进行JVM调优 我猜你肯定是为了面试,现在很多公司都会问这个,虽然你工作了N年JVM调优可能都不会接触到,但我觉得还是有考察的必要的.因为很多时候我们考察一个人不光要考察他的硬实力,还要看他有 ...

  5. 如何应对面试官:什么场景中会用到java多线程?

    如何应对面试官:什么场景中会用到java多线程? 作者:云栖社区 原文:https://yq.aliyun.com/ziliao/1765 (点击文末阅读原文即可前往) 问:能不能简单描述一下你在ja ...

  6. 88道BAT Java面试题 助你跳槽BAT,轻松应对面试官的灵魂拷问

    88道BAT Java面试题 助你跳槽BAT,轻松应对面试官的灵魂拷问 前言: 备战金九银十逃脱不了面试官的灵魂拷问,笔者整理了88道Java面试,由于面试题太多文章没有包含答案,需要领取这些面试题答 ...

  7. 25 个 questions, 教你向面试官提问!

    专栏 | 九章算法 网址 | http://www.jiuzhang.com 有很多童鞋会问:面试的时候向面试官提什么问题比较合适? 这部分其实并不是非常重要的,因为基本不会影响你的面试结果. 但是, ...

  8. 如何应对面试官的闲扯

    原文地址:https://club.1688.com/article/31815895.htm 上期我们谈了应对压力面试问题,求职应聘者往往面临面试紧张的环节,甚至压力非常大.但是也有时候,在这紧张的 ...

  9. 项目没有亮点,如何应对面试官的提问?

    ↑↑ 点击上方关注「陈树义」↑↑ 这是陈树义的第 032 期分享 作者 l 陈树义 来源 l 陈树义(ID:Spark-tree) 转载请联系授权(ID:Spark-tree) 在树义的技术交流群里, ...

最新文章

  1. 验证视图MAC失败 Validation of ViewState MAC Failed
  2. Android开发之多Fragment切换优化
  3. logback1.1.11日志无法自动删除
  4. python 增删列表_python 列表的增删改查
  5. HDU 2512 一卡通大冒险
  6. (z)如何在SignalTAP II中保留特定节点
  7. web开发中的 emmet 效率提升工具
  8. 国考计算机广东省报名入口,2020广东省省考报名入口时间:7月3日9︰00至9日16︰00...
  9. jenkins集成gitlab
  10. CListCtrl 使用技巧 1
  11. 一个非常适合IT团队的在线API文档、技术文档工具 (ShowDoc)
  12. 用 IPTABLES 构建 Linux 防火墙
  13. word自动编号+二级标题随一级标题变化
  14. 二、11【FPGA】时序逻辑电路——计数器
  15. react中使用Route报错` A <Route> is only ever to be used as the child of <Routes> element, never rendered`
  16. STM32 之十 供电系统及内部参照电压(VREFINT)使用及改善ADC参考电压,内部参照电压的具体方法,只有在STM32F0x芯片的参考手册中才能找到,其他MCU的参考手册都是很简单的说明
  17. 1010: 求圆的周长和面积 ZZULIOJ
  18. 使用Word2Vec完成基于文本相似度的推荐
  19. 判断质数和用算数基本定理分解质因数
  20. GPRS手机+笔记本电脑无线上网

热门文章

  1. java 将换行代替_Java批量将文件中的段落替换成空格,根据指定分隔符换行(SQL示例)...
  2. dlopen linux 实例_Linux静态库和动态库
  3. java音乐登陆界面_第四篇——Spring音乐登录界面设计及实现(C#)
  4. 用户需求测试软件,用户需求和软件需求的区别
  5. php自动释放mysql连接,php怎么关闭mysql连接
  6. Node 之 模块加载原理与加载方式
  7. project 2013 显示标题
  8. Android Studio 日志工具
  9. JQuery 对表单进行初始化操作
  10. C#循环语句(for循环)