目录
前言
如果哪里不正确欢迎指出问题,我会积极改正的。
一、谈一下你对 MVVM 原理的理解
二、说一下响应式数据的原理
- 核心点:Object.defineProperty
- 理解:vue 是利用了 Object.defineProperty 的方法里面的 setter、getter 方法的观察者模式来实现的。
【vue 在初始化数据时候,会给 data 中的属性使用 Object.defineProperty 重新定义所有属性,当页面渠道对应的属性时,会进行依赖收集(收集当前组件的 watcher ),如果属性发生变化会通知相关历来进行更新操作。】
三、vue 是如何检测数组变化
- 核心点:使用函数劫持方式,重写数组方法
- 理解:更改数组原型;监控数组里面的每一项
vue 将 data 中的数组,进行了原型链重写。指向了自己定义的数组原型方法,这样当调用数组的 api 时,可以通知依赖更新。如果数组中包含着引用类型,会对数组中的引用类型再次进行监控。
四、为何 vue 采用异步渲染
- 核心点:提高性能
- 理解:vue 是组件级更新。如果不采用异步更新,那么每次更新数据都会对当前组件进行重新渲染,为了性能考虑,vue 会在本轮数据更新后,再去异步更新。
五、nextTick 实现原理
- 核心点:异步方法
- 理解:nextTick 方法主要是使用 宏任务 和 微任务 ,定义了一个异步的方法。多次调用 nextTick 会将方法存入队列中,通过这个异步方法清空当前队列。
六、vue 中 computed 的特点
- 核心点:具备缓存的,只有当依赖的属性发生变化时候才会更新视图
1、computed 和 method 区别:
- computed 必须有返回值(通过对数据处理返回一个结果), method 则均可
- 模板中调用时,computed 不加 (),methods 必须加 ()
- computed 有缓存功能,methods 没有缓存(computed 初次调用会执行函数,然后会缓存结果。再次被调用时候,如果依赖的响应式数据未发生改变,则返回缓存结果;发生改变,则会再次执行函数并缓存结果。 methods 被调用的时每次都要执行函数)
2、computed 和 watch 区别
- computed 有缓存功能,watch 没有
- computed 不支持异步,当computed内有异步操作时无效,无法监听数据的变化
- watch 支持异步
- computed 是依赖的数据发生改变时,重新调用;
- watch 是监听的响应式数据发生改变时,重新调用
3、watch 和 methods 区别
- methods是每次调用都会执行函数
- watch 不需要被调用,并且只有监听的数据发生改变的时候才会重新调用
七、watch 中的 deep:true 如何实现的
- 理解:当用户指定 watch 中的 deep 属性为 true 时,如果当前监控的值时数组类型,会对对象中的每一项进行求值,此时会将当前 watcher 存入到对应的属性的依赖中,这样数组中的对象发生变化时也会通知数据更新。
八、vue 组件的生命周期
1、生命周期:
创建-加载-更新-销毁
- beforeCreate
- created
- beforeMount
- mounted
- beforeUpdate
- updated
- beforeDestory
- distoryed
2、掌握每个生命周期内部可以做什么事情
- beforeCreate: 实例刚在内存中被创建,还未初始化好 data 和 methods 属性,可以进行ajax请求;
- created: 实例已在内存中创建完成,data 和 methods 已经创建好,但还没有开始编译末班,如果调用 methods 中的方法或者操作 data 中的数据,最早只能在此中操作;
- beforeMount: 完成模板编译,但还没有挂载到页面中;
- mounted: 实例已经挂载完成,可以进行一些 DOM 操作;
- beforeUpdate: data 值是新的,但是页面显示数据还是旧的,此时没有开始重新渲染DOM节点;
- updated: 可以执行依赖于DOM的操作,该钩子在服务器渲染阶段不可调用(因为在大多数情况下,此期间更改状态会导致无限循环;
- beforeDestory: 此时,实例还未销毁,完全可用;(当前页面使用了 $on 方法,需要在组件销毁前解绑;清除自己定义的定时器,解除事件绑定)
- distoryed: 可以执行一些优化操作,清空定时器,解除绑定事件(调用后,vue 实例指示的所有东西都会解除绑定,所有事件监听器都会被溢出,所有子实例都会被销毁)。
3、 ajax 请求放在那个生命周期中
- 在 created 中,视图中 dom 并没有渲染出来,所以如果直接操作dom点,会无法找到相关元素
- 在 mounted 中,dom已经渲染出来,可以直接操作dom节点
一般情况下,放在mounted 中,保证逻辑的统一性,因为生命周期是同步执行的,ajax 是异步执行的
服务器渲染不支持mounted方法,suo在服务端渲染额情况下,统一放到 created 中
九、Vue 中的模板编译原理
- 核心点:将template 转换成 render 函数
十、Vue中 v-if 和 v-show区别
- v-if :通过条件判断动态的进行增删DOM元素,可以和v-else搭配(频繁进行增删DOM操作会影响页面加载速度和性能)
- v-show:通过条件判断动态的进行显示和隐藏元素( display:"" 和 display:none),不可以和v-else搭配
总结
本文章仅限于我自己在面试中的总结,记录下来分享给大家,希望对大家有帮助!
同时也预祝大家面试成功!