在使用上:
- 用组合式api替换选项式api,方便逻辑更加的聚合
- 一些细节的使用点改变,例如:
1、因为改成组合式api所以没有this
2、生命周期没有creat,setup等同于create,卸载改成unmount
3、vue3中v-if高于v-for的优先级
4、根实例的创建从new app变成了createApp方法
5、一些全局注册,比如mixin,注册全局组件,use改成了用app实例调用,而不是vue类调用
6、新增了传送门teleport组件
7、template模板可以不包在一个根div里
原理方面:
1,响应式原理从property改成了用proxy,解决了数组无法通过下标修改,无法监听到对象属性的新增和删除的问题(产生响应式的问题)。也提升了响应式的效率
2,可以额外叙述vue3并不是完全抛弃了defineProperty,通过reactive定义的响应式数据使用proxy包装出来,而ref还是用的defineProperty去给一个空对象,定义了一个value属性来做的响应式
3,组合式api的写法下,源码改成了函数式编程,方便按需引入,因为tree-shaking功能必须配合按需引入写法。所以vue3更好地配合tree-shaking能让打包体积更小
4,性能优化,增加了静态节点标记。会标记静态节点,不对静态节点进行比对。从而增加效率。
5,vue3不推荐使用mixin进行复用逻辑提取,而是推荐写成hook
// mixin 重复出现的数据和操作逻辑mixin
app.mixin({data(){return {num:1},methods:{addNum(){this.num += 1}}
})// 在vue2里可能是这样把一些经常需要用到的、重复出现的数字啊,方法啊mixin进去。// 但是在vue3中不会这样做了,因为在vue3中更贴近组合式API,mixin更贴近于选项式API,并且很容易和组件自身的冲突,所以建议用hook// Vue3 建议:方法名用use开头
import { ref } from "vue'
function useNum(){let num = ref(1);function addNum(){num.value += 1;}
return { num, addNum }
}
export default useNum// 后续在组件中需要用到的时候直接引入这个方法
import useNum from "./xx.js"
// 使用
const { num,addNum } = useNum()
6,v-model应用于组件时,监听的事件和传递的值改变
vue2 传递的是个value 监听的是 change/input 事件
vue3 传递的是个 modelValue 监听的是update:modelValue事件
7,ts更好地配合