Object.defineProperty,无法检测对象属性的添加/删除,需要 $set
Proxy,可以检测属性的动态添加/删除,响应式更彻底
| Vue2 | Vue3 (Composition API) |
|---|---|
| beforeCreate | setup() |
| created | setup() |
| beforeMount | onBeforeMount |
| mounted | onMounted |
| beforeUpdate | onBeforeUpdate |
| updated | onUpdated |
| beforeDestroy | onBeforeUnmount |
| destroyed | onUnmounted |
// Vue2
Vue.component('my-component', {...})
Vue.directive('my-directive', {...})
// Vue3
app.component('my-component', {...})
app.directive('my-directive', {...})
// ❌ Vue2 模式
this.$set(this.obj, 'newProp', value)
// ✅ Vue3 可以直接赋值
state.obj.newProp = value
// 注意:解构会丢失响应式
const { count } = state // 失去响应式
// 应使用 toRefs
const { count } = toRefs(state)
<!-- Vue2: 多个 v-model 需要手动处理 -->
<ChildComponent v-model="value" :other.sync="otherValue" />
<!-- Vue3: 支持多个 v-model -->
<ChildComponent v-model:title="title" v-model:content="content" />
// Vue2
Vue.prototype.$axios = axios
// Vue3
const app = createApp(App)
app.config.globalProperties.$axios = axios
to 属性指定挂载位置,注意 SSR 兼容性
// 大数组性能优化:使用 shallowRef/shallowReactive
const largeArray = shallowRef([...]) // 只追踪整体替换
// 组件渲染优化:v-memo(Vue3.2+)
<div v-for="item in list" :key="item.id" v-memo="[item.id]">
{{ item.name }}
</div>
script 标签声明 lang="ts"
defineProps 和 defineEmits 需要显式声明类型
$children(使用 $refs 替代)
$on、$off、$once(事件总线需使用第三方库)
filter(使用 computed 或 method 替代)
inline-template 属性
// mixin 冲突处理优先级变化
// 自定义指令生命周期钩子名称变化
bind → beforeMount
inserted → mounted
update → 移除,使用 updated
// keyCode 修饰符移除
// ❌ @keyup.13
// ✅ 使用键名 @keyup.enter
<script setup>
这些变化整体提升了开发体验、性能和类型支持,但需要熟悉新的 API 和最佳实践。