简述vue2.0与vue3.0区别

130 阅读3分钟

生命周期的变化

Vue2.xVue3
beforeCreate
created
beforeMountonBeforeMount
mountedonMounted
beforeUpdateonBeforeUpdate
updatedonUpdated
beforeDestroyonBeforeUnmount
destroyedonUnmounted
Tips:

1.setup会在created之前执行

2.setup定义响应式数据(ref单值)

在setup中返回一个ref()处理的数据
在视图中正常用{{a}} (不需要 .value)
如果要修改这个值:a:在setup中暴露一个函数,直接去修改 .value
                b:在methods中定义一个方法,在此方法内部通过this.xx=新值来修改

3.setup定义响应式数据(reactive对象)

在setup中返回一个reactive()处理的对象obj
在视图中正常用插值,要加上obj
如果要修改这个值:a:在setup中暴露一个函数,直接去修改
                b:在methods中定义一个方法,在此方法内部通过this.xx=新值来修改

4.setup返回响应式数据(reactive对象+toRefs)

setup() {
    // reactive: 会对对象进行包装
    // 它其实是用proxy代理了这个对象,只是第一个级别,所以不能直接解构
    // 如果直接解构,就会失去响应式的特性
    // 这里再用toRefs来包装一下
    const obj = reactive({b: 1, arr: [1,2]})
    const f1 = () => { obj.b = 200}
    const f2 = () => { obj.arr.push(3)}
    return { ...toRefs(obj), f1, f2 }
}

5.setup定义计算属性

setup() {
    // reactive: 会对对象进行包装
    const obj = reactive({b: 1})
    // 通过computed来创建计算属性
    const doubleB = computed(()=>{
    return 2*obj.b
    })
    return { obj, doubleB }
}

6.setup中使用watch

setup() {
    // reactive: 会对对象进行包装
    const obj = reactive({b: 1})
    const a = ref(0)
    // 通过watch来监听
    watch(() => obj.b ,()=>{
    console.log(`obj.b变化了`)
    })
    watch(a, ()=>{
    console.log(`a变化了`)
    })
    return { obj, a }
}

多根节点(fragment)

vue2需要去将组件包裹在div中,否则会报错警告
<template>
    <div>
        <header>...</header>
        <main>...</main>
        <footer>...</footer>
    </div>
</template>
vue3,组件可以包含多个根节点
<template>
    <header>...</header>
    <main>...</main>
    <footer>...</footer>
</template>

异步组件

vue3提供Suspense组件,若想在setup中调用异步请求,需要在setup前加async关键字。这时会 受到警告,需要在父页面调用当前组件外包裹一层Suspense组件

组合式API

vue2是选项式API(option API),一个逻辑会散乱在文件不同位置(data,props,computed,watch,生命周期函数等),代码可读性差

vue3是组合式API(Composition API),可将同一逻辑内容写到一起,增强了代码的可读性,内聚性,还提供了较为完美的逻辑复用性方案,可以解决vue2Mixin的存在命名冲突隐患,依赖关系不明确,不同组件间配置化使用不够灵活

响应式原理

vue2的响应式原理基础是Object.defineProperty:通过里面的getter和setter方法,进行查看和数据的修改,通过发布、订阅者模式进行数据与视图的响应式

vue2双向绑定缺点

1.不能监听对象的新增属性和删除属性

2.无法正确的监听数组方法,当监听的下标对应的数据发生改变时

解决方法

1.重写数组或对象

2.vue中通过this.$set(目前属性,新增的属性,新增的值)来解决

vue3 响应式原理基础是Proxy

对于基本类型数据:响应式依然是靠Object.defineproperty()的get()和set()来完成的

对于对象类型数据:

通过Proxy代理:拦截对象中任意属性的变化,包括属性值的读写,添加,删除等操作

通过Reflect反射函数进行操作