vue3对比 Setup、Render、SFC 从 vue 底层实现和性能开销上全面分析三者区别及优略

vue3 中对比 Setup、Render、SFC 从 vue 底层实现和性能开销上全面分析三者区别及优略

/* setup 方式 */
export const Setup = defineComponent({setup() {const handleChange = (v: any) => {};return () => {return (<div><button onClick={handleChange}>Test</button></div>);};}
});/* Render 方式 */
export const Render = defineComponent({setup() {const handleChange = (v: any) => {};return {handleChange};},render() {return (<div><button onClick={this.handleChange}>Test</button></div>);}
});/* SFC 方式 */
<script setup lang="ts" name="SFC">
const handleChange = (v: any) => {};
</script><template><button @click="handleChange"></button>
</template>

在 Vue 3 中,有多种定义和实现组件的方法,包括使用单文件组件(SFC)、defineComponent 以及组合式 API。以下是对三种方法的全面分析,包括其底层实现和性能开销。

Setup 方法

export const Setup = defineComponent({setup() {const handleChange = (v: any) => {};return () => {return (<div><button onClick={handleChange}>Test</button></div>);};}
});

底层实现

  • 组合式 API:setup 函数允许在同一函数中组织组件逻辑,并且返回一个渲染函数。
  • 逻辑集中:组件逻辑集中在 setup 函数中,利于维护和测试。
  • 类型推断:使用 TypeScript 时,组合式 API 提供更好的类型推断支持。

性能开销

  • 渲染函数:每次组件重新渲染时都会执行返回的渲染函数,可能带来性能开销。
  • 即时执行:逻辑和渲染都在同一个函数中即时执行,减少了模板编译的时间。

Render 方法

export const Render = defineComponent({setup() {const handleChange = (v: any) => {};return {handleChange};},render() {return (<div><button onClick={this.handleChange}>Test</button></div>);}
});

底层实现

  • 分离逻辑和渲染:setup 函数用于定义逻辑,render 函数用于定义渲染。
  • 更清晰的结构:逻辑和渲染分开,使代码结构更清晰,易于理解和维护。
  • 组件实例化:返回的对象作为组件实例的一部分,render 函数会访问实例属性。

性能开销

  • 渲染函数:render 函数在每次重新渲染时执行,性能开销与 setup 方法相似。
  • 预编译:与 setup 方法相比,render 函数可以被 Vue 编译器预编译,可能提高性能。

单文件组件(SFC)

<script setup lang="ts" name="SFC">
const handleChange = (v: any) => {};
</script><template><button @click="handleChange"></button>
</template>

底层实现

  • 模板编译:Vue 会将模板编译为渲染函数,这一过程在构建时完成。
  • 组合式 API:使用

性能开销

  • 编译优化:模板在构建时被编译为高效的渲染函数,减少了运行时的性能开销。
  • 更少的即时开销:由于大部分工作在编译时完成,运行时的开销较小。
  • 静态分析:编译时可以进行静态分析和优化,进一步提高性能。

优劣对比

开发体验:

  • Setup 方法:逻辑集中,适合小型组件,但渲染函数的即时执行可能不适合复杂的模板。
  • Render 方法:逻辑和渲染分离,结构清晰,但可能需要更多的代码。
  • SFC:模块化管理,开发体验最佳,尤其适合大型项目和团队合作。

性能:

  • Setup 和 Render 方法:性能开销相似,主要在于渲染函数的即时执行。
  • SFC:编译时优化,运行时性能最佳。

类型支持:

  • Setup 和 Render 方法:组合式 API 提供更好的类型推断。
  • SFC:结合

Setup 方法 Render 方法 SFC 那个 性能最好

在 Vue 3 中,性能表现最好的通常是单文件组件(SFC)。这是因为 SFC 利用了 Vue 的编译器优化,能够在构建时进行静态分析和预编译,从而减少运行时的开销。下面是详细的性能分析:

Setup 方法

export const Setup = defineComponent({setup() {const handleChange = (v: any) => {};return () => {return (<div><button onClick={handleChange}>Test</button></div>);};}
});

性能

  • 渲染函数即时执行:每次组件重新渲染时,返回的渲染函数会被执行。对于复杂的模板,这可能带来一定的性能开销。
  • 缺少静态优化:由于渲染函数在运行时创建,Vue 无法在编译时对其进行静态优化。

Render 方法

export const Render = defineComponent({setup() {const handleChange = (v: any) => {};return {handleChange};},render() {return (<div><button onClick={this.handleChange}>Test</button></div>);}
});

