Vue2和Vue3区别之API

Vue2和Vue3区别之API

文章目录

  • Vue2和Vue3区别之API
    • 一、全局API 对比总表
      • **1. 创建应用实例**
        • **Vue 2: `new Vue()`**
        • **Vue 3: `createApp()`**
      • **2. 全局指令注册**
        • directive()
        • **Vue 2: `Vue.directive()`**
        • **Vue 3: `app.directive()`**
      • **3. 全局混入**
        • mixin()详解
        • **Vue 2: `Vue.mixin()`**
        • **Vue 3: `app.mixin()`**
      • **4. 插件安装**
        • **Vue 2: `Vue.use(plugin)`**
        • **Vue 3: `app.use(plugin)`**
      • **5. 全局属性/方法挂载**
        • **Vue 2: `Vue.prototype.$http`**
        • **Vue 3: `app.config.globalProperties`**
      • **6. 其他重要 API 变化**
        • **组件注册**
        • **生命周期钩子**
        • **根组件模板**
      • **设计理念升级**
      • **迁移建议**
    • 二、Options API 与 Composition API 对比详解
      • **一、Options API(Vue 2)**
          • **核心特点**:
          • **代码示例**:
      • **二、Composition API(Vue 3)**
          • **核心特点**:
          • **代码示例**:
      • **三、核心区别**
      • **四、详细对比**
          • **1. 响应式实现**
          • **2. 逻辑组织**
          • **3. 生命周期钩子**
          • **4. 逻辑复用**
          • **5. TypeScript 支持**
      • **五、适用场景**
      • **六、迁移建议**
      • **七、总结**
      • **六、迁移建议**
      • **七、总结**

一、全局API 对比总表

功能 Vue 2 Vue 3 核心差异
创建应用实例 new Vue() createApp() 实例化方式隔离化
全局指令注册 Vue.directive() app.directive() 作用域从全局变为应用实例
全局混入 Vue.mixin() app.mixin() 混入范围受应用实例限制
插件安装 Vue.use(plugin) app.use(plugin) 插件作用域隔离
全局属性/方法挂载 Vue.prototype.$http app.config.globalProperties.$http 更规范的全局属性管理

1. 创建应用实例

Vue 2: new Vue()
  • 作用:创建一个 Vue 根实例,挂载到 DOM 元素上。

  • 代码示例

    const vm = new Vue({
      el: '#app',
      data: { message: 'Hello Vue2' },
      template: `
    {{ message }}
    `
    });
  • 特点

    • 全局单例模式,多个 new Vue() 可能相互干扰。
    • 所有组件共享同一个 Vue 构造函数。
Vue 3: createApp()
  • 作用:创建一个 隔离的应用实例,支持多实例共存。

  • 代码示例

    import { createApp } from 'vue';
    const app = createApp({
      data() {
        return { message: 'Hello Vue3' };
      },
      template: `
    {{ message }}
    `
    }); app.mount('#app');
  • 特点

    • 应用实例独立,避免全局污染(如多个应用实例的配置互不影响)。
    • 支持 Tree-shaking(未使用的 API 不会打包到生产环境)。
    • 链式调用更直观(如 createApp().use().mount())。

2. 全局指令注册

directive()

允许开发者直接操作 DOM,实现原生 HTML 无法直接实现的功能(如自动聚焦、滚动加载等)

Vue 2: Vue.directive()
  • 作用:注册一个 全局可用 的自定义指令。

  • 代码示例

    // 全局注册一个聚焦指令
    Vue.directive('focus', {
      inserted(el) {
        el.focus();
      }
    });
    
  • 问题

    • 全局指令会污染所有组件,即使某些组件不需要该指令。
    • 难以实现按需加载。
Vue 3: app.directive()
  • 作用:在 当前应用实例 内注册指令。

  • 代码示例

    const app = createApp(App);
    app.directive('focus', {
      mounted(el) {
        el.focus();
      }
    });
    
  • 优势

    • 指令作用域限制在应用实例内,避免全局污染。
    • 不同应用实例可注册同名指令且互不影响。

