非兼容性改变
此页面列出了 Vue 2 对 Vue 3 的所有非兼容性改变。
虽然 Vue 看起来已经发生了很多变化,但您所了解和喜爱的 Vue 的很多东西仍然没有变;但我们希望尽可能完整的为每个记录的更改提供详细的解释和示例。
详情说明
全局API
模板指令
v-model
指令在组件上的使用已经被重新设计,替换掉了v-bind.sync
- 在
<template v-for>
和没有v-for
的节点身上使用key
发生了变化 v-if
和v-for
在同一个元素身上使用时的优先级发生了变化v-bind="object"
现在是顺序敏感的v-on:event.native
事件修饰符已经被移除
组件
- 函数式组件只能通过纯函数进行创建
- 单文件组件 (SFC)
<template>
标签的functional
attribute 和函数式组件的functional
选项已被移除 - 异步组件现在需要通过
defineAsyncComponent
方法进行创建 - 组件事件现在应该使用
emits
选项进行声明
渲染函数
- 渲染函数 API 更改
$scopedSlots
property 已移除,所有插槽都通过$slots
作为函数暴露$listeners
被移除或整合到$attrs
$attrs
现在包含class
和style
attribute
自定义元素
其他小改变
destroyed
生命周期选项被重命名为unmounted
beforeDestroy
生命周期选项被重命名为beforeUnmount
- Props 的
default
工厂函数不再可以访问this
上下文 - 自定义指令的 API 已更改为与组件生命周期一致,且
binding.expression
已移除 data
选项应始终被声明为一个函数- 来自 mixin 的
data
选项现在为浅合并 - Attribute 强制策略已更改
- Transition 的一些 class 被重命名
<TransitionGroup>
不再默认渲染包裹元素- 当侦听一个数组时,只有当数组被替换时,回调才会触发,如果需要在变更时触发,则必须指定
deep
选项 - 没有特殊指令的标记 (
v-if/else-if/else
、v-for
或v-slot
) 的<template>
现在被视为普通元素,并将渲染为原生的<template>
元素,而不是渲染其内部内容。 - 已挂载的应用不会替换它所挂载的元素
- 生命周期的
hook:
事件前缀改为vue:
被移除的 API
keyCode
作为v-on
修饰符的支持- $on、$off 和 $once 实例方法
- 过滤器 (filter)
- 内联模板 attribute
$children
实例 propertypropsData
选项$destroy
实例方法。用户不应该再手动管理单个 Vue 组件的生命周期。- 全局函数
set
和delete
以及实例方法$set
和$delete
。基于代理的变化检测已经不再需要它们了。