性能

  • 渲染函数即时执行:与 Setup 方法相似,render 函数在每次重新渲染时都会执行,带来一定的性能开销。
  • 预编译:与 Setup 方法不同,Vue 可以对 render 函数进行一定程度的优化,但仍然没有模板编译的优化程度高。

单文件组件(SFC)

<script setup lang="ts" name="SFC">
const handleChange = (v: any) => {};
</script><template><button @click="handleChange"></button>
</template>

性能

  • 模板编译:Vue 在构建时会将模板编译为高效的渲染函数。这一过程在构建时完成,减少了运行时的性能开销。
  • 静态优化:编译时可以进行静态分析和优化,包括静态节点提升、事件绑定优化等,从而进一步提高性能。
  • 更少的即时开销:由于大部分工作在编译时完成,运行时的性能开销较小。

性能比较

  • SFC:最优性能,因为模板在构建时被编译和优化,运行时性能开销最小。
  • Render 方法:次优性能,虽然有一定的预编译优化,但仍然需要在运行时执行渲染函数。
  • Setup 方法:性能最差,渲染函数在运行时创建和执行,缺少编译时优化。
    综上所述,单文件组件(SFC)在性能上表现最佳。它在构建时进行编译和优化,减少了运行时的开销,非常适合性能敏感的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/44353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AD确定板子形状

方法1 修改栅格步进值&#xff0c;手动绘制 https://cnblogs.com/fqhy/p/13768031.html 方法2 器件摆放确定板子形状 https://blog.csdn.net/Mark_md/article/details/116445961

Java实战:寻找完美数

文章目录 一、何谓完美数二、寻找完美数&#xff08;一&#xff09;编程思路&#xff08;二&#xff09;编写程序&#xff08;三&#xff09;运行程序 三、实战小结 一、何谓完美数 完美数是一种特殊的自然数&#xff0c;它等于其所有正除数&#xff08;不包括其本身&#xff…

百问网全志D1h开发板MIPI屏适配

MIPI屏适配 100ASK-D1-H_DualDisplay-DevKit V11 1. 显示适配 1.1 修改设备树 1.1.1 修改内核设备树 进入目录&#xff1a; cd /home/ubuntu/tina-d1-h/device/config/chips/d1-h/configs/nezha/linux-5.4修改board.dts: &lcd0 {lcd_used <1>;lcd…

类的生命周期详解

第1部分&#xff1a;引言 1.1 面向对象编程简介 面向对象编程&#xff08;OOP&#xff09;是一种编程范式&#xff0c;它使用“对象”来设计软件。对象可以包含数据&#xff08;通常称为属性或字段&#xff09;和代码&#xff08;通常称为方法或函数&#xff09;。OOP的核心概…

Vue 项目中 history 路由模式的使用

在最近帮客户开发的一个项目中&#xff0c;由于项目的特殊性&#xff0c;需要用到 Vue 中的 history路由模式。该模式使用时会涉及到“上传白屏”和“刷新 404 问题”。在帮助客户解决这两个问题的过程中&#xff0c;总结问题的解决方案并记录下来&#xff0c;希望能够保留这篇…

眼外伤险失明辗转成都爱尔眼科就医保视力,患者复查送锦旗!

近日患者王先生到成都爱尔眼科医院进行硅油取出后的二次复查&#xff08;硅油为眼底病手术中一种“填充物”&#xff09;&#xff0c;他激动地为蔡裕主任献上锦旗&#xff0c;感谢医生的救治避免了失明。 意外发生在半年之前&#xff0c;王先生不慎滑倒右眼磕碰到茶几边缘&…

【前端从入门到精通:第九课:CSS3新增属性及伸缩盒布局】

弹性盒模型 介绍 伸缩盒模型也叫弹性盒模型&#xff0c;或flex。它决定一个盒子在其它盒子中的分布&#xff0c;以及如何处理可用的空间。使用该模型&#xff0c;可以轻松的创建“自适应”浏览器窗口的流动布局。 flexbox是一个很新的东西&#xff0c;在w3c希望可以使用flexbo…

力扣1472.设计浏览器历史记录

