Vue3和Vue2对比学习之全局 API 应用实例

文章目录

  • 0.前言
  • 1.参考文档
  • 2.详细说明
    • 2.1 全局 API 应用实例 非兼容
    • 2.2 一个新的全局 API:`createApp`
      • `config.productionTip` 移除
      • `config.ignoredElements` 替换为 `config.isCustomElement`
      • `Vue.prototype` 替换为 `config.globalProperties`
      • `Vue.extend` 移除
        • 类型推断
        • 组件继承
      • 插件开发者须知
    • 2.3 挂载 App 实例
    • 2.4 Provide / Inject
    • 2.5 在应用之间共享配置
  • 3.总结

在这里插入图片描述

0.前言

在Vue 2和Vue 3中,全局API应用实例方面有一些非兼容性改变。以下是每个版本中的详细说明:

Vue 2全局API应用实例:

  • Vue实例作为全局API的核心,可以通过new Vue()来创建和管理Vue应用。
  • 在Vue 2中,你可以通过Vue全局对象来访问和操作Vue实例,例如:Vue.prototype.$dataVue.prototype.$watch等。
  • 全局的Vue实例可以用于访问和操作根组件,全局事件总线,全局状态管理等。

Vue 3全局API应用实例:

  • 在Vue 3中,全局API的应用实例方面有了一些改变,主要通过createApp()函数来创建Vue应用实例。
  • 你可以使用createApp()函数创建一个应用实例,例如:const app = createApp(App)
  • 应用实例可以通过链式调用来配置应用的全局行为和使用插件,例如:app.use(plugin)
  • 全局的Vue实例被废弃,不再作为全局API的核心。相反,你可以通过应用实例来操作根组件、全局事件、全局状态等。

1.参考文档

Vue 2文档:

  • 官方文档:Vue.js Guide - Global API
  • 官方文档:Vue.js API Reference - Global
  • Vue Mastery课程:Vue.js Essentials - Global API

Vue 3文档:

  • 官方文档:Vue.js Guide - Application Composition
  • 官方文档:Vue.js API Reference - createApp
  • Vue Mastery课程:Vue 3 Fundamentals - Application Instance

2.详细说明

2.1 全局 API 应用实例 非兼容

Vue 2.x 有许多全局 API 和配置,它们可以全局改变 Vue 的行为。例如,要注册全局组件,可以使用 Vue.component API,就像这样:

js

Vue.component('button-counter', {data: () => ({count: 0}),template: '<button @click="count++">Clicked {{ count }} times.</button>'
})

类似地,全局指令的声明方式如下:

js

Vue.directive('focus', {inserted: (el) => el.focus()
})

虽然这种声明方式很方便,但它也会导致一些问题。从技术上讲,Vue 2 没有“app”的概念,我们定义的应用只是通过 new Vue() 创建的根 Vue 实例。从同一个 Vue 构造函数创建的每个根实例共享相同的全局配置,因此:

  • 在测试期间,全局配置很容易意外地污染其他测试用例。用户需要仔细地存储原始全局配置,并在每次测试后恢复 (例如重置 Vue.config.errorHandler)。有些 API 像 Vue.use 以及 Vue.mixin 甚至连恢复它们所产生的作用的方法都没有,这使得涉及插件的测试特别棘手。实际上,vue-test-utils 必须实现一个特殊的 API createLocalVue 来处理此问题:

    js

    import { createLocalVue, mount } from '@vue/test-utils'// 创建一个扩展的 `Vue` 构造函数
    const localVue = createLocalVue()// 在 “local” Vue构造函数上 “全局地” 安装插件
    localVue.use(MyPlugin)// 将 `localVue` 传入挂载选项
    mount(Component, { localVue })
    
  • 全局配置使得在同一页面上的多个“应用”在全局配置不同时共享同一个 Vue 副本非常困难。

    js

    // 这会影响到所有根实例
    Vue.mixin({/* ... */
    })const app1 = new Vue({ el: '#app-1' })
    const app2 = new Vue({ el: '#app-2' })
    

