1.组合式api替换选项式api,方便逻辑更加聚合
也可以说是生命周期的变化:
vue2:
beforeCreate:实例初始化之后。
created:实例创建完成后立即调用,属性和方法都ok了,但是dom获取不到,所以去mounted里获取。
beforeMount:挂载开始之前调用。
mounted:el被创建的vm.#el替换,并挂载到实例上去之后调用该钩子。
beforeUpdate:数据更新时被调用,发生在虚拟DOM重新渲染和打补丁之前。
Updated:虚拟DOM重新渲染和打补丁之后调用。
beforeDestroy:实例销毁之前被调用,实例仍然可用。
destroyed:实例销毁后调用,该钩子被调用时,Vue实例的所有指令都已解绑,所有事件侦听器都已被清除,所有子实例也都已被销毁。
Vue3:
beforeDestroy和destroyed修改了新名字,beforeCreate和create改为了setup,setup也因此获取不了dom。 beforeUnmount: 在卸载之前被调用。
unmounted: 在卸载完成后被调用。
2.细节使用改变
(1)无this
(2)生命周期无creat,setup==create,卸载改为unmount
(3)v-if优先级高于v-for
(4)根实例创建从new app变成 createApp方法
(5)全局注册mixin,注册全局组件,vue3的use改成了用app实例调用,而不是vue类调用
(6)传送门teleport组件
(7)template模板可以不包在一个根div,fragment
3.使用原理
(1)响应式原理改成了proxy,解决了数组无法通过下标修改,无法监听对象属性的增删,提升了响应式效率,vue3.3以前也没有完全抛弃defineProperty,通过reactive定义的响应式数据使用proxy包装,但ref还是defineProperty去给一个空对象,然后给了一个.value属性来做响应式,但3.3new了一个Reflmpl的类class,但本质和defineProperty结果一样,通过set和get标记了类里边的.value方法
(2)组合式api源码改成了函数式编程,方便按需引入,因为tree-shaking功能必须配合按需引入写法,所以vue3更好配合tree-shaking能让打包体积更小
(3)性能优化增加了静态节点标记来标记静态节点,不去对节点本身进行比较,这个静态节点标记可以避免在diff算法中多余消耗性能进行标记,举例:在Vue3 Template Explorer这个网站可以看到模板最终生成的源码渲染函数代码,可以看到如果是div内写死的文本也就是纯静态节点,第二个参数的值为null,如果div内是{{ 模板 }}第二个参数值为1,代表他不是纯静态的,而如果div :class="b"则第二个参数值为2,说明属性不是静态的
4.进阶操作
(1)vue3不推荐mixin而推荐hook
(2)v-model应用于组件时,监听的事件和传递的值改变
vue2 value 监听 change/input事件
vue3 modelValue 监听 update:modelValue
如果需要把组件内部的值和父组件的值双向绑定,v-model本质是:
<input :value="a" @input="(e)=>{a=e.target.value}"/>
,vue2中和原生是等价的,但vue3中不同,vue3中:
<son v-model="a"></son>
等价于:
<son :modelValue="a" @update:modelValue="(e)=>{a=e}"></son>
,比如弹窗组件、Date Picker、Color Picke
(3)ts更好适配