vue3新增的特性和变化

310 阅读4分钟

记录一下比较常用的vue2和vue3中的差异,如果想了解详细的全部的区别,请到vue3迁移指南详细看

一、比较常用的一些变化

1.组件 v-model的变化(非兼容)

2.key的改变(非兼容)

  • 新增:对于 v-if/v-else/v-else-if 的各分支项 key 将不再是必须的,因为现在 Vue 会自动生成唯一的 key

  • 非兼容:如果你手动提供 key,那么每个分支必须使用唯一的 key。你将不再能通过故意使用相同的 key 来强制重用分支。

  • 非兼容<template v-for> 的 key 应该设置在 <template> 标签上 (而不是设置在它的子节点上)。

3.v-if 与 v-for 的优先级对比(非兼容)

  • 非兼容:两者作用于同一个元素上时,v-if 会拥有比 v-for 更高的优先级。

4.移除 v-on.native 修饰符(非兼容)

在vue2中,传递给带有 v-on 的组件的事件监听器只能通过 this.$emit 触发。要将原生 DOM 监听器添加到子组件的根元素中,可以使用 .native 修饰符

在vue3中,新增的 emits 选项允许子组件定义真正会被触发的事件。

5.异步组件(新增)

6.emits 选项[新增]

基本内容

强烈建议使用 emits 记录每个组件所触发的所有事件。

这尤为重要,因为我们移除了 .native 修饰符。任何未在 emits 中声明的事件监听器都会被算入组件的 $attrs,并将默认绑定到组件的根节点上。

  • 一次来自 $emit()
  • 另一次来自应用在根元素上的原生事件监听器。

下面图片验证了上面话语:

image.png

推荐写法

因为官网上面的例子以setup()的模式,所以下面我将< script setup>模式也同样放在一起,方便复习熟悉,下面两种写法效果和功能是一样的,只是写法不同而已

setup()形式,例子

<template>
    <button @click="$emit('click', $event)">Click</button>
</template>

<script>
export default {
    emits: ['click'] // 声明事件
}
</script>

< script setup>形式,例子

<template>
    <button @click="$emit('click', $event)">Click</button>
</template>
<script setup>
    defineEmits(['click'])
</script>

7.Watch监听数组(非兼容)

当使用 watch 选项侦听数组时,只有在数组被替换时才会触发回调。换句话说,在数组被改变时侦听回调将不再被触发。要想在数组被改变时触发侦听回调,必须指定 deep 选项

二、值得注意的新特性

下面的主要简单记录一下是什么意思,通常没举例子的一般都是觉得看了一遍官网就知道什么含义的,比较难理解的或者需要说明的才添加,详细还是看官网

8.组合式API

什么是组合式API?

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

  • 响应式 API:例如 ref() 和 reactive(),使我们可以直接创建响应式状态、计算属性和侦听器。
  • 生命周期钩子:例如 onMounted() 和 onUnmounted(),使我们可以在组件各个生命周期阶段添加逻辑。
  • 依赖注入:例如 provide() 和 inject(),使我们可以在使用响应式 API 时,利用 Vue 的依赖注入系统。

虽然这套 API 的风格是基于函数的组合,但组合式 API 并不是函数式编程。组合式 API 是以 Vue 中数据可变的、细粒度的响应性系统为基础的,而函数式编程通常强调数据不可变。

为什么要有组合式 API?

  1. 更好的逻辑复用
  2. 更灵活的代码组织
  3. 更好的类型推导
  4. 更小的生产包体积

生命周期钩子

这里记一下比较常用的好几个,详情看官网

vue2vue3组合式作用
beforeMountonBeforeMount()在组件被挂载之前调用。
mountedonMounted()在组件被挂载之后调用。
beforeDestroy()onBeforeUnmount()在组件实例被卸载之前调用
destroyed()onUnmounted()在组件实例被卸载之后调用

9.< script setup>

<script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖。当同时使用 SFC 与组合式 API 时该语法是默认推荐。相比于普通的 <script> 语法,它具有更多优势:

  • 更少的样板内容,更简洁的代码。
  • 能够使用纯 TypeScript 声明 props 和自定义事件。
  • 更好的运行时性能 (其模板会被编译成同一作用域内的渲染函数,避免了渲染上下文代理对象)。
  • 更好的 IDE 类型推导性能 (减少了语言服务器从代码中抽取类型的工作)。

10.Teleport

<Teleport> 是一个内置组件,它可以将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去。

11.Fragments 片段

Vue 3 现在正式支持了多根节点的组件,也就是片段!

12.单文件组件 CSS 功能【来自 @vue/runtime-core 的 createRenderer API用来创建自定义渲染函数】

下面图片方便理解

image.png

image.png

13.单文件组件中的状态驱动的 CSS 变量 (<style> 中的 v-bind)

image.png