为了避免这些问题,在 Vue 3 中我们引入了…

2.2 一个新的全局 API:createApp

调用 createApp 返回一个应用实例,一个 Vue 3 中的新概念。

import { createApp } from 'vue'const app = createApp({})

如果你使用的是 Vue 的 CDN 构建版本,那么 createApp 将通过全局的 Vue 对象暴露。

const { createApp } = Vueconst app = createApp({})

应用实例暴露了 Vue 2 全局 API 的一个子集,经验法则是,任何全局改变 Vue 行为的 API 现在都会移动到应用实例上,以下是 Vue2 全局 API 及其相应的实例 API 列表:

2.x 全局 API3.x 实例 API (app)
Vue.configapp.config
Vue.config.productionTip移除 (见下方)
Vue.config.ignoredElementsapp.config.compilerOptions.isCustomElement (见下方)
Vue.componentapp.component
Vue.directiveapp.directive
Vue.mixinapp.mixin
Vue.useapp.use (见下方)
Vue.prototypeapp.config.globalProperties (见下方)
Vue.extend移除 (见下方)

所有其他不全局改变行为的全局 API 现在都是具名导出,文档见全局 API Treeshaking。

config.productionTip 移除

在 Vue 3.x 中,“使用生产版本”提示仅在使用“dev + full build”(包含运行时编译器并有警告的构建版本) 时才会显示。

对于 ES 模块构建版本,由于它们是与打包器一起使用的,而且在大多数情况下,CLI 或脚手架已经正确地配置了生产环境,所以本提示将不再出现。

迁移构建开关:CONFIG_PRODUCTION_TIP

config.ignoredElements 替换为 config.isCustomElement

引入此配置选项的目的是为了支持原生自定义元素,因此重命名可以更好地传达它的意图。同时,新选项接受一个函数,相比旧的字符串或正则表达式来说能提供更高的灵活性:

// 之前
Vue.config.ignoredElements = ['my-el', /^ion-/]// 之后
const app = createApp({})
app.config.compilerOptions.isCustomElement = (tag) => tag.startsWith('ion-')

重要

在 Vue 3 中,元素是否是组件的检查已转移到模板编译阶段,因此只有在使用运行时编译器时此配置选项才会生效。如果你使用的是仅运行时构建版本,则 isCustomElement 必须在构建步骤中传递给 @vue/compiler-dom ——比如,通过 vue-loader 中的 compilerOptions 选项。

  • 当使用仅运行时构建版本时,如果配置了 config.compilerOptions.isCustomElement 选项,将发出警告,以指示用户该选项应该在构建步骤中传递;
  • 这将是 Vue CLI 配置中新的顶层选项。

迁移构建开关:CONFIG_IGNORED_ELEMENTS

Vue.prototype 替换为 config.globalProperties

在 Vue 2 中, Vue.prototype 通常用于添加所有组件都能访问的 property。

在 Vue 3 中与之对应的是 config.globalProperties。这些 property 将被复制到应用中,作为实例化组件的一部分。

// 之前 - Vue 2
Vue.prototype.$http = () => {}
// 之后 - Vue 3
const app = createApp({})
app.config.globalProperties.$http = () => {}

使用 provide (稍后会讨论) 时,也应考虑作为 globalProperties 的替代品。

迁移构建开关:GLOBAL_PROTOTYPE

Vue.extend 移除

在 Vue 2.x 中,Vue.extend 曾经被用于创建一个基于 Vue 构造函数的“子类”,其参数应为一个包含组件选项的对象。在 Vue 3.x 中,我们已经没有组件构造器的概念了。应该始终使用 createApp 这个全局 API 来挂载组件:

