Vue2 ➔ Vue3 都做了哪些改变?

这篇具有很好参考价值的文章主要介绍了Vue2 ➔ Vue3 都做了哪些改变?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Vue2 ➔ Vue3 都做了哪些改变?,vue.js,前端,javascript

不是吧,兄弟,Vue3 都出来多久了,你还对这个感兴趣,说!是不是没好好卷?😏

俺也一样 😂,Vue3 出来之后只是简单了解了一下,然后还是转头一直在写 Vue2。当然,这也和大家搬砖 🧱 的处境有关。一般情况下,用 Vue2 起的项目没有什么大的问题,谁又会耗费经历去迁移呢?

不过自己在有机会单独写 H5 的时候,还是会有意识的去试试 Vue3 的。感觉 Vue2 如果掌握的不错的话,其实学习 Vue3 也没什么大的成本,但如果突然让你总结一下 Vue2 和 Vue3 的区别,你能答上来多少呢?数据响应式?生命周期?阿巴阿巴... 😅

其实官方 Vue3 迁移指南 早就给出了详细的说明,这里对一些常用的做下些总结,一起看看吧,Let's go!🚀

1. 语法上

1.1 指令模板相关

  • 移除 v-on.native 修饰符

在 Vue 2 中,v-on.native 修饰符使得组件的事件侦听器可以直接绑定到组件根元素上的原生事件。至于为什么要在 Vue3 中移除,网上有这样的解释:Vue2 这种方式并不符合组件的封装和规范性,因为组件应该将自己的行为和内部实现细节封装起来,而不是直接依赖于父级组件的事件。

Vue 3 更加倡导组件的封装性和独立性,因此移除了v-on.native 修饰符,鼓励使用更明确的方式进行事件传递和处理。有道理 🤔

  • v-model 语法调整,v-model:title="title",代替了之前的 v-model 和 .sync
<!-- Vue2: -->
<ChildComponent v-model="pageTitle" />
<!-- 是以下的简写: -->
<ChildComponent :value="pageTitle" @input="pageTitle = $event" />

<ChildComponent :title.sync="pageTitle" />
<!-- 是以下的简写: -->
<ChildComponent :title="pageTitle" @update:title="pageTitle = $event" />


<!-- Vue3: -->
<ChildComponent v-model:title="pageTitle" />
<!-- 是以下的简写: -->
<ChildComponent :title="pageTitle" @update:title="pageTitle = $event" />

1.2 组件相关

  • 异步组件的调整,路由懒加载的组件需要用 defineAsyncComponent 关键字包裹 📦
  • emit 选项可以定义组件可向父组件触发的事件,同 props
// 数组语法
export default {
  emits: ['check'],
  created() {
    this.$emit('check')
  }
}

// 对象语法
export default {
  emits: {
    // 没有验证函数
    click: null,

    // 具有验证函数
    submit: (payload) => {
      if (payload.email && payload.password) {
        return true
      } else {
        console.warn(`Invalid submit event payload!`)
        return false
      }
    }
  }
}

1.3 渲染函数

  • $listeners 合并至 $attrs
  • $attrs 现在包含了所有传递给组件的 attribute,包括 class 和 style

1.4 移除的 API

  • createApp() 代替 new Vue()
  • ​从实例中完全移除了 $on、$off 和 $once 方法,通过 new Vue() 方式实现的事件总线不再可用 😅。官方推荐用外部的、实现了事件触发器接口的库, 如 mitt 或 tiny-emitter

1.5 其他

  • 根元素可以有不止一个标签了
  • create 生命周期被 setup 代替,destroyed 被改名为 unmounted
  • data 选项已标准化为只接受返回 object 的 function
  • watch 可以侦听数组时候,必须指定 deep 才能侦听到数组元素的改变
  • 新增了 <Teleport> 传送门
  • ref 支持函数了

2. 数据响应式

2.1 Vue2 数据响应式原理

老生常谈的问题,再赘述一遍 😐

Vue2 对数据的劫持是用的 Object.defineProperty,但这种方式其实是有缺点的 👀

  • 对于未初始化但却直接在 DOM 上引用的变量,并不能做到响应式 ➡️ 补救:$set
  • 对于数组类型的数据,通过下标改变的方式达不到响应式 ➡️ 补救:使用改写的数组 API
Object.defineProperty(obj, key, val) {
	enumerable: true,
	configurable: true,
	get: function reactiveGetter() {
		return val
	},
	set: function reactiveSetter(newVal) {
		if(newVal === val) return
		val = newVal
		dep.notify() // 通知依赖该属性的其他组件进行更新
	}
}

2.2 Vue3 数据响应式原理