3. 全局混入

mixin()详解
  • 原理:是 Vue 2 中用于 代码复用 的一种机制,它允许将 组件的选项(data、methods、生命周期钩子等) 封装成一个独立模块,并注入到多个组件中。
  • 核心目标:将重复逻辑抽象为可复用的单元。
Vue 2: Vue.mixin()
  • 作用:全局注册混入对象,影响 所有 Vue 组件

  • 代码示例

    Vue.mixin({
      created() {
        console.log('全局混入的 created 钩子');
      }
    });
    
  • 风险

    • 所有组件(包括第三方组件)都会被影响,易引发不可预期的副作用。
    • 调试困难,难以追踪混入来源。
Vue 3: app.mixin()
  • 作用:仅在 当前应用实例 内混入逻辑。

  • 代码示例

    const app = createApp(App);
    app.mixin({
      mounted() {
        console.log('应用实例内的混入');
      }
    });
    
  • 改进

    • 混入范围可控,只对当前应用实例的组件生效。
    • 支持多个独立应用共存时,各自维护混入逻辑。

4. 插件安装

Vue 2: Vue.use(plugin)
  • 作用:全局安装 Vue 插件(如 Vue Router、Vuex)。

  • 代码示例

    import Vue from 'vue';
    import VueRouter from 'vue-router';
    Vue.use(VueRouter); // 全局生效
    
  • 问题

    • 插件全局生效,无法实现多实例隔离(如微前端场景)。
    • 插件一旦安装,所有应用实例共享。
Vue 3: app.use(plugin)
  • 作用:为 当前应用实例 安装插件。

  • 代码示例

    import { createApp } from 'vue';
    import router from './router';
    const app = createApp(App);
    app.use(router); // 仅对该 app 实例生效
    
  • 优势

    • 支持多应用实例独立安装插件(如主应用和子应用使用不同配置的 Vue Router)。
    • 插件状态隔离,避免全局冲突。

5. 全局属性/方法挂载

Vue 2: Vue.prototype.$http
  • 作用:在 Vue 原型链上挂载全局属性或方法。

  • 代码示例

    import axios from 'axios';
    Vue.prototype.$http = axios; // 所有组件可通过 this.$http 访问
    
  • 问题

    • 污染全局原型链,可能与其他库或插件冲突(如命名重复)。
    • TypeScript 类型推导困难。
Vue 3: app.config.globalProperties
  • 作用:在 应用实例配置 中挂载全局属性或方法。

  • 代码示例

    import axios from 'axios';
    const app = createApp(App);
    app.config.globalProperties.$http = axios; // 仅在该应用实例中可用
    
  • 改进

    • 属性挂载到应用实例而非全局原型链,避免污染。
    • 类型声明更友好(需配合 TypeScript 声明文件)。
    • 支持多应用实例独立配置。

6. 其他重要 API 变化

组件注册
  • Vue 2:全局组件通过 Vue.component() 注册。
  • Vue 3:通过应用实例注册 app.component()
  • 优势:组件作用域隔离,避免全局注册导致体积膨胀。
生命周期钩子
  • Vue 2beforeDestroy / destroyed
  • Vue 3beforeUnmount / unmounted(更语义化)。
根组件模板
  • Vue 2:根实例若未定义 template,优先使用挂载元素的 outerHTML
  • Vue 3:若未定义 template,使用挂载元素的 innerHTML 作为模板。

设计理念升级

  1. 模块化:Vue 3 的 API 按功能拆分,支持 Tree-shaking(如 v-model 指令可单独引入)。
  2. 隔离性:应用实例化设计避免全局副作用,更适合微前端和大型应用。
  3. TypeScript 友好:所有 API 提供完整类型定义。

迁移建议

  • 新项目:直接使用 Vue 3 的 Composition API +

你可能感兴趣的:(前端知识点,vue.js,前端,javascript)