[Easy] Vue3 新特性
1. What are the new features in Vue 3?
Vue 3 有哪些新特性?
Vue 3 引入了许多新特性和改进,主要包括:
主要新特性
- Composition API:新的组件写法
- Teleport:将组件渲染到 DOM 的其他位置
- Fragment:组件可以有多个根节点
- Suspense:处理异步组件加载
- 多个 v-model:支持多个 v-model
- 更好的 TypeScript 支持
- 性能优化:更小的打包体积、更快的渲染速度
2. Teleport
Teleport 是什么?
定义:Teleport 允许我们将组件的内容渲染到 DOM 树的其他位置,而不改变组件的逻辑结构。
使用场景
常见场景:Modal、Tooltip、Notification 等需要渲染到 body 的组件
点此展开 Teleport 示例
<template>
<div>
<button @click="showModal = true">打开 Modal</button>
<!-- 使用 Teleport 将 Modal 渲染到 body -->
<Teleport to="body">
<div v-if="showModal" class="modal">
<div class="modal-content">
<h2>Modal 标题</h2>
<p>Modal 内容</p>
<button @click="showModal = false">关闭</button>
</div>
</div>
</Teleport>
</div>
</template>
<script setup>
import { ref } from 'vue';
const showModal = ref(false);
</script>
优势
- 解决 z-index 问题:Modal 渲染到 body,不受父组件样式影响
- 保持逻辑结构:组件逻辑仍在原位置,只是 DOM 位置不同
- 更好的可维护性:Modal 相关代 码集中在组件中
3. Fragment(多根节点)
Fragment 是什么?
定义:Vue 3 允许组件有多个根节点,不需要包裹在单一元素中。这是一个隐式的 Fragment,不需要像 React 那样使用 <Fragment> 标签。
Vue 2 vs Vue 3
Vue 2:必须有单一根节点
<!-- Vue 2:必须包裹在单一元素中 -->
<template>
<div>
<h1>标题</h1>
<p>内容</p>
</div>
</template>
Vue 3:可以有多个根节点
<!-- Vue 3:可以有多个根节点 -->
<template>
<h1>标题</h1>
<p>内容</p>
</template>
为什么需要 Fragment?
在 Vue 2 中,组件必须有单一根节点,这导致开发者经常需要添加额外的包裹元素(如 <div>),这些元素:
- 破坏语义化 HTML:添加无意义的包裹元素
- 增加 DOM 层级:影响样式选择器和性能
- 样式控制困难:需要处理额外包裹元素的样式