vue2和vue3 面试题

Vue2与Vue3面试详解:响应式原理、计算属性与方法、v-if/v-show及更多
本文详细讲解了Vue2的响应式原理,包括数据收集、依赖追踪和更新过程。接着对比了计算属性和方法的区别,以及v-if和v-show的实现方式。还讨论了Vue3中移除构造函数的原因,采用Proxy实现响应式的新特性,以及Vue3与Vue2在响应式上的差异。此外,还分析了vite相对于webpack的优势,如按需编译和快速启动。最后,介绍了Vue的Diff算法,强调了节点比较和复用策略。

 1.请阐述vue2的响应式原理

简单描述---首先遍历对象的每一个属性然后通过object.defineProperty把每一个属性变成getter和setter 函数,render函数在运行的时候用到了响应式数据于是收集了依赖,当数据变换的时候会通知watcher--watcher会重新运行render函数

深入描述-- 首先把原始对象交给observer 他会把他变成一个响应式对象具有getter和setter,Vue会为响应式对象中的每个属性、对象本身、数组本身创建一个Dep实例突然有一个函数要执行(比如render函数)但是他不是立即执行,他会交给watcher来执行,watcher会设置一个全局变量,让全局变量记录当前负责执行的watcher等于自己然后再去执行函数,在执行的过程中用到了响应式对象的属性,这个属性就会被dep实例收集依赖,如果某个操作改变了数据就会派发更新,通知刚刚记录的watcher,告诉他我变了,watcher不会立即执行这个函数,因为他可能会触发很多次,所以会把自己交给一个调度器,调度器会把这个watcher添加到队列里面,然后会把队列里面的函数交给nextTick,nickTick里面函数都在微队列里面,所以等同步代码执行完了就会进入微队列异步的执行里面的函数,执行到这个watcher的时候,会重新运行render函数

 2.计算属性和方法有什么区别

计算属性本质上是包含getter和setter的方法

      当获取计算属性时,实际上是在调用计算属性的getter方法。vue会收集计算属性的依赖,并缓存计算属性的返回结果。只有当依赖变化后才会重新进行计算。

方法没有缓存,每次调用方法都会导致重新执行。

计算属性的getter和setter参数固定,getter没有参数,setter只有一个参数。而方法的参数不限。

       由于有以上的这些区别,因此计算属性通常是根据已有数据得到其他数据,并在得到数据的过程中不建议使用异步、当前时间、随机数等副作用操作。

实际上,他们最重要的区别是含义上的区别。计算属性含义上也是一个数据,可以读取也可以赋值;方法含义上是一个操作,用于处理一些事情。

3.v-if 和 v-show 有什么区别?

v-if能够控制是否生成vnode,也就间接控制了是否生成对应的dom。当v-if为true时,会生成对应的vnode,并生成对应的dom元素;当其为false时,不会生成对应的vnode,自然不会生成任何的dom元素。

v-show始终会生成vnode,也就间接导致了始终生成dom。它只是控制dom的display属性,当v-show为true时,不做任何处理;当其为false时,生成的dom的display属性为none。

使用v-if可以有效的减少树的节点和渲染量,但也会导致树的不稳定;而使用v-show可以保持树的稳定,但不能减少树的节点和渲染量。

因此,在实际开发中,显示状态变化频繁的情况下应该使用v-show,以保持树的稳定;显示状态变化较少时应该使用v-if,以减少树的节点和渲染量。

面试题1:为什么vue3中去掉了vue构造函数?

vue2的全局构造函数带来了诸多问题:

1. 调用构造函数的静态方法会对所有vue应用生效,不利于隔离不同应用

2. vue2的构造函数集成了太多功能,不利于tree shaking,vue3把这些功能使用普通函数导出,能够充分利用tree shaking优化打包体积

3. vue2没有把组件实例和vue应用两个概念区分开,在vue2中,通过new Vue创建的对象,既是一个vue应用,同时又是一个特殊的vue组件。vue3中,把两个概念区别开来,通过createApp创建的对象,是一个vue应用,它内部提供的方法是针对整个应用的,而不再是一个特殊的组件。

面试题2:谈谈你对vue3数据响应式的理解

vue3不再使用Object.defineProperty的方式定义完成数据响应式,而是使用Proxy。

除了Proxy本身效率比Object.defineProperty更高之外,由于不必递归遍历所有属性,而是直接得到一个Proxy。所以在vue3中,对数据的访问是动态的,当访问某个属性的时候,再动态的获取和设置,这就极大的提升了在组件初始阶段的效率。

