Vue面试

1.Vue2 与Vue3的区别?

Vue 2和Vue 3是Vue.js框架的不同版本,在面试中经常涉及到它们之间的区别。以下是Vue 2和Vue 3的主要区别:

  1. 性能提升:Vue 3在性能方面进行了优化。Vue 3引入了更高效的Diff算法,提高了渲染性能。

  2. Bundle大小:Vue 3的代码体积更小。Vue 3采用了模块化的设计,可以按需引入所需功能,减少了不必要的文件体积。

  3. Composition API:Vue 3引入了Composition API,这是一种新的API风格,可以更好地组织和重用组件逻辑。

  4. TypeScript支持:Vue 3对TypeScript的支持更加完善。Vue 3的代码库使用了TypeScript进行重写,提供了更好的类型推断和类型检查,使得开发者在使用TypeScript时能够获得更好的开发体验。

  5. 响应式系统改进:Vue 3的响应式系统进行了改进,使用Proxy替代了Vue 2中的Object.defineProperty,提供了更好的性能和开发体验。

  6. Teleport组件:Vue 3引入了Teleport组件,可以将组件的内容渲染到DOM树的任意位置,提供了更大的灵活性。

  7. Fragment优化:Vue 3对Fragment进行了优化,减少了虚拟DOM层级,提高了性能。

  8. 其他改进:Vue 3还带来了许多其他改进和新功能,如全局API的变化、更好的TypeScript支持、更好的错误处理等。

这些是Vue 2和Vue 3之间的一些主要区别。了解这些区别有助于开发者选择合适的版本,并在面试中回答相关问题。

2.Vue 3的Diff算法相比Vue 2有哪些具体的改进?

Vue 3的Diff算法相比Vue 2进行了一些具体的改进,主要包括以下几个方面:

  1. Patch flag:Vue 3引入了Patch flag的概念,用于标记组件在更新过程中的一些特殊情况,例如组件的props发生变化或只需要强制更新等。这样可以在Diff算法中更快速地定位需要更新的组件,减少了比较的工作量,提高了更新性能。

  2. 静态标记和提升:Vue 3在编译阶段对模板进行静态分析,标记出那些静态的内容,即在渲染过程中不会发生变化的部分。对于这部分静态内容,Vue 3将其提升为常量,避免了每次渲染都进行比较的开销,进一步提高了渲染性能。

  3. Fragments优化:在Vue 2中,Fragments(片段)会引入额外的虚拟DOM层级,导致Diff算法需要进行更多的比较操作。而在Vue 3中,对Fragments进行了优化,可以直接将其内部的内容合并到父级中,减少了虚拟DOM层级,提高了Diff算法的效率。

  4. 动态属性的快速路径:Vue 3通过快速路径(Fast Path)优化了动态属性的处理。对于动态属性,Vue 3会使用更快速的路径进行处理,减少了比较的开销,提高了Diff算法的性能。

总的来说,Vue 3的Diff算法在细节上进行了一系列的优化,通过引入Patch flag、静态标记和提升、Fragments优化以及动态属性的快速路径等改进,进一步提升了Diff算法的效率和性能,使得Vue 3在渲染性能方面有显著的改进。

3.computed 和 watch

watch和computed都是以Vue的依赖追踪机制为基础的,它们都试图处理这样一件事情:当某一个或多个数据(称它们为依赖数据)发生变化的时候,所有依赖这些数据的 “相关” 数据 “自动” 发生变化,也就是自动调用相关的函数去实现数据的变动。

(1)computed

1、 支持缓存,只有依赖数据发生改变,才会重新进行计算;

2、 不支持异步,当computed内有异步操作时无效,无法监听数据的变化;

3、 相当于监听多个数据,只要其中有一个数据改变,就出发重新计算,如果数据没改变就用缓存里面的

注意:就算data中没有直接声明要计算的变量,也可以直接在computed中写入,如下示例:

<p id="app">  {{fullName}}  </p>

<script>
    var vm = new Vue({  
        el: '#app',  
        data: {  
            firstName: 'Foo',  
            lastName: 'Bar',  
        },  
        computed: {  
            fullName: function () {  
                return this.firstName + ' ' + this.lastName  
            }  
        }  
    })
</script>

这个fullname不在data里面

(2)watch

1、不支持缓存,数据改变,直接会触发相应的操作;

2、支持异步操作;

3、watch是监听器,只可以监听某一个数据,然后执行相应的操作;

4、监听的函数接收两个参数,第一个参数是最新的值;第二个参数是输入之前的值;

var vm = new Vue({
        el: '#app',
        data: {
            firstName: 'Foo',
            lastName: 'Bar',
            fullName: 'Foo Bar'
        },
        watch: {
            firstName: function (newVal,oldVal) {
                this.fullName = newVal + ' ' + this.lastName
                console.log(newVal+'========='+oldVal)//Fooaaaa=========Foo
            },
            lastName: function (newVal,oldVal) {
                this.fullName = this.firstName + ' ' + newVal
                console.log(newVal+'========='+oldVal)//Baraaaa=========Bar
            }
        }
    })


注意:如果data中没有相应的属性的话,是不能watch的,这点和computed不一样。

总结:
1、当多个属性影响一个属性的时候,建议用computed

2、当一个值发生变化之后,会引起一系列的操作(改变其他属性值),这种情况就适合用watch

3、如果一个数据需要经过复杂计算就用 computed

4、如果在数据变化时执行异步或开销较大的操作时就用 watch

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值