当前位置: 首页 > news >正文

Vue 3与React内置组件全对比

下面整理了 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

    • 作用:为异步组件或数据加载提供 fallback UI,直到依赖完成。(contentful.com, hygraph.com)
    • 高级功能:可嵌套以实现渐进加载。(React, hygraph.com)
  • lazy()

    • 作用:实现组件懒加载,按需加载代码。(Bits and Pieces)
    • 通常与 Suspense 配合使用实现金可折叠加载效果。

三、功能框架对照表

功能类别Vue 组件/APIReact 组件/API典型用途
DOM 控制<Teleport>createPortal()模态框、浮层、工具提示
异步加载<Suspense>Suspense + lazy()懒加载组件、数据加载的加载占位处理
多根节点支持多根节点模板(Fragment 无需额外 API)Fragment返回并列子节点,无包装元素
状态持久化<KeepAlive>— (React 本身无类似内置)缓存组件状态,避免销毁重建
动画处理<Transition> / <TransitionGroup>CSS / Animation libraries元素切入切出动画
逻辑复用机制Composition APIHooks(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 BoundaryReact
组件缓存KeepAliveVue
性能监测ProfilerReact

最佳实践

  • 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 组件/APIReact 组件/API
多根节点支持模板中自然支持多根节点Fragment
DOM 层渲染控制<Teleport>createPortal
异步加载处理<Suspense>Suspense + lazy()
动画/过渡<Transition> / <TransitionGroup>CSS 动画或第三方动画库
状态缓存与持久化<KeepAlive>
内容分发<slot>Props.children
开发检查机制<StrictMode>
性能分析<Profiler>

如果你对某个组件或功能(如 Teleport 的 advanced use, Suspense 嵌套策略,Profiler 事件指标等)想深入了解,欢迎继续告诉我!

http://www.xdnf.cn/news/1308853.html

相关文章:

  • Hadoop面试题及详细答案 110题 (16-35)-- HDFS核心原理与操作
  • 音视频学习(五十四):基于ffmpeg实现音频重采样
  • 基于单片机的防酒驾系统设计
  • 我的世界Java版1.21.4的Fabric模组开发教程(十八)自定义传送门
  • 《C++进阶之继承多态》【多态:概念 + 实现 + 拓展 + 原理】
  • 超越“调参”:从系统架构师视角,重构 AI 智能体的设计范式
  • 嵌入式硬件篇---电感本质
  • VScode 使用遇到的问题
  • Git Revert 特定文件/路径的方法
  • 设计模式之【快速通道模式】,享受VIP的待遇
  • leetcode_ 739 每日温度
  • AI杀死的第一个仪式:“hello world”
  • C++设计模式:面向对象设计原则
  • B+树索引分析:单表最大存储记录数
  • Day2--滑动窗口与双指针--2090. 半径为 k 的子数组平均值,2379. 得到 K 个黑块的最少涂色次数,2841. 几乎唯一子数组的最大和
  • Windows 基于ACL(访问控制列表)的权限管理
  • Manus AI与多语言手写识别的技术突破与行业变革
  • 数学建模Topsis法笔记
  • 【php反序列化介绍与常见触发方法】
  • Bash常用操作总结
  • 9.从零开始写LINUX内核——设置中断描述符表
  • RK3568 NPU RKNN(五):RKNN-ToolKit-lite2板端推理
  • linux I2C核心、总线与设备驱动
  • Dify实战应用指南(上传需求稿生成测试用例)
  • 守护品质安全,防伪溯源系统打造全链路信任体系
  • MySQL异步连接池的学习(五)
  • 海康机器人3D相机的应用
  • Docker目录的迁移
  • OpenCV Python——图像拼接(一)(图像拼接原理、基础知识、单应性矩阵 + 图像变换 + 拼接)
  • Python爬虫实战:研究Scrapy Spiders ,构建豆瓣网电影数据分析处理系统