同时,由于Proxy可以监控到成员的新增和删除,因此,在vue3中新增成员、删除成员、索引访问等均可以触发重新渲染,而这些在vue2中是难以做到的。

面试题3:谈谈你对vite的理解,最好对比webpack说明

webpack会先打包,然后启动开发服务器,请求服务器时直接给予打包结果。
而vite是直接启动开发服务器,请求哪个模块再对该模块进行实时编译。
由于现代浏览器本身就支持ES Module,会自动向依赖的Module发出请求。vite充分利用这一点,将开发环境下的模块文件,就作为浏览器要执行的文件,而不是像webpack那样进行打包合并。
由于vite在启动的时候不需要打包,也就意味着不需要分析模块的依赖、不需要编译,因此启动速度非常快。当浏览器请求某个模块时,再根据需要对模块内容进行编译。这种按需动态编译的方式,极大的缩减了编译时间,项目越复杂、模块越多,vite的优势越明显。
在HMR方面,当改动了一个模块后,仅需让浏览器重新请求该模块即可,不像webpack那样需要把该模块的相关依赖模块全部编译一次,效率更高。
当需要打包到生产环境时,vite使用传统的rollup进行打包,因此,vite的主要优势在开发阶段。另外,由于vite利用的是ES Module,因此在代码中不可以使用CommonJS

面试题4:请阐述vue的diff算法

当组件创建和更新时,vue均会执行内部的update函数,该函数使用render函数生成的虚拟dom树,将新旧两树进行对比,找到差异点,最终更新到真实dom

对比差异的过程叫diff,vue在内部通过一个叫patch的函数完成该过程

在对比时,vue采用深度优先、同层比较的方式进行比对。

在判断两个节点是否相同时,vue是通过虚拟节点的key和tag来进行判断的

具体来说,首先对根节点进行对比,如果相同则将旧节点关联的真实dom的引用挂到新节点上,然后根据需要更新属性到真实dom,然后再对比其子节点数组;如果不相同,则按照新节点的信息递归创建所有真实dom,同时挂到对应虚拟节点上,然后移除掉旧的dom。

在对比其子节点数组时,vue对每个子节点数组使用了两个指针,分别指向头尾,然后不断向中间靠拢来进行对比,这样做的目的是尽量复用真实dom,尽量少的销毁和创建真实dom。如果发现相同,则进入和根节点一样的对比流程,如果发现不同,则移动真实dom到合适的位置。

这样一直递归的遍历下去,直到整棵树完成对比。

好的,以下是一些 Vue2 Vue3 相关的面试题: 1. Vue2 Vue3 有哪些主要的区别? 答:Vue3 的主要改进点包括:更快的渲染速度、更小的包大小、更好的 TypeScript 支持、更好的组件封装、更好的响应式 API 等。 2.Vue2 中,computed watch 的区别是什么? 答:computed 是计算属性,用于根据已有的数据计算出一个新值,常用于模板中。而 watch 则是监听一个数据的变化,当数据变化时,执行相应的操作。 3. Vue2 中,什么是 mixin?如何使用 mixin? 答:mixin 是一种可重用的组件选项,可以在多个组件之间共享。可以通过在组件中使用 mixins 选项来使用 mixin。 4. Vue2 中,什么是 keep-alive?如何使用 keep-alive? 答:keep-alive 是 Vue 内置组件,用于缓存组件的状态或避免重新渲染。可以通过在组件外包裹一个 <keep-alive> 标签来使用 keep-alive。 5. Vue3 中,什么是 Composition API?它有什么优点? 答:Composition API 是 Vue3 中引入的一种新的 API,用于更好地组织重用组件逻辑。它的优点包括:更好的代码组织、更好的类型推断、更好的逻辑复用等。 6. Vue3 中,什么是 Teleport?如何使用 Teleport? 答:Teleport 是 Vue3 中引入的一种新的组件,用于将组件挂载到指定的 DOM 元素上,可以用于实现模态框等场景。可以通过在组件中使用 <teleport> 标签来使用 Teleport。 7. Vue3 中,什么是 reactive?如何使用 reactive? 答:reactive 是 Vue3 中引入的一种新的响应式数据类型,用于对数据进行监听响应。可以通过在组件中使用 reactive 函数来创建 reactive 对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小兔子的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值