Vue 3与React内置组件全对比

发布于:2025-08-17 ⋅ 阅读:(14) ⋅ 点赞:(0)

下面整理了 Vue 3React 中常见的内置组件与函数的知识框架,并一一说明其作用与适用场景。


一、知识架构全览

Vue 内置组件与功能(Vue 3)

  • Teleport
  • Suspense
  • Transition / TransitionGroup
  • KeepAlive
  • Fragments(多根节点支持)
  • Composition API(尽管不是“组件”,但也是核心机制)

React 内置组件与函数

  • Fragment
  • createPortal
  • Suspense
  • lazy() + Suspense
  • (其他功能如 flushSynccreateRoot 虽是 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
  • 说明:不是“组件”,但提供逻辑复用(setupreactiverefcomputedwatch 等),提升组织结构与 TypeScript 支持。(The Software House)

React 内置组件 / 函数说明

1. Fragment (<>...</>)
  • 作用:允许返回多个子元素,而不引入多余 DOM 节点。
  • 场景:渲染列表、兄弟节点结构等。
2. createPortal
  • 作用:将子组件渲染到指定 DOM 节点中,脱离当前结构。(React, React)
  • 注意:事件仍按 React 树而非 DOM 树传播,上下文也可穿透。(React, React)
  • 用途:模态框、浮层、Toast、工具提示等。(Refine)
3. Suspense + lazy()
  • Suspense

  • 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(useStateuseEffect等) 组件逻辑组织与复用

四、使用建议

  • Vue

    • 使用 <Teleport> 在结构中灵活定位 UI;
    • 使用 <Suspense> 简化异步依赖处理;
    • <KeepAlive> 保持组件状态;
    • 用 transition 系列处理动画;
    • 利用 Composition API 组织组件逻辑。
  • React

    • 使用 Fragment 保持结构洁净;
    • createPortal 构建脱离布局的 UI;
    • 利用 lazy() + Suspense 实现按需加载与占位优化。

希望这份以“逻辑分类 + 功能对比”为核心的知识框架,对你理解 Vue 和 React 中的内置组件和函数非常有帮助!如果你希望深入某个功能(例如 Teleport 的场景、Suspense 在 SSR 中的用法等),欢迎继续告诉我~


以下是前端框架(React/Vue)中用于解决特定场景的核心组件/函数及其扩展,按功能分类说明:


🚀 一、核心组件/函数

  1. Portal(React)/ Teleport(Vue)

    • 用途:将组件内容渲染到 DOM 树的任意位置(如 body 下),突破父组件层级限制。
    • 场景:模态框、全局通知、悬浮菜单等需脱离父容器样式的 UI。
    • 示例
      // React(createPortal)
      ReactDOM.createPortal(<Modal />, document.body);
      // Vue(Teleport)
      <Teleport to="body"><Modal /></Teleport>
      
  2. Fragment(React/Vue 3)

    • 用途:允许组件模板返回多个根节点,避免无意义的包裹元素。
    • 场景:表格/列表布局、语义化 HTML 结构优化。
    • 示例
      // React
      <> <Header /> <Main /> </>
      // Vue 3
      <template> <header /> <main /> </template>
      
  3. Suspense(React/Vue 3)

    • 用途:处理异步组件加载状态,展示备用内容(如加载动画)。
    • 场景:懒加载组件、数据请求等待期。
    • 示例
      // React
      <Suspense fallback={<Spinner />}>
        <AsyncComponent />
      </Suspense>
      // Vue 3
      <Suspense><template #fallback>Loading...</template></Suspense>
      

二、扩展组件/函数(React)

  1. 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;
        }
      }
      
  2. Profiler(性能分析)

    • 用途:测量组件渲染时间和资源消耗。
    • 场景:性能优化调试。
    • 示例
      <Profiler id="App" onRender={(metrics) => console.log(metrics)}>
        <App />
      </Profiler>
      
  3. StrictMode(严格模式)

    • 用途:检测潜在问题(如废弃 API 使用、副作用风险)。
    • 场景:开发环境辅助调试。

🔮 三、扩展组件/函数(Vue)

  1. KeepAlive(缓存组件)

    • 用途:缓存动态组件状态,避免重复渲染。
    • 场景:标签页切换、路由视图缓存。
    • 示例
      <KeepAlive>
        <component :is="currentComponent" />
      </KeepAlive>
      
  2. Transition(过渡动画)

    • 用途:为元素添加进入/离开的 CSS 动画。
    • 场景:列表排序、模态框淡入淡出。
    • 示例
      <Transition name="fade">
        <div v-if="show">Content</div>
      </Transition>
      
  3. PortalVue(Vue 2 的 Teleport 替代)

    • 用途:Vue 2 中实现类似 Teleport 的功能(需第三方库)。
    • 场景:兼容旧版 Vue 的模态框需求。

💡 四、通用优化类组件

  1. memo(React)/ v-memo(Vue 3)

    • 用途:缓存组件输出,避免不必要的重渲染。
    • 场景:纯展示型组件性能优化。
  2. 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 事件指标等)想深入了解,欢迎继续告诉我!


网站公告

今日签到

点亮在社区的每一天
去签到