下面整理了 Vue 3 和 React 中常见的内置组件与函数的知识框架,并一一说明其作用与适用场景。
一、知识架构全览
Vue 内置组件与功能(Vue 3)
Teleport
Suspense
Transition
/TransitionGroup
KeepAlive
- Fragments(多根节点支持)
- Composition API(尽管不是“组件”,但也是核心机制)
React 内置组件与函数
Fragment
createPortal
Suspense
lazy()
+Suspense
- (其他功能如
flushSync
、createRoot
虽是 API,但不属于 UI 组件,这里主要聚焦 UI 相关部分)
二、详细功能说明与对比
Vue 内置组件说明
1. <Teleport>
- 作用:将组件的一部分渲染到 DOM 中的指定节点之外,脱离当前组件的 DOM 层级 。(Vue.js, The Software House)
- 典型用途:模态框、工具提示(tooltip)、通知等脱离布局流的 UI 元素。(Vue.js, vue-cheatsheet.themeselection.com)
- 新特性:Vue 3.5 引入
defer
属性,让目标节点无需提前存在;并可和<Transition>
搭配使用,支持动画效果。(Ninja Squad)
2. <Suspense>
- 作用:为带有异步依赖的组件树提供统一加载状态控制,通过 fallback slot 显示备用内容。(Vue.js, vue-cheatsheet.themeselection.com)
- 适用场景:异步
setup()
、异步组件等。可避免多个独立 loading 状态导致的“爆米花效应”。(Vue.js, Vue School) - 高级用法:可嵌套 Suspense 提供分层加载策略,提升用户体验。(Vue School)
3. <Transition>
/ <TransitionGroup>
- 作用:为单个或多个元素提供进入/离开动画效果。(Vue.js)
- 场景:元素切换、列表动画等。
4. <KeepAlive>
- 作用:为动态组件缓存状态,防止频繁销毁、重建。(Vue.js)
- 场景:Tab页切换、需要保留状态的组件展示。
5. Fragments(多根节点支持)
- 作用:Vue 3 支持组件模板中存在多个根节点,无需额外包装元素。(pieces.app)
- 优势:简洁灵活,减少无意义 DOM。
6. Composition API
- 说明:不是“组件”,但提供逻辑复用(
setup
、reactive
、ref
、computed
、watch
等),提升组织结构与 TypeScript 支持。(The Software House)
React 内置组件 / 函数说明
1. Fragment
(<>...</>
)
- 作用:允许返回多个子元素,而不引入多余 DOM 节点。
- 场景:渲染列表、兄弟节点结构等。
2. createPortal
- 作用:将子组件渲染到指定 DOM 节点中,脱离当前结构。(React, React)
- 注意:事件仍按 React 树而非 DOM 树传播,上下文也可穿透。(React, React)
- 用途:模态框、浮层、Toast、工具提示等。(Refine)
3. Suspense
+ lazy()
Suspense
- 作用:为异步组件或数据加载提供 fallback UI,直到依赖完成。(contentful.com, hygraph.com)
- 高级功能:可嵌套以实现渐进加载。(React, hygraph.com)
lazy()
- 作用:实现组件懒加载,按需加载代码。(Bits and Pieces)
- 通常与
Suspense
配合使用实现金可折叠加载效果。
三、功能框架对照表
功能类别 | Vue 组件/API | React 组件/API | 典型用途 |
---|---|---|---|
DOM 控制 | <Teleport> |
createPortal() |
模态框、浮层、工具提示 |
异步加载 | <Suspense> |
Suspense + lazy() |
懒加载组件、数据加载的加载占位处理 |
多根节点支持 | 多根节点模板(Fragment 无需额外 API) | Fragment |
返回并列子节点,无包装元素 |
状态持久化 | <KeepAlive> |
— (React 本身无类似内置) | 缓存组件状态,避免销毁重建 |
动画处理 | <Transition> / <TransitionGroup> |
CSS / Animation libraries | 元素切入切出动画 |
逻辑复用机制 | Composition API | Hooks(useState 、useEffect 等) |
组件逻辑组织与复用 |
四、使用建议
Vue:
- 使用
<Teleport>
在结构中灵活定位 UI; - 使用
<Suspense>
简化异步依赖处理; - 用
<KeepAlive>
保持组件状态; - 用 transition 系列处理动画;
- 利用 Composition API 组织组件逻辑。
- 使用
React:
- 使用
Fragment
保持结构洁净; - 用
createPortal
构建脱离布局的 UI; - 利用
lazy()
+Suspense
实现按需加载与占位优化。
- 使用
希望这份以“逻辑分类 + 功能对比”为核心的知识框架,对你理解 Vue 和 React 中的内置组件和函数非常有帮助!如果你希望深入某个功能(例如 Teleport 的场景、Suspense 在 SSR 中的用法等),欢迎继续告诉我~
以下是前端框架(React/Vue)中用于解决特定场景的核心组件/函数及其扩展,按功能分类说明:
🚀 一、核心组件/函数
Portal
(React)/Teleport
(Vue)- 用途:将组件内容渲染到 DOM 树的任意位置(如
body
下),突破父组件层级限制。 - 场景:模态框、全局通知、悬浮菜单等需脱离父容器样式的 UI。
- 示例:
// React(createPortal) ReactDOM.createPortal(<Modal />, document.body); // Vue(Teleport) <Teleport to="body"><Modal /></Teleport>
- 用途:将组件内容渲染到 DOM 树的任意位置(如
Fragment
(React/Vue 3)- 用途:允许组件模板返回多个根节点,避免无意义的包裹元素。
- 场景:表格/列表布局、语义化 HTML 结构优化。
- 示例:
// React <> <Header /> <Main /> </> // Vue 3 <template> <header /> <main /> </template>
Suspense
(React/Vue 3)- 用途:处理异步组件加载状态,展示备用内容(如加载动画)。
- 场景:懒加载组件、数据请求等待期。
- 示例:
// React <Suspense fallback={<Spinner />}> <AsyncComponent /> </Suspense> // Vue 3 <Suspense><template #fallback>Loading...</template></Suspense>
⚡ 二、扩展组件/函数(React)
Error Boundary
(错误边界)- 用途:捕获子组件的 JavaScript 错误并展示降级 UI。
- 场景:防止局部错误导致整个应用崩溃。
- 实现:
class ErrorBoundary extends React.Component { state = { hasError: false }; static getDerivedStateFromError() { return { hasError: true }; } render() { return this.state.hasError ? <FallbackUI /> : this.props.children; } }
Profiler
(性能分析)- 用途:测量组件渲染时间和资源消耗。
- 场景:性能优化调试。
- 示例:
<Profiler id="App" onRender={(metrics) => console.log(metrics)}> <App /> </Profiler>
StrictMode
(严格模式)- 用途:检测潜在问题(如废弃 API 使用、副作用风险)。
- 场景:开发环境辅助调试。
🔮 三、扩展组件/函数(Vue)
KeepAlive
(缓存组件)- 用途:缓存动态组件状态,避免重复渲染。
- 场景:标签页切换、路由视图缓存。
- 示例:
<KeepAlive> <component :is="currentComponent" /> </KeepAlive>
Transition
(过渡动画)- 用途:为元素添加进入/离开的 CSS 动画。
- 场景:列表排序、模态框淡入淡出。
- 示例:
<Transition name="fade"> <div v-if="show">Content</div> </Transition>
PortalVue
(Vue 2 的 Teleport 替代)- 用途:Vue 2 中实现类似 Teleport 的功能(需第三方库)。
- 场景:兼容旧版 Vue 的模态框需求。
💡 四、通用优化类组件
memo
(React)/v-memo
(Vue 3)- 用途:缓存组件输出,避免不必要的重渲染。
- 场景:纯展示型组件性能优化。
lazy
(React)/defineAsyncComponent
(Vue 3)- 用途:异步加载组件(代码分割)。
- 场景:减少首屏加载体积。
- 示例:
// Vue 3 const AsyncComp = defineAsyncComponent(() => import('./Component.vue'));
💎 总结:组件选择指南
场景 | 推荐组件 | 框架 |
---|---|---|
跨 DOM 渲染 | Teleport (Vue)/ Portal (React) |
通用 |
多根节点 | Fragment |
通用 |
异步加载状态管理 | Suspense |
通用 |
错误隔离 | Error Boundary |
React |
组件缓存 | KeepAlive |
Vue |
性能监测 | Profiler |
React |
最佳实践:
- Portal/Teleport 优先用于全局 UI(如弹窗),避免层级冲突。
- Suspense + 懒加载 提升首屏性能,配合骨架屏优化体验。
- Fragment 替代冗余
<div>
包裹,尤其在表格/列表场景。
通过组合使用这些组件,可显著提升代码可维护性、性能及用户体验。
下面是 Vue 3 与 React 中几个核心内置组件及函数的详细讲解,配合示例代码帮助你理解它们的功能、优势与适用场景。
Vue 3 内置组件
1. <Teleport>
- 作用:将可视内容渲染到 DOM 树中的另一个位置,脱离当前组件层级结构。非常适合用于显示模态框、提示层、浮动菜单等脱离布局流的 UI 元素。
- 文档引用:在 Vue 官方文档中明确指出
<Teleport>
可将组件模板部分传送至不同 DOM 节点 。
示例
<template>
<div>
<button @click="showModal = true">打开模态框</button>
<Teleport to="body" v-if="showModal">
<div class="modal-overlay" @click="showModal = false">
<div class="modal-content" @click.stop>
<h2>这是一个模态框</h2>
<button @click="showModal = false">关闭</button>
</div>
</div>
</Teleport>
</div>
</template>
2. <KeepAlive>
- 作用:用于缓存动态组件的状态,当组件切换出去后再切回来时可保留之前状态,避免重新渲染。适用于保持滚动位置、表单输入等。
- 文档引用:Vue 官方将
<KeepAlive>
介绍为用于动态组件缓存而非销毁 。
示例
<template>
<div>
<button @click="current = 'A'">组件 A</button>
<button @click="current = 'B'">组件 B</button>
<KeepAlive include="CompA">
<component :is="current" />
</KeepAlive>
</div>
</template>
<script setup>
import { ref } from 'vue';
import CompA from './CompA.vue';
import CompB from './CompB.vue';
const current = ref('CompA');
</script>
3. <Transition>
与 <TransitionGroup>
- 作用:为进入/离开或列表排列变化提供过渡动画支持。
- 文档引用:Vue 提供
<Transition>
用于单个元素过渡,<TransitionGroup>
用于列表过渡和重排动画 。
示例(单个元素)
<template>
<div>
<button @click="show = !show">切换</button>
<Transition name="fade">
<p v-if="show">带过渡的文本</p>
</Transition>
</div>
</template>
<style>
.fade-enter-active, .fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter-from, .fade-leave-to {
opacity: 0;
}
</style>
4. <Suspense>
- 作用:协调异步组件/依赖加载,在等待加载期间显示 fallback 内容,可避免多余的 loading 状态闪烁。
- 文档引用:Vue 的
<Suspense>
用于管理组件树中多个嵌套的异步依赖 。
示例
<template>
<Suspense>
<template #default>
<AsyncComp />
</template>
<template #fallback>
<div>加载中...</div>
</template>
</Suspense>
</template>
<script setup>
import { defineAsyncComponent } from 'vue';
const AsyncComp = defineAsyncComponent(() =>
import('./HeavyComponent.vue')
);
</script>
5. <slot>
- 作用:插槽机制用于组件内容分发,可实现高程度的复用和灵活布局。
- 文档引用:Vue 对
<slot>
这类特殊元素有专门说明 。
React 内置组件 / API
1. Fragment
(<Fragment>
或 <>...</>
)
- 作用:允许组件返回多个子节点而不添加额外 DOM 元素。
- 文档引用:在 React 文档中被介绍为让组件返回多个元素时避免额外节点 。
示例
function List() {
return (
<>
<li>项 1</li>
<li>项 2</li>
</>
);
}
2. createPortal
- 作用:将子组件渲染到指定的 DOM 节点,脱离组件层级结构,常用于模态框、Toast 弹层等。
- 文档引用:React 官方文档介绍
createPortal
返回一个可插入 JSX 的 React 节点 。
示例
import { createPortal } from 'react-dom';
function Modal({ children, onClose }) {
return createPortal(
<div className="modal-overlay" onClick={onClose}>
<div className="modal-content" onClick={e => e.stopPropagation()}>
{children}
</div>
</div>,
document.body
);
}
3. Suspense
+ lazy()
- 作用:实现组件异步加载并在加载期间使用 fallback UI。
- 文档引用:React 文档提供了
React.lazy
和 Suspense 的详细配合指南 。
示例
import { Suspense, lazy } from 'react';
const LazyComp = lazy(() => import('./MyComponent'));
function App() {
return (
<Suspense fallback={<div>加载中...</div>}>
<LazyComp />
</Suspense>
);
}
4. <StrictMode>
- 作用:启用开发模式下的额外检查帮助发现潜在问题,如不安全生命周期、遗留 API 等。
- 文档引用:React 文档指出
<StrictMode>
不渲染 UI,仅用于开发模式的警告和检查 。
5. <Profiler>
- 作用:测量组件渲染性能,可用于分析渲染频率和成本。通常搭配 React DevTools 使用。
- 文档引用:React 文档中介绍
<Profiler>
可编程收集渲染性能指标 。
总结对照表
功能类别 | Vue 组件/API | React 组件/API |
---|---|---|
多根节点支持 | 模板中自然支持多根节点 | Fragment |
DOM 层渲染控制 | <Teleport> |
createPortal |
异步加载处理 | <Suspense> |
Suspense + lazy() |
动画/过渡 | <Transition> / <TransitionGroup> |
CSS 动画或第三方动画库 |
状态缓存与持久化 | <KeepAlive> |
— |
内容分发 | <slot> |
Props.children |
开发检查机制 | — | <StrictMode> |
性能分析 | — | <Profiler> |
如果你对某个组件或功能(如 Teleport 的 advanced use, Suspense 嵌套策略,Profiler 事件指标等)想深入了解,欢迎继续告诉我!