选项式API和组合式API
在vue2中,一个功能涉及到的逻辑都分散在data、methods、watch、computed中,
vue3中,响应式数据、监听、计算属性、生命周期都以函数的形式抽离出来,可以在任意的地方引入使用
这样做的优点:
- 更好的编码,更容易维护。逻辑点都在setup函数中的一块区域,容易查看
- 更好的复用性。可以使用组合式函数将一些功能封装起来,然后在需要的地方引入,不同于以往的mixins混入,mixins混入的模块导致一些数据方法的来源不清晰,如果混入多个mixins的话可能会造成命名冲突的问题
- 更好的打包优化。因为vue中的一些api都需要显示的引入,这样在打包的时候,打包工具更清楚依赖关系
生命周期
vue3将vue2中销毁阶段的生命周期变成了beforeUnmount和Unmounted,
vue3中引入了setup函数可以替代beforeCreate和created
多根节点
vue2中一个组件必须只有一个根节点,常用方式就是用div包裹所有内容,而vue3中一个组件可以支持多个根节点。
原因是因为vue3中将多根节点的vnode的type值设为Fragment,而不是具体的标签名,这样当遇到type值为Fragment的vnode时进行特殊处理,只将这个vnode的子节点进行挂载
Suspense组件
[səˈspens]
给异步组件请求资源时的兜底内容,如果有三组件需要异步请求资源,那么它们每个都需要处理自己的加载、报错和完成状态,最坏的情况下,我们可能会在页面上看到三个旋转的加载态,并且在不同的时间显示出内容。这种情况下,使用suspense组件可以等待各个异步依赖完成时展示加载中或加载失败的状态
Teleport
[ˈteləˌpɔrt]
可以将组件的内容移动到指定的dom对象下,常见的使用场景就是模态框。如果模态框是嵌套在组件内的话,就会受到一定的限制,因为模态框的实现方式主要是通过固定定位+层级,固定定位相对于浏览器窗口位置,这样父元素就不能使用transform属性,层级受限容器元素,如果有元素和父元素重叠并有更高的层级就会覆盖模态框。
响应式原理
vue2中的响应式原理基于Object.defineProperty,深层遍历对象,给对象的每个属性绑定getter和setter,用于监听对象的读写操作
vue3中的响应式原理基于代理Proxy,通过handler拦截对象的读写操作,在读的时候将副作用函数保存到依赖桶中,写的时候从依赖桶中将副作用函数取出来重新执行
更好的typescript支持
因为vue3使用typescript重写的,对typescript支持性更好
vue3中废弃的内容
$listeners废除,整合到$attrs里面
移除$on,$off 和 $once,推荐使用miit库
不再支持filters语法,使用计算属性更简单
过渡v-enter类名修改为v-enter-from,v-leave类名修改为v-leave-from
data原来支持object和function两种方式,vue3中不再支持object
.sync语法糖废弃,因为v-model改成了和.sync相似的用法,在自定义组件中使用v-model时,传递的prop是modelValue,调用emit时要写成update:modeValue