当前位置: 首页 > Web前端 > vue.js

Vue面试题

时间:2023-03-31 19:16:54 vue.js

1.响应式数据理解?核心点:数组和对象类型值发生变化时如何劫持。对象内部使用defineReactive方法使用Object.defineProperty劫持属性(只有存在的属性才会被劫持),数组通过重写数组方法实现。这里可以在回答的时候带出一些相关的知识点(比如通过递归劫持多层对象,顺便在Vue3中使用proxy实现响应式数据)?补充回答,如何收集内部依赖,每每个属性都有自己的dep属性,里面存放着它所依赖的watcher。当属性发生变化时,会通知对应的watcher进行更新(其实后面会提到,每个对象类型本身也有一个dep属性,这个在$set面试题中有解释)?这里可以介绍一下性能优化相关的内容(1)对象层级太深,性能会很差(2)不要把不需要响应数据的内容放在数据中(3)Object.freeze()可以冻结数据2.Vue中如何检测数据变化?核心点:考虑到数组的性能,不是用defineProperty拦截数组的每一项,而是选择重写数组(push,shift,pop,splice,unshift,sort,reverse)方法重写。?补充一下答案,在Vue中修改数组的索引和长度是无法监听的。需要通过以上7种变异方式修改数组,触发数组对应的watcher更新。如果数组中存在对象数据类型,也会进行递归劫持。?提出的问题,如果要改变索引更新数据怎么办?可以通过Vue.$set()处理->核心内部使用splice方法3.Vue中模板编译原理?核心点:如何将模板转化为render函数(这里尽量不要使用模板,因为将template转换为rendermethod需要在运行时编译会造成性能损失,同时引用带编译包的vue会增加体积。.vue文件中默认的template处理是通过vue-loader处理的,不是运行时编译——我们后面会说,默认vue项目中引入的vue.js是没有编译模块的)。1.将模板模板转换成ast语法树-parserHTML2.静态标记静态语法-markUp3.重新生成代码-codeGen?补充回答(模板引擎的实现原理是newFunction+with实现的)1.将AST语法数转换为render函数通过newFunction(with(this){return'xxx'})生成rander函数1.将render函数转换为虚拟Dom2.将虚拟DOM转换为真实DOM和在原DOM下插入一个兄弟节点,然后删除原DOM?vue-loader主要依赖vue-template-compiler模块处理模板属性