1. 响应式原理
vue2采用的是Object.defineProperty为每个属性创建getter和setter,通过getter和setter来捕获数据的。
但缺点是无法监听数组或对象新增和删除的数据。办法就是使用watch进行监听。
vue3是通过Proxy来进行数据劫持的,并且可以监听数组或对象新增、删除的数据。
那什么是数据劫持呢?
数据劫持,就是数据代理。
是指在访问或者修改对象的某个属性时,通过一段代码拦截这个行为,进行额外的操作或返回修改结果。
例如使用Object.defineProperty方法来定义对象属性的访问器(getter,setter),或者使用Proxy对象来创建一个对象的代理,从而拦截和自定义基本操作。
了解Object.defineProperty()方法
主要传三个参数
Object.defineProperty(obj,prop,descriptor):
obj: 定义属性的对象
prop:定义或修改属性的名称
descriptor:定义或修改的属性描述符
属性描述符有数据描述符和存取描述符。两者描述符只能存在一个,不能同时存在。
数据描述符:configurable,enumerable,value,writable
存取描述符:configurable,enumerable,get,set
get与value功能相同,set与writable功能相同
2. 生命周期
vue3和vue2的生命周期其实没什么区别,vue3在vue2的基础上在钩子前面加了“on”。
vue3没有created和beforeCreate钩子,被setup替代了,但可以直接使用。
vue2的beforeDestroy和destroyed钩子,vue3替换成onBeforeUnmount和onUnmounted钩子。
vue2 | vue3 | |
---|---|---|
beforeCreate | setup | 组件开始创建数据实例之前 |
created | setup | 组件实例创建完成 |
beforeMount | onBeforeMount | DOM挂载之前 |
mounted | onMounted | DOM挂载完成 |
beforeUpdate | onBeforeUpdate | 组件更新之前 |
updated | onUpdated | 组件更新之后 |
beforeDestroy | onBeforeUnmount | 组件销毁之前 |
destroyed | onUnmounted | 组件销毁之后 |
vue3使用钩子的时候需要先引入才能使用,vue2可以直接使用
<script setup>
//vue3
//需要引入
import { onMounted } from 'vue'
onMounted(()=>{
})
//还可以写多个
onMounted(()=>{
})
</script>
<script>
//vue2
export default{
//直接使用
mounted(){
}
}
</script>
3. vue3支持碎片化
vue2的根节点只能有一个,vue3可以有多个根节点。
4. Composition API
vue2为选项式api,需要各种选项,例如data,methods等。
vue3为组合式api,允许相关的代码逻辑放在一堆,方便管理。
<script>
//vue2
export default {
data(){
return {
id:""
}
},
methods:{
func1(){
},
func2(){
}
}
}
</script>
<script setup>
//vue3
const id = ""
const func1 = ()=>{
}
</script>
5. TypeScript支持
vue3相比于vue2是有更好的TypeScript支持的,vue3由TypeScript重写。
6. 去掉this
vue2访问数据或者方法的时候需要使用this.xx的方式,而vue3可以直接访问,不用this。
7. 构建项目方式
vue2使用webpack的方式构建项目
vue3使用vite的方式构建项目
8. 语法糖
vue3新增了语法糖setup,使用setup后可不用export default导出,也不用return。
所有 ES 模块导出都被认为是暴露给上下文的值。
9. 模块指令
vue2的指令优先级是v-for优于v-if
vue3改变了指令的优先级,v-if优于v-for。好处是避免了无效的dom操作和潜在的性能问题。