vue3和vue2的区别

327 阅读3分钟

总结Vue3.x变化

1,移除了哪些?

children移除了(注意children移除了(注意parent还在)

new Vue({ data:{} }) 这个写法淘汰了,如果用到data一定要使用工厂函数。

移除了 on/on / off / once(注意once (注意emit还在)

在V3中,事件总线这种通信这种基于订阅发布模式的通信方案也不能用了。

移除了全局过滤器(Vue.filter)、移除了局部过滤器 filters选项。

在V3中,Vue这个构造函数不能用了,所以像V2中的那个全局API都不能了,所以Vue的原型链也不能用了。

在V3中,不再支持修改键盘码了。

移除了listeners(注意listeners (注意attrs还在)

移除了 el选项、model选项、propsData选项

v-on的.native修饰符已被移除。

2,新增了哪些?

在V3中,增加了 emits选项、defineEmits,用于在子组件中接收自定义事件。

在组件中,使用 getCurrentInstance 可以访问 app根实例。

新增了 suspense,用于给异步组件添加交互效果。

新增了 teleport的to属性,用于把包裹的视图结构“穿梭”到父级的DOM节点中去。

新增了样式的玩法,第一个玩法是在style中可以使用v-bind来做动态样式;在style标签上module='default'实现 样式模块化,在组合中使用useCssModule访问样式模块。

新增了一个指令 v-memo,用法:在div上v-memo='[a, b]',有且仅有当a或b变化时,其包裹的视图结构才会更新。

在V3中,新增了 useSlots,用于在子组件中访问插槽实例。相当于V2中的this.$slots。

3,变化了哪些?

在V2中,v-for和ref一起作用,可以自动收集refs对象,在this.$refs上访问。在V3中,不能自动收集了,需要自己封装收集方法

在V2中,ref属性作用在HTML标签或组件上,可以在this.$refs上访问DOM或组件实例;在V3中,ref属性配合ref这个组合API为完成对DOM或组件实例的方法,div ref='box',这个box是一个ref对象,使用box.value访问对应的DOM。

在V3中,使用 defineAsyncComponent 定义更加友好的异步组件。

在V2中,使用this.attrs访问父组件传递过来的属性们(不包括classstyle);在V3中,使用useAttrs/context.attrs/attrs访问父组件传递过来的属性们(不包括class和style);在V3中,使用useAttrs/context.attrs/attrs访问父组件传递过来的自定义属性们(包含class和style)。

在V3中,使用 app.directive({}/fn) 自定义指令,注意在指令的选项钩了发生了若干变化。

在V3中,template视图模块支持多节点。(当在自定义组件上使用class/style时、在自定义组件上使用多个v-model时,都报了多节点的警告,这时建议将其改成单一根节点)

在V2中,provide/inject是没有响应式的。在V3中,provide用选项写法时,必须配合computed才能实现响应式;provide用组合写法时,默认就有响应式。

在V2中,Vue.nextTick() / this.$nextTick 不能支持 Webpack 的 Tree-Shaking 功能的。在 V3 中的 nextTick ,考虑到了对 Tree-Shaking 的支持。

V3中,对于 v-if/v-else/v-else-if的各分支项,无须再手动绑定 key了, V3会自动生成唯一的key。比如transition对多节点执行动画时,无须再加key了。

在V3中,render选项的函数参数不再是h函数了,如果要使用h函数,得从vue导入。

transition过渡动画的变化:v-enter-from/v-enter-active/v-enter-to和V2不同了;对多节点执行显示与隐藏时,不需要再加key了。当我们封装自定义组件时,如果transition是这个组件的根节点,要使用props传值来触发动画。

同一节点上使用 v-for 和 v-if ,在V2中不推荐这么用,且v-for优先级更高。在V3中,这种写法是允许的,但 v-if 的优秀级更高。

watch这个组合API:允许同时监听多个变量的变化,允许停止监听。const stop = watch([a, b], callback) 在V3中,使用defineProps接收自定义属性时,如果这个属性是对象类型,其default: () => { return },并且在这个default工厂函数中可以使用inject。

v-model有三个变化,在自定义组件上v-model = :modelValue + @update:modelValue, v-model:name = :name + @update:name;在自定义组件上,可以同时使用多个v-model,在People 组件上使用v-model='age' v-model:name='name';还支持自定义修饰符,注意在子组件中必须使用defineProps来分别接收自定义修饰符。