// 之前 - Vue 2// 创建构造器
const Profile = Vue.extend({template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>',data() {return {firstName: 'Walter',lastName: 'White',alias: 'Heisenberg'}}
})
// 创建一个 Profile 的实例,并将它挂载到一个元素上
new Profile().$mount('#mount-point')
// 之后 - Vue 3
const Profile = {template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>',data() {return {firstName: 'Walter',lastName: 'White',alias: 'Heisenberg'}}
}
Vue.createApp(Profile).mount('#mount-point')

类型推断

在 Vue 2 中,Vue.extend 也被用来为组件选项提供 TypeScript 类型推断。在 Vue 3 中,为了达到相同的目的,defineComponent 全局 API 可以用来作为 Vue.extend 的替代方案。

需要注意的是,虽然 defineComponent 的返回类型是一个类似构造器的类型,但是它的目的仅仅是为了 TSX 的推断。在运行时 defineComponent 里基本没有什么操作,只会原样返回该选项对象。

组件继承

在 Vue 3 中,我们强烈建议使用 组合式 API 来替代继承与 mixin。如果因为某种原因仍然需要使用组件继承,你可以使用 extends 选项 来代替 Vue.extend

迁移构建开关:GLOBAL_EXTEND

插件开发者须知

在 UMD 构建中,插件开发者使用 Vue.use 来自动安装插件是一个通用的做法。例如,官方的 vue-router 插件是这样在浏览器环境中自行安装的:

var inBrowser = typeof window !== 'undefined'
/* … */
if (inBrowser && window.Vue) {window.Vue.use(VueRouter)
}

由于 use 全局 API 在 Vue 3 中已无法使用,因此此方法将无法正常工作,并且调用 Vue.use() 现在将触发一个警告。取而代之的是,开发者必须在应用实例上显式指定使用此插件:

const app = createApp(MyApp)
app.use(VueRouter)

2.3 挂载 App 实例

使用 createApp(/* options */) 初始化后,应用实例 app 可通过 app.mount(domTarget) 挂载根组件实例:

import { createApp } from 'vue'
import MyApp from './MyApp.vue'const app = createApp(MyApp)
app.mount('#app')

经过所有的这些更改,我们在指南开头编写的组件和指令现在将被改写为如下内容:

const app = createApp(MyApp)app.component('button-counter', {data: () => ({count: 0}),template: '<button @click="count++">Clicked {{ count }} times.</button>'
})app.directive('focus', {mounted: (el) => el.focus()
})// 现在,所有通过 app.mount() 挂载的应用实例及其组件树,
// 将具有相同的 “button-counter” 组件和 “focus” 指令,
// 而不会污染全局环境
app.mount('#app')

迁移构建开关:GLOBAL_MOUNT

2.4 Provide / Inject

与在 2.x 根实例中使用 provide 选项类似,Vue 3 应用实例也提供了可被应用内任意组件注入的依赖项:

// 在入口中
app.provide('guide', 'Vue 3 Guide')// 在子组件中
export default {inject: {book: {from: 'guide'}},template: `<div>{{ book }}</div>`
}

在编写插件时使用 provide 将尤其有用,可以替代 globalProperties

2.5 在应用之间共享配置

在应用之间共享配置 (如组件或指令) 的一种方法是创建工厂函数,如下所示:

import { createApp } from 'vue'
import Foo from './Foo.vue'
import Bar from './Bar.vue'const createMyApp = (options) => {const app = createApp(options)app.directive('focus' /* ... */)return app
}createMyApp(Foo).mount('#foo')
createMyApp(Bar).mount('#bar')

现在,FooBar 实例及其后代中都可以使用 focus 指令

3.总结

在Vue 2中,全局API应用实例使用Vue全局对象来创建和管理Vue应用。而在Vue 3中,全局API应用实例使用createApp()函数来创建应用实例,并通过该实例来操作和管理应用的全局行为。这些改变需要注意,特别是在迁移Vue 2代码到Vue 3时需要相应地调整全局API的使用方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/93816.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter 连接 MySQL 数据库脚本

