Vue 常见面试题一百问(第一期)
目录
- SPA 单页面的优缺点分别是什么?
- v-show 与 v-if 有什么区别?
- computed 和 watch 的区别和运用的场景?
- 在哪个生命周期内调用异步请求?
- 在什么阶段才能访问操作DOM?
- 谈谈你对 keep-alive 的了解
- Proxy 与 Object.defineProperty 优劣对比
- 虚拟 DOM 实现原理
- 虚拟 DOM 的优缺点
- 什么是 MVVM?
一、 SPA 单页面的优缺点分别是什么?
优点:
- 用户体验好、快,内容的改变不需要重新加载整个页面,
避免了不必要的跳转和重复渲染
; - 基于上面一点,SPA 相对对
服务器压力小
; - 前后端职责分离,
架构清晰
,前端进行交互逻辑,后端负责数据处理;
缺点:
初次加载耗时多
:为实现单页 Web 应用功能及显示效果,需要在加载页面的时候将 JavaScript、CSS 统一加载,部分页面按需加载;前进后退路由管理
:由于单页应用在一个页面中显示所有的内容,所以不能使用浏览器的前进后退功能,所有的页面切换需要自己建立堆栈管理;SEO 难度较大
:由于所有的内容都在一个页面中动态替换显示,所以在 SEO 上其有着天然的弱势。
二 、v-show 与 v-if 有什么区别?
v-if:
- v-if 是真正的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建;也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。
v-show:
- v-show 就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 的
display
属性进行切换。
总结
- v-if 适用于在运行时很少改变条件,
不需要频繁切换条件
的场景;v-show 则适用于需要非常频繁切换条件
的场景。
三、computed 和 watch 的区别和运用的场景?
computed:
computed
是计算属性,依赖其它属性值,并且 computed 的值有缓存,只有它依赖的属性值发生改变,下一次获取 computed 的值时才会重新计算 computed 的值;
watch:
watch
更多的是「观察」的作用,类似于某些数据的监听回调 ,每当监听的数据变化时都会执行回调进行后续操作;
运用场景:
- 当我们需要进行数值计算,并且依赖于其它数据时,应该使用 computed,因为可以利用 computed 的
缓存特性
,避免每次获取值时,都要重新计算; - 当我们需要在数据变化时执行异步或开销较大的操作时,应该使用 watch,使用 watch 选项允许我们执行
异步操作 ( 访问一个 API )
,限制我们执行该操作的频率
,并在我们得到最终结果前,设置中间状态
。这些都是计算属性无法做到的。
四、在哪个生命周期内调用异步请求?
- 可以在钩子函数
created
、beforeMount
、mounted
中进行调用,因为在这三个钩子函数中,data 已经创建,可以将服务端端返回的数据进行赋值。但是推荐在created
钩子函数中调用异步请求,因为在created
钩子函数中调用异步请求有以下优点:
- 能更快获取到服务端数据,减少页面 loading 时间;
- ssr 不支持 beforeMount 、mounted 钩子函数,所以放在 created 中有助于一致性;
五、在什么阶段才能访问操作DOM?
- 在钩子函数
mounted
被调用前,Vue 已经将编译好的模板挂载到页面上,所以在mounted
中可以访问操作 DOM。可以参考Vue 的生命周期示意图
六、谈谈你对 keep-alive 的了解?
keep-alive
是 Vue 内置的一个组件,可以使被包含的组件保留状态
,避免重新渲染
,其有以下特性:
- 一般结合路由和动态组件一起使用,用于
缓存组件
; - 提供
include
和exclude
属性,两者都支持字符串或正则表达式,include
表示只有名称匹配的组件会被缓存,exclude
表示任何名称匹配的组件都不会被缓存 ,其中exclude
的优先级比include
高; - 对应两个钩子函数
activated
和deactivated
,当组件被激活时,触发钩子函数activated
,当组件被移除时,触发钩子函数deactivated
。
七、Proxy 与 Object.defineProperty 优劣对比
Proxy 的优势如下:
- Proxy 可以直接监听对象而非属性;
- Proxy 可以直接监听数组的变化;
- Proxy 有多达 13 种拦截方法,不限于 apply、ownKeys、deleteProperty、has 等等是Object.defineProperty 不具备的;
- Proxy 返回的是一个新对象,我们可以只操作新的对象达到目的,而 Object.defineProperty 只能遍历对象属性直接修改;
- Proxy 作为新标准将受到浏览器厂商重点持续的性能优化,也就是传说中的新标准的性能红利;
Object.defineProperty 的优势如下:
- 兼容性好,支持 IE9,而 Proxy 的存在浏览器兼容性问题,而且无法用 polyfill 磨平,因此 Vue 的作者才声明需要等到下个大版本( 3.0 )才能用 Proxy 重写。
八、虚拟 DOM 实现原理?
虚拟 DOM 的实现原理主要包括以下 3 部分:
- 用 JavaScript 对象模拟真实 DOM 树,对真实 DOM 进行抽象;
- diff 算法 — 比较两棵虚拟 DOM 树的差异;
- pach 算法 — 将两个虚拟 DOM 对象的差异应用到真正的 DOM 树。
点击此处详细了解虚拟 DOM 原理
九、虚拟 DOM 的优缺点?
优点:
保证性能下限
: 框架的虚拟 DOM 需要适配任何上层 API 可能产生的操作,它的一些 DOM 操作的实现必须是普适的,所以它的性能并不是最优的;但是比起粗暴的 DOM 操作性能要好很多,因此框架的虚拟 DOM 至少可以保证在你不需要手动优化的情况下,依然可以提供还不错的性能,即保证性能的下限;
无需手动操作 DOM
: 我们不再需要手动去操作 DOM,只需要写好View-Model
的代码逻辑,框架会根据虚拟 DOM
和数据双向绑定
,帮我们以可预期的方式更新视图,极大提高我们的开发效率;
跨平台
: 虚拟 DOM 本质上是 JavaScript 对象,而 DOM 与平台强相关,相比之下虚拟 DOM 可以进行更方便地跨平台操作
,例如服务器渲染、weex 开发等等。
缺点:
无法进行极致优化
: 虽然虚拟 DOM + 合理的优化,足以应对绝大部分应用的性能需求,但在一些性能要求极高的应用中虚拟 DOM 无法进行针对性
的极致优化。
十、什么是 MVVM?
Model–View–ViewModel (MVVM)
是一个软件架构设计模式,MVVM
源自于经典的Model–View–Controller(MVC)
模式 ,MVVM
的出现促进了前端开发与后端业务逻辑的分离,极大地提高了前端开发效率,MVVM
的核心是ViewModel
层,它就像是一个中转站(value converter),负责转换Model
中的数据对象来让数据变得更容易管理和使用,该层向上与视图层进行双向数据绑定
,向下与Model
层通过接口请求进行数据交互
,起呈上启下作用。
View 层
- View 是
视图层
,也就是用户界面。前端主要由 HTML 和 CSS 来构建 。
Model 层
- Model 是指
数据模型
,泛指后端进行的各种业务逻辑处理和数据操控,对于前端来说就是后端提供的 api 接口。
ViewModel 层
ViewModel
是由前端开发人员组织生成和维护的视图数据层
。在这一层,前端开发者对从后端获取的 Model 数据进行转换处理,做二次封装
,以生成符合 View 层使用预期的视图数据模型。需要注意的是 ViewModel 所封装出来的数据模型包括视图的状态
和行为
两部分,而 Model 层的数据模型是只包含状态
的,比如页面的这一块展示什么,而页面加载进来时发生什么,点击这一块发生什么,这一块滚动时发生什么这些都属于视图行为
(交互),视图状态和行为都封装在了 ViewModel 里。这样的封装使得 ViewModel 可以完整地去描述 View 层。