力扣1472.设计浏览器历史记录 用双指针记录历史记录 以及栈顶高度移动时会直接把之前的记录消掉 class BrowserHistory {int pos-1;int top0;string history[5010];public:BrowserHistory(string homepage) {visit(homepage);}void visit(string url) {pos ;top pos;histor…

[激光原理与应用-103]:配电箱的柜门与柜体为啥要接一根导线?

目录 一、概述 1.1、电气安全 1.2、减少电磁干扰 1.3、方便维修和更换 1.4、其他因素 一、铰链的材质 二、铰链的设计 三、结论 二、正确连接铜线的步骤 1、选择正确的铜线 2、清洁连接处 3、正确连接 4、检查连接是否牢固 参考&#xff1a; 一、概述 配电机柜上…

探索AI艺术的无限可能:SD模型与大模型的融合之美

艺术与科技的结合从未像今天这样紧密。AI绘画技术正以惊人的速度改变着我们创作和欣赏艺术的方式。在这场革命中&#xff0c;Stable Diffusion&#xff08;SD&#xff09;模型扮演了至关重要的角色。 &#x1f31f; SD模型&#xff1a;艺术创作的新维度 SD模型以其生成高质量图…

力扣682.棒球比赛

力扣682.棒球比赛 数组模拟栈记录分数 class Solution {public:int calPoints(vector<string>& ops) {int res0;vector<int> points;for(auto &op:ops){int n points.size();char c op[0];if(c ){res points[n-1] points[n-2];points.push_back(po…

在数据库设计中,选择自增 ID 还是 GUID?这篇文章讲清楚

在数据库设计中&#xff0c;选择自增 ID 还是 GUID 取决于具体的应用场景和需求。 自增 ID 的优点&#xff1a; 性能较好&#xff1a;在插入数据时&#xff0c;自增 ID 的生成速度通常较快&#xff0c;因为数据库可以高效地顺序分配新的 ID 值。存储空间小&#xff1a;通常只…

1.9-改进的CBOW模型的实现

文章目录 0引言1 CBOW模型的重构1.1模型初始化1.2模型的前向计算1.3模型的反向传播 2总结 0引言 前面讲述了对word2vec高速化的改进&#xff1a; 改进输入侧的计算&#xff0c;变成Embedding&#xff0c;即从权重矩阵中选取特定的行&#xff1b;改进输出侧的计算&#xff0c;包…

Perl中的文件系统守卫:实现自定义访问控制

&#x1f6e1;️ Perl中的文件系统守卫&#xff1a;实现自定义访问控制 在系统编程中&#xff0c;文件系统访问控制是确保数据安全和完整性的关键机制。Perl作为一种功能强大的脚本语言&#xff0c;提供了丰富的接口来实现自定义的文件系统访问控制。本文将深入探讨如何在Perl…

【C语言】【排序算法】----- 归并排序

由于最近要考试&#xff0c;好久没有发博客了&#xff0c;非常抱歉大家对我的支持。之后我会不断更新博客&#xff0c;继续创作出高质量的文章&#xff0c;希望能帮到大家&#xff01; 文章目录 一、归并排序基本思想二、递归实现三、非递归实现四、效率分析 一、归并排序基本…

Foxit Reader:高效、安全、多功能的PDF阅读器技术解析

引言 在当今数字化时代&#xff0c;PDF&#xff08;Portable Document Format&#xff09;文档已成为工作、学习和生活中不可或缺的一部分。作为处理PDF文件的重要工具&#xff0c;PDF阅读器的选择显得尤为关键。今天&#xff0c;我们将深入探讨一款备受推崇的PDF阅读器——Fo…

KDP数据分析实战:从0到1完成数据实时采集处理到可视化

智领云自主研发的开源轻量级Kubernetes数据平台&#xff0c;即Kubernetes Data Platform (简称KDP)&#xff0c;能够为用户提供在Kubernetes上的一站式云原生数据集成与开发平台。在最新的v1.1.0版本中&#xff0c;用户可借助 KDP 平台上开箱即用的 Airflow、AirByte、Flink、K…

MySQL数据库中利用定时作业去杀死长时查询以防止数据库死锁风险

MySQL数据库中没有SQLServer数据库中那种传统的定时作业的概念。但是提供了一种【事件】的东西&#xff0c;基本和定时作业貌离神合。 下面我们在MySQL中创建一个事件&#xff0c;它的作用是去监测时间很长的异常查询&#xff0c;并且去主动杀掉该线程以防止数据库发生死锁的风…

探索Perl的自动清洁工:垃圾收集机制全解析

&#x1f9f9; 探索Perl的自动清洁工&#xff1a;垃圾收集机制全解析 Perl是一种高级编程语言&#xff0c;以其强大的文本处理能力而闻名。在Perl中&#xff0c;内存管理对于开发高效且稳定的应用程序至关重要。Perl提供了自动垃圾收集机制&#xff0c;帮助开发者管理内存&…

关于原型和原型链的学习和实践

在前端面试中&#xff0c;原型和原型链始终是一个避不开的问题&#xff0c;今天就弄明白! 原型和原型链 对象的创建方式工厂模式构造函数模式原型模式 原型和原型链实践 对象的创建方式 原型和原型链都是关于对象的内容&#xff0c;先来看一下JavaScript中对象的构建方式。 工…