​Vue3 弥补了 Object.defineProperty 的两个不足:

  • Vue2 中动态创建的 data 属性需要通过 Vue.$set 来赋,Proxy 则不需要
  • 基于性能的考虑,Vue2 篡改了数组的 7 个 API,Proxy 则不需要

defineProperty 需要提前递归遍历 data 做到响应式,而 Proxy可以在真正用到深层数据时候再做响应式(惰性)🐂🍺

funciton reactive(obj) {
	return new Proxy(obj, {
		get(target, key, receiver) {
			const res = Reflect.get(target, key, receiver)
			track(target, key) // 收集依赖
			return isObject(res) ? reactive(res) : res
		},
		set(target, key, value, receiver) {
			const oldValue = target[key]
			const result = Reflect.set(target, key, value, receiver)
			if(result && oldValue !== value) {
				trigger(target, key) // 触发更新
			}
			return result
		}
	})
}

3. Composition API

 Vue 官方:组合式 API 常见问答:组合式 API (Composition API) 是一系列 API 的集合,使我们可以使用函数而不是声明选项的方式书写 Vue 组件。它是一个概括性的术语,涵盖了以下方面的 API:

在 Vue 3 中,组合式 API 基本上都会配合 <script setup> 语法在单文件组件中使用。下面是一个使用组合式 API 的组件示例:

<template>
  <button @click="increment">点击了:{{ count }} 次</button>
</template>

<script setup>
import { ref, onMounted } from 'vue'

// 响应式状态
const count = ref(0)

// 更改状态、触发更新的函数
function increment() {
  count.value++
}

// 生命周期钩子
onMounted(() => {
  console.log(`计数器初始值为 ${count.value}。`)
})
</script>

为什么要用 Composition API?

Vue 官方:组合式 API 常见问答 里也说了为什么,比如更好的逻辑复用、类型推导、更灵活的代码组织、更小的生产包体积。🐂🍺

此外,我还了解大概是 2019 年 6月,尤雨溪发表了一篇 Composition API 的文章:「Vue Function-based API RFC」 ,详细阐述了为什么要出新的 API,其描述的设计思路大致总结如下:

  • 响应式 API:例如 ref() 和 reactive(),使我们可以直接创建响应式状态、计算属性和侦听器。
  • 生命周期钩子🪝:例如 onMounted() 和 onUnmounted(),使我们可以在组件各个生命周期阶段添加逻辑。
  • 依赖注入:例如 provide() 和 inject(),使我们可以在使用响应式 API 时,利用 Vue 的依赖注入系统。
  • Composition API 比 mixins、高阶组件、Renderless Components 更好:
    • 模版中的数据来源不清晰。举例来说,当一个组件中使用了多个 mixin 的时候,光看模版会很难分清一个属性到底是来自哪一个 mixin。HOC 也有类似的问题。
    • 命名空间冲突。由不同开发者开发的 mixin 无法保证不会正好用到一样的属性或是方法名。HOC 在注入的 props 中也存在类似问题。
    • 性能。HOC 和 Renderless Components 都需要额外的组件实例嵌套来封装逻辑,导致无谓的性能开销。
  • Composition API 更适合 TypeScript,Vue2 的装饰器结合 TypeScript 非常难用。

ps:不知道大家有没有关注过 Vue3 的整个推出过程,我记得 Vue3 一开始公布的想法是推出一个基于 Class 的 API,忘记是在哪里偶然看到的了。那个时候 React 推出了 hooks 的概念,不知道是不是觉的 hooks 的概念更好,但是又不能直接叫 hooks API,所以就叫 Composition API。

此外,当时还有一个潮流,大家好像都在从 JS 往 TS 上靠,Vue 应该也想和 TypeScript 结合的更紧密,单 Vue2 装饰器的写法非常麻烦,于是乎一石二鸟,Composition API 即赶上了最新的 API 风格,又赶上了最新的语言风格。ps:也许是我凭空 yy 🤔

​从个人的角度来讲,作为 Vue 的使用者,我感觉 Vue3 比 React 要好。因为 Vue3 是在 React 后推出的,它看到 hooks API 之后才发明的 Composition API,那它就避免了 React 中的几个显著的问题,比如:不能获取最新的值,手动写依赖不太容易写好,可能某个依赖忘写导致不更新...

end 🎉文章来源地址https://www.toymoban.com/news/detail-578316.html