1、创建线程组 2、创建 JDBC Connection Configuration 3、创建 JDBC Request 4、最终创建的目录 5、重点来了 5.1 在百度中下载个 MySQL-connector-Java-8.0.28.jar&#xff0c;放在 jmeter 的 bin 目录下 5.2 在测试计划中&#xff0c;将 jar 包添加到脚本中 5.3 输入参…

pycorrector一键式文本纠错工具,整合了BERT、MacBERT、ELECTRA、ERNIE等多种模型,让您立即享受纠错的便利和效果

pycorrector&#xff1a;一键式文本纠错工具&#xff0c;整合了Kenlm、ConvSeq2Seq、BERT、MacBERT、ELECTRA、ERNIE、Transformer、T5等多种模型&#xff0c;让您立即享受纠错的便利和效果 pycorrector: 中文文本纠错工具。支持中文音似、形似、语法错误纠正&#xff0c;pytho…

拿捏--->打印爱心(小心机表白)

文章目录 题目描述算法思路代码示例思路一思路二 题目描述 利用java语言编写算法在控制台打印爱心算法 算法思路代码示例 思路一 打印心形主要分为上下两部分&#xff0c;如图&#xff1a; 下边主要是一个倒立三角形&#xff0c;容易打印。 上边可以分为左右两部分&#…

python运算符

算术运算符 以下假设变量&#xff1a; a10&#xff0c;b20&#xff1a; 加 - 两个对象相加a b 输出结果 30-减 - 得到负数或是一个数减去另一个数a - b 输出结果 -10*乘 - 两个数相乘或是返回一个被重复若干次的字符串a * b 输出结果 200/除 - x除以y b / a 输出结果 2&…

如何快速优化 CnosDB 数据库性能与延迟:使用 Jaeger 分布式追踪系统

在正式的生产环境中&#xff0c;数据库的性能和延迟对于确保系统的稳定和高效运行至关重要。特别是在与 CnosDB 数据库进行交互时&#xff0c;更深入地了解其表现变得尤为重要。这时Jaeger 分布式追踪系统发挥了巨大的作用。在本篇博客中&#xff0c;我们将深入探讨如何通过使用…

使用Docker搭建MySQL主从复制(一主一从)

Docker安装MySQL docker pull mysql:5.7 docker images mysql安装步骤 1.新建主服务器容器实例3307 docker run -p 3307:3306 --name mysql-master -v /usr/local/docker/mysql5.7/data/mysql-master/logs:/var/log/mysql -v /usr/local/docker/mysql5.7/data/mysql-master/…

LangChain源码逐行解密之系统(二)

LangChain源码逐行解密之系统 20.2 serapi.py源码逐行剖析 我们可以看一下Google查询的例子,在LangChain中有多种实现的方式。 如图20-5所示,在utilities的serpapi.py代码文件中实现了SerpAPIWrapper。 图20- 5 utilities的serpapi.py的SerpAPIWrapper 在langchain目录的se…

《vue3实战》运用radio单选按钮或Checkbox复选框实现单选多选的试卷制作

文章目录 目录 系列文章目录 1.《Vue3实战》使用axios获取文件数据以及走马灯Element plus的运用 2.《Vue3实战》用路由实现跳转登录、退出登录以及路由全局守护 3.《vue3实战》运用Checkbox复选框实现单选多选的试卷展现&#xff08;本文&#xff09; 文章目录 前言 radio是什…

等保案例 6

用户简介 江苏省监狱管理局是江苏省司法厅管理下的副厅级部门管理机构&#xff0c;是主管全省监狱工作的机关。随着信息化的发展&#xff0c;江苏省监狱管理局的监狱业务对网络和信息系统的依赖不断增加&#xff0c;网络流转的信息量不断增大&#xff0c;信息化建设的需求也日…

Zabbix-6.4.4 邮箱告警SMS告警配置

