作者:程序员库里来源:今日头条
一、谈谈你对MVVM的理解?
映射关系简化,隐藏controllerMVVM在MVC的基础上,把控制层隐藏掉了。
Vue不是一个MVVM框架,它是一个视图层框架。
ViewModal是一个桥梁,将数据和视图进行关联。
二、谈谈你对Vue中响应式数据的理解?
数组和对象类型的值变化的时候,通过defineReactive方法,借助了defineProperty,将所有的属性添加了getter和setter。用户在取值和设置的时候,可以进行一些操作。
缺陷:只能监控最外层的属性,如果是多层的,就要进行全量递归。
get里面会做依赖搜集(dep[watcher,watcher])set里面会做数据更新(notify,通知watcher更新)
三、Vue中如何检测数组的变化?
vue中对数组没有进行defineProperty,而是重写了数组的7个方法。分别是:
push
shift
pop
splice
unshift
sort
reverse
因为这些方法都会改变数组本身。
数组里的索引和长度是无法被监控的。
四、Vue中如何进行依赖收集的?
Vue初始化的时候,挂载之后会进行编译。生成renderFunction。
当取值的时候,就会搜集watcher,放到dep里面。
当用户更改值的时候,就会通知watcher,去更新视图。
五、如何理解Vue中的模板编译原理?
这个问题的核心是如何将template转换成render函数。
将template模块转换成ast语法书-parserHTML
对静态语法做标记(某些节点不改变)
重新生成代码-codeGen,使用with语法包裹字符串
六、Vue生命周期钩子是如何实现的?
Vue的生命周期钩子是回调函数,当创建组件实例的过程中会调用相应的钩子方法。内部会对钩子进行处理,将钩子函数维护成数组的形式。
七、Vue组件生命周期有哪些?
beforeCreate在实例初始化之后,数据观测observer和event、watcher事件配置之前被调用
created实例已经创建完成,在这一步,以下配置被完成
数据观测
属性和方法的运算
watch/event时间回调
$el尚未生成
beforeMount在挂载之前被调用,render尚未被调用
mountedel被新创建的vm.$el替换,并挂载到实例上去之后调用
beforeUpdate数据更新时,被调用,发生在虚拟Dom重新渲染和打补丁之前
update由于数据更改导致的虚拟Dom重新渲染和打补丁,在这之后调用
beforeDestroy实例销毁之前调用
destroyed实例销毁之后调用,调用后Vue实例的所有东西都会被解绑,所有的事件监听会被移除,子实例被销毁,该钩子在服务端渲染期间不被调用
keep-alive(activateddeactivated)
八、vue.mixin的使用场景和原理?
Vue的mixin的作用就是抽离公共的业务逻辑,原理类似对象的继承,当组件初始化的时候,会调用mergeOptions方法进行合并,采用策略模式针对不同的属性进行合并。如果混入的数据和本身组件的数据有冲突,采用本身的数据为准。
缺点:命名冲突、数据来源不清晰
九、Vue的组件data为什么必须是一个函数?
newVue是一个单例模式,不会有任何的合并操作,所以根实例不必校验data一定是一个函数。组件的data必须是一个函数,是为了防止两个组件的数据产生污染。如果都是对象的话,会在合并的时候,指向同一个地址。而如果是函数的时候,合并的时候调用,会产生两个空间。
十、请说明nextTick的原理。
nextTick是一个微任务。
nextTick中的回调是在下次Dom更新循环结束之后执行的延迟回调
可以用于获取更新后的Dom
Vue中的数据更新是异步的,使用nextTick可以保证用户定义的逻辑在更新之后执行
十一、
转载请注明:http://www.0431gb208.com/sjslczl/3583.html