到了这里,关于Vue2 ➔ Vue3 都做了哪些改变?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VUE3相比VUE2升级了哪些内容

    目录 一、Vue 3 、Vue 2 对比及提升项 二、  Vue 3 创建app.vue示例  三、Vue3 的setup、Vue2 的 data对比 一、Vue 3 、Vue 2 对比及提升项 性能提升:Vue 3 做了大量的优化工作,提升了运行时的性能。例如,在模板编译时进行的静态分析和优化,以及使用了更高效的响应式系统,使得数据

    2024年01月22日
    浏览(51)
  • vue2和vue3有啥区别,vue3的优点有哪些?

    Vue.js 是一种流行的 JavaScript 框架,用于开发现代 Web 应用程序。Vue.js 具有简单易用、高效和灵活等特点,能够极大地提高开发效率并改进用户体验。Vue.js 一直在不断更新和改进,它的最新版本是 Vue 3。 在本文中,我们将探讨 Vue 2 和 Vue 3 的区别,以及如何从 Vue 2 迁移到 Vu

    2024年02月06日
    浏览(44)
  • 【前端面经】Vue3和Vue2的区别

    Vue是一种非常流行的JavaScript框架,因其易用性和灵活性在开发人员中备受欢迎。Vue2是Vue框架的上一个重要版本,于2016年发布。但是,Vue3是最新版本的Vue框架,于2020年正式发布并带来了一些重大变化。本文将探讨Vue3和Vue2之间的主要区别。 Vue3的一个显着优势是其更小的代码

    2024年02月02日
    浏览(83)
  • 从Vue2到Vue3, 一键升级前端开发技能

    本文的目的,是为了让已经有 Vue2 开发经验的   人   ,快速掌握 Vue3 的写法。 因此,   本篇假定你已经掌握 Vue 的核心内容   ,只为你介绍编写 Vue3 代码,需要了解的内容。 首先,Vue3 新增了一个叫做组合式 api 的东西,英文名叫 Composition API 。因此 Vue3 的  script  现在支

    2024年02月08日
    浏览(76)
  • 关于前端框架vue2升级为vue3的相关说明

    一些框架需要升级 当前(202306) Vue 的最新稳定版本是 v3.3.4 。Vue 框架升级为最新的3.0版本,涉及的相关依赖变更有: 前提条件:已安装 16.0 或更高版本的Node.js(摘) 必须的变更:核心库vue@23、路由vue-router@34、状态管理vuex@34 构建工具链: Vue CLI Vite(摘) 状态管理: Vuex Pi

    2024年02月15日
    浏览(51)
  • uniapp引入全局js,vue2/vue3不同方式引入

    Hi I’m Shendi uniapp引入全局js,vue2/vue3不同方式引入 最近写小程序,个人开发,选用了 uni-app 进行开发 选用的 vue3 版本 因为我用的 vue3 版本,在这里踩了没学过vue3的坑,用vue2引入全局js的方式使用,导致undefined… Vue2 版引入全局js的方法如下 将js放到项目内,一般放到自建的

    2024年02月03日
    浏览(64)
  • 前端vue2、vue3去掉url路由“ # ”号——nginx配置

    大家好,我是yma16,本文分享关于vue2、vue3去掉url路由 # 号——nginx配置。 html的 hash模式 HTML的hash模式指的是URL中的锚点部分(#后面的内容)被用于在单个页面中显示不同的内容,而不是导航到不同的页面。例如: 在这个示例中, #about 部分是一个锚点,用于在页面上显示关

    2024年02月11日
    浏览(76)
  • Vue2和Vue3是Vue.js框架的两个主要版本,它们之间有以下区别

    性能优化:Vue3在内部进行了重写,采用了更高效的虚拟DOM算法,使得渲染速度更快,性能更好。 更小的体积:Vue3的体积比Vue2更小,这意味着更快的下载和加载速度。 Composition API:Vue3引入了Composition API,它是一种新的组合式API,可以更好地组织和重用组件逻辑,使得代码更

    2024年02月15日
    浏览(48)
  • 前端经典面试题 | 吊打面试官系列 之 Vue2和Vue3的区别

    🖥️ 前端经典面试题 吊打面试官 专栏:Vue2和Vue3的区别 🧑‍💼 个人简介:一个不甘平庸的平凡人🍬 ✨ 个人主页:CoderHing的个人主页 🍀 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️ 👉 你的一键三连是我更新的最大动力❤️ 目录 一、回答点 二、深入回答 监测机制

    2024年01月16日
    浏览(48)
  • vue3前端开发,感受一下组合式api和VUE2选项式的差异

    vue3前端开发,感受一下组合式api和VUE2选项式的差异!今天开始,正式开始,进入学习Vue3的内容。以后代码,案例分享,都会采用组合式api的模式为大家做展示。 今天是第一节,带大家感受一下,Vue3的组合式api和之前传统的vue2版本选项式api的差别。 首先,大家需要提前使用

    2024年01月19日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包