Vue 3与React内置组件全对比
下面整理了 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 事件指标等)想深入了解,欢迎继续告诉我!