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.pswp.cn/diannao/44353.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44353.shtml
英文地址,請注明出處:http://en.pswp.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中對象的構建方式。 工…