目录 ​------------------------- # 邮箱告警 ---------------------------------- 1.安装mailx与postfix软件包 2.修改mailx配置文件 3. 创建文件夹 4. 编写mail-send.sh脚本 5. 将该脚本赋予执行权限 6. 进入web界面进行设置—> Alerts —> Media Types 7. 添…

【Linux】Linux启动/查看/结束进程命令(详细讲解)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

基线与基线检查

目录 一、什么是基线 二、安全基线与配置核查 三、常见安全配置问题 四、配置检查目的 五、配置检查标准 六、基线检查标准 七、安全基线与漏扫的异同 相同点 不同点 八、安全基线体系 九、安全配置核查关注什么 口令策略 文件权限 用户账户 系统服务 认证授权 网络通…

人工智能原理(9)

目录 一、人工神经元模型 1、概念 2、分类 二、感知器的结构 三、反向传播网络 四、自组织映射神经网络 五、离散HOPFIELD网络 1、离散Hopfield网络结构 2、离散Hopfield网络的稳定性 3、离散Hopfield网络学习算法 六、脉冲耦合神经网络 一、人工神经元模型 1、概念…

6G 特点及表现

6G R&D Vision: Requirements and Candidate Technologies 5G已经提出来了大移动带宽&#xff0c;低时延和大规模机器互联&#xff0c;在这个基础上&#xff0c;6G加上了高可靠性&#xff0c;高定位精度和高智能化。 6G的主要候选技术&#xff0c;包括(子) THz 通信&#x…

在 SHELL 脚本中调用另一个 SHELL 脚本(报错: go: not found)

文章目录 在 SHELL 脚本中调用另一个 SHELL 脚本&#xff08;报错&#xff1a; go: not found&#xff09;在 SHELL 脚本中调用另一个 SHELL 脚本一个脚本sudo调另外一个脚本&#xff0c;报错&#xff08;报错&#xff1a; go: not found&#xff09; 在 SHELL 脚本中调用另一个…

OpenCV实例(九)基于深度学习的运动目标检测(一)YOLO运动目标检测算法

基于深度学习的运动目标检测&#xff08;一&#xff09; 1.YOLO算法检测流程2.YOLO算法网络架构3.网络训练模型3.1 训练策略3.2 代价函数的设定 2012年&#xff0c;随着深度学习技术的不断突破&#xff0c;开始兴起基于深度学习的目标检测算法的研究浪潮。 2014年&#xff0c;…

【C++】面向对象编程引入 ③ ( 面向过程编程的结构化程序设计方法 | 结构化程序设计方法概念 / 特点 / 优缺点 | 面向对象编程引入 )

文章目录 一、面向过程编程的结构化程序设计方法1、结构化程序设计方法概念2、结构化程序设计方法特点3、结构化程序设计方法优缺点 二、面向对象编程引入 一、面向过程编程的结构化程序设计方法 如果使用 面向过程语言 ( 如 : C 语言 ) , 开发 大型 项目 , 一般使用 结构化程序…

uniapp微信小程序区分正式版,开发版,体验版

小程序代码区分是正式版&#xff0c;开发版&#xff0c;还是体验版 通常正式和开发环境需要调用不同域名接口&#xff0c;发布时需要手动更换 或者有些东西不想在正式版显示&#xff0c;只在开发版体验版中显示&#xff0c;也需要去手动隐藏 官方没有明确给出判断环境的方法&a…

scrollIntoView 导致整个页面上移问题

更改参数 block: ‘start’, behavior: smooth’更改为 behavior: ‘smooth’, block: ‘nearest’, inline: ‘start’ 在这里插入图片描述

Selenium之css怎么实现元素定位?

世界上最远的距离大概就是明明看到一个页面元素站在那里&#xff0c;但是我却定位不到&#xff01;&#xff01; Selenium定位元素的方法有很多种&#xff0c;像是通过id、name、class_name、tag_name、link_text等等&#xff0c;但是这些方法局限性太大&#xff0c; 随着自动…