Vue 2 和 Vue 3 中 Vue 实例变量方法的功能差异对比,包含关键方法的详细说明和表格总结

以下是 Vue 2 和 Vue 3 中 Vue 实例变量方法的功能差异对比,包含关键方法的详细说明和表格总结:


核心方法对比

1. $mount()
Vue 2 Vue 3
作用:手动挂载实例到 DOM 元素 作用:手动挂载 App 实例到 DOM 元素
参数element(DOM 元素或选择器字符串) 参数element(DOM 元素或选择器字符串)
返回值:Vue 实例 返回值:根组件实例
示例vm.$mount('#app') 示例app.mount('#app')
差异 :Vue 3 的 mount 是 App 实例方法,而非组件实例方法

2. $destroy()
Vue 2 Vue 3
作用:销毁 Vue 实例,停止监听和事件 作用:销毁组件实例,停止响应式更新
参数:无 参数:无
示例vm.$destroy() 示例vm.$destroy()
差异 :Vue 3 中仍可用,但需注意组件销毁时的生命周期钩子(如 onUnmounted

3. 事件系统($on, $once, $off, $emit
Vue 2 Vue 3
$on:在实例上监听事件 $on :仍可用,但推荐使用 setuponMounted 等 Composition API
$emit:触发当前组件事件 $emit :仍可用,但事件系统更灵活(如通过 defineEmits 定义)
差异 :Vue 3 推荐使用 setup 中的 emit 函数,而非直接调用 $emit

4. $watch()
Vue 2 Vue 3
作用:监听数据变化 作用 :监听响应式数据(推荐使用 watch 钩子)
参数expression, callback 参数source, callback(需通过 watch 函数)
示例vm.$watch('count', callback) 示例watch(() => state.count, callback)
差异 :Vue 3 中 watch 是全局函数,需在 setup 中调用

5. $set$delete
Vue 2 Vue 3
作用:添加/删除响应式属性 作用 :Vue 3 推荐使用 reactiveref 直接操作,无需 $set
替代方案 :Vue 3 中直接通过 proxy 操作对象属性即可触发响应式更新
差异 :Vue 3 中 $set$delete 仍然可用,但更推荐直接操作响应式对象

6. $nextTick()
Vue 2 Vue 3
作用:DOM 更新后执行回调 作用 :仍可用,但返回 Promise(Vue 2 需第三方 polyfill)
示例vm.$nextTick(() => { ... }) 示例await nextTick()(在 setup 中使用)
差异 :Vue 3 中 nextTick 是全局函数,无需通过实例调用

7. $forceUpdate()
Vue 2 Vue 3
作用:强制重新渲染 作用:仍可用,但 Vue 3 的响应式系统更智能,通常无需调用
差异 :Vue 3 推荐通过 refreactive 直接触发更新

8. 全局注册方法(Vue 2 静态方法 vs Vue 3 App 实例方法)
Vue 2 Vue 3
Vue.component():注册全局组件 app.component():通过 App 实例注册全局组件
Vue.directive():注册全局指令 app.directive():通过 App 实例注册全局指令
Vue.mixin():注册全局混入 app.mixin():通过 App 实例注册全局混入
差异:Vue 3 将全局注册方法移到了 App 实例上,不再通过 Vue 静态方法

9. 插件安装(Vue.use() vs app.use()
Vue 2 Vue 3
Vue.use(plugin):安装插件到全局 app.use(plugin):安装插件到 App 实例
差异:Vue 3 中插件需通过 App 实例安装

Vue 3 新增方法

方法 作用 示例
app.component() 注册全局组件 app.component('MyButton', MyButtonComponent)
app.directive() 注册全局指令 app.directive('focus', { mounted: el => el.focus() })
app.provide() 提供响应式数据给后代组件 app.provide('user', reactive({ name: 'Alice' }))
app.mount() 挂载 App 实例到 DOM app.mount('#app')
app.unmount() 卸载 App 实例 app.unmount()

对比表格总结

方法 Vue 2 Vue 3 关键差异
$mount 实例方法,手动挂载到 DOM App 实例方法,挂载到 DOM Vue 3 的 mount 需通过 App 实例调用,返回根组件实例
$destroy 销毁 Vue 实例 销毁组件实例 生命周期钩子需用 onUnmounted 等 Composition API
事件系统 $on/$emit 在实例上监听/触发事件 推荐使用 setup 中的 emit 函数,事件更灵活 Vue 3 推荐 Composition API 和 defineEmits 定义事件
$watch 监听数据变化,需通过实例调用 使用 watch 全局函数,需在 setup 中调用 Vue 3 的 watch 更灵活,支持多个源和深度监听
$set/$delete 向对象添加/删除响应式属性 直接操作响应式对象(如 reactive),无需 $set Vue 3 的响应式系统更智能,直接操作对象即可触发更新
$nextTick 返回回调函数,需通过实例调用 返回 Promise,可通过 await 使用 Vue 3 的 nextTick 是全局函数,无需通过实例调用
$forceUpdate 强制渲染 仍可用,但推荐通过响应式系统触发更新 Vue 3 的响应式系统更强大,减少强制更新的需求
全局注册 通过 Vue.component/directive/mixin 静态方法 通过 App 实例的 component/directive/mixin 方法 Vue 3 将全局注册移到 App 实例,避免全局污染
插件安装 Vue.use() 全局安装插件 app.use() 在 App 实例上安装插件 Vue 3 插件作用域更明确,避免全局副作用

迁移建议

  1. 全局注册 :Vue 3 中需通过 app.component/directive/mixin 替代 Vue 2 的静态方法。
  2. 事件系统 :优先使用 Composition API 的 defineEmitsemit 函数。
  3. 响应式操作 :直接操作 reactiveref 对象,无需 $set
  4. 生命周期 :用 onMountedonUnmounted 等钩子替代 $destroy$mount 的部分逻辑。
  5. 插件安装 :通过 app.use() 安装插件,确保作用域清晰。

如果需要更具体的代码示例或迁移步骤,请进一步说明!

相关推荐
@PHARAOH几秒前
WHAT - 缓存命中 Cache Hit 和缓存未命中 Cache Miss
前端·缓存
计算机学姐18 分钟前
基于SpringBoot的小型民营加油站管理系统
java·vue.js·spring boot·后端·mysql·spring·tomcat
Elastic 中国社区官方博客23 分钟前
JavaScript 中使用 Elasticsearch 的正确方式,第一部分
大数据·开发语言·javascript·数据库·elasticsearch·搜索引擎·全文检索
万物得其道者成34 分钟前
从零开始创建一个 Next.js 项目并实现一个 TodoList 示例
开发语言·javascript·ecmascript
海天胜景41 分钟前
无法加载文件 E:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本
前端·npm·node.js
MingT 明天你好!44 分钟前
在vs code 中无法运行npm并报无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查
前端·npm·node.js·visual studio code
老兵发新帖1 小时前
pnpm 与 npm 的核心区别
前端·npm·node.js
超级土豆粉1 小时前
怎么打包发布到npm?——从零到一的详细指南
前端·npm·node.js
OpenTiny社区1 小时前
TinyEngine 2.5版本正式发布:多选交互优化升级,页面预览支持热更新,性能持续跃升!
前端·低代码·开源·交互·opentiny
声声codeGrandMaster1 小时前
Django框架的前端部分使用Ajax请求一
前端·后端·python·ajax·django