【Vue3】淺談setup語法糖

Vue3 的 setup 語法糖是通過 <script setup> 標簽啟用的特性,它是對 Composition API 的進一步封裝,旨在簡化組件的聲明式寫法,同時保留 Composition API 的邏輯組織能力。以下是其核心概念和原理分析:


一、<script setup> 是什么?

  1. 語法糖本質
    它是 Vue3 編譯器在編譯階段對組件邏輯的語法轉換工具。開發者用更簡潔的語法編寫邏輯,最終會被編譯成標準 setup() 函數的返回形式。

  2. 主要特性

    • 自動暴露頂層變量(無需 return
    • 直接使用 await(自動生成異步包裝)
    • 組件/指令自動注冊(無需 components 選項)
    • 支持 TypeScript 類型推導(如 defineProps

二、語法糖的編譯原理

以下是一個代碼轉換示例,展示 <script setup> 如何被編譯為傳統寫法:

原始代碼(語法糖):
<script setup>
import { ref } from 'vue'
import MyComponent from './MyComponent.vue'const count = ref(0)
const increment = () => count.value++
</script>
編譯后代碼:
export default {setup() {const count = ref(0)const increment = () => count.value++// 自動返回所有頂層變量return {count,increment,MyComponent // 自動注冊組件}},components: {MyComponent // 編譯器自動處理組件注冊}
}

三、關鍵技術實現

  1. 編譯階段轉換
    Vue 編譯器(如 @vue/compiler-sfc)會在構建時:

    • 提取 <script setup> 中的頂層變量
    • 自動生成 return 語句暴露這些變量
    • import 的組件轉換為 components 選項
  2. 響應式綁定
    refreactive 變量會被編譯器識別,生成對應的 Proxy 響應式代碼。

  3. 宏函數處理
    definePropsdefineEmits 是編譯時的特殊宏,編譯器會將其轉換為標準的 props/emits 聲明:

    <script setup>
    const props = defineProps({ msg: String })
    const emit = defineEmits(['submit'])
    </script>
    

    編譯為:

    export default {props: { msg: String },emits: ['submit'],setup(props, { emit }) {// ...}
    }
    

    需要注意的是,Vue從3.5版本開始,已經支持響應式解構Props,也就是當在同一個 script setup 塊中的代碼訪問從 defineProps 解構出的變量時,Vue 的編譯器會自動在前面添加 props.

    const { foo } = defineProps(['foo'])watchEffect(() => {// 在 3.5 之前僅運行一次// 在 3.5+ 版本中會在 "foo" prop 改變時重新運行console.log(foo)})
    

    編譯為:

    const props = defineProps(['foo'])watchEffect(() => {// `foo` 由編譯器轉換為 `props.foo`console.log(props.foo)})
    

四、優勢與適用場景

特性傳統 setup 函數<script setup>
代碼量需顯式 return自動暴露頂層變量
組件注冊需在 components 聲明自動注冊導入的組件
異步邏輯需手動包裝異步上下文直接使用 await
TypeScript 支持需類型斷言自動推導 props/emit 類型

適用場景:適用于需要清晰邏輯組織的復雜組件,尤其是需要 TypeScript 強類型支持或大量 Composition API 復用的場景。


五、@vue/compiler-sfc核心解析

@vue/compiler-sfc是Vue官方的單文件(SFC)編譯器,負責將.vue文件解析為標準的JavaScript模塊,它的主要任務包括:

  1. 分離<template><script><style> 三大塊
  2. 處理模版編譯為渲染函數
  3. 轉換 <script setup> 語法糖
  4. 處理 CSS 作用域(Scoped CSS)
關鍵功能實現
  • 模板編譯
    將 HTML-like 模板轉換為 虛擬 DOM 渲染函數

    <!-- 輸入 -->
    <template><div @click="count++">{{ count }}</div>
    </template>
    
    // 輸出渲染函數
    import { createElementVNode as _createElementVNode } from "vue"
    export function render(_ctx) {return _createElementVNode("div", { onClick: _ctx.increment }, _toDisplayString(_ctx.count))
    }
    
  • <script setup> 轉換
    將頂層變量自動注入 setup() 返回對象:

    <script setup>
    import { ref } from 'vue'
    const count = ref(0)
    </script>
    
    // 轉換后
    export default {setup() {const count = ref(0)return { count } // 自動注入}
    }
    
  • CSS 作用域處理
    為 Scoped CSS 添加唯一哈希屬性:

    <style scoped>
    .box { color: red; }
    </style>
    
    .box[data-v-5f8d2c] { color: red; }
    
與其他工具協作
  • 與 Vite:通過 @vitejs/plugin-vue 插件集成,實現開發時熱更新
  • 與 Webpack:通過 vue-loader 調用 @vue/compiler-sfc
  • 與 TypeScript:通過 defineProps/defineEmits 實現類型推導
SFC在線演練場

訪問Vue SFC Playground直接輸入 Vue SFC 代碼,右側會實時顯示編譯后的 JavaScript 代碼。

在這里插入圖片描述


六、總結

通過編譯時的智能轉換,<script setup> 在保持邏輯組織能力的同時,大幅減少了樣板代碼,是 Vue3 開發的高效實踐方案。

以上就是對 setup 語法糖的一點點介紹啦^-^

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72382.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72382.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72382.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

物聯網小范圍高精度GPS使用

在園區內實現小范圍高精度GPS&#xff08;全球定位系統&#xff09;定位&#xff0c;通常需要結合多種技術來彌補傳統GPS在精度和覆蓋范圍上的不足。以下是實現小范圍高精度GPS定位的解決方案&#xff0c;包括技術選擇、系統設計和應用場景。 一、技術選擇 在園區內實現高精度…

【前端】前端設計中的響應式設計詳解

文章目錄 前言一、響應式設計的定義與作用二、響應式設計的原則三、響應式設計的實現四、響應式設計的最佳實踐總結 前言 在當今數字化時代&#xff0c;網站和應用程序需要適應各種設備&#xff0c;從桌面電腦到平板電腦和手機。響應式設計應運而生&#xff0c;成為一種可以適…

Rocky Linux 系統安裝 typecho 個人博客系統(Docker 方式)

typecho 博客系統安裝 官網: https://typecho.org/ 1. 安裝 Docker curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo && yum install docker-ce -y && docker -v && systemctl enable --now docker…

pytorch-gpu版本安裝(英偉達gpu驅動安裝)

一、安裝cuda 1?? 檢查是否有 GPU lspci | grep -i nvidia如果沒有輸出&#xff0c;可能你的服務器 沒有 GPU&#xff0c;或者 GPU 未正確識別。 2?? 檢查 NVIDIA 驅動是否安裝 dpkg -l | grep -i nvidia如果沒有相關輸出&#xff0c;說明驅動未安裝&#xff0c;建議安…

華為OD-2024年E卷-分批薩[100分]

文章目錄 題目描述輸入描述輸出描述用例1解題思路Python3源碼 題目描述 吃貨"和"饞嘴"兩人到披薩店點了一份鐵盤&#xff08;圓形&#xff09;披薩&#xff0c;并囑咐店員將披薩按放射狀切成大小相同的偶數個小塊。但是粗心的服務員將披薩切成了每塊大小都完全不…

【計算機網絡入門】初學計算機網絡(六)

目錄 1.回憶數據鏈路層作用 2. 組幀 2.1 四種組幀方法 2.1.1 字符計數法 2.1.2 字節填充法 2.1.3 零比特填充法 2.1.4 違規編碼法 3. 差錯控制 3.1 檢錯編碼 3.1.1 奇偶校驗碼 3.1.2 CRC&#xff08;循環冗余校驗&#xff09;校驗碼 3.2 糾錯編碼 3.2.1 海明校驗碼…

yolo位姿估計實驗

目錄 介紹實驗過程 2.1 數據集下載 2.2 模型和數據配置文件修改 2.3 模型訓練參考鏈接 1. 介紹 1.1 簡介 YOLOv8-Pose是基于YOLOv4算法的姿勢估計模型&#xff0c;旨在實現實時高效的人體姿勢估計。姿勢估計在計算機視覺領域具有重要意義&#xff0c;可廣泛應用于視頻監控、…

極簡Redis速成學習

redis是什么&#xff1f; 是一種以鍵值對形式存儲的數據庫&#xff0c;特點是基于內存存儲&#xff0c;讀寫快&#xff0c;性能高&#xff0c;常用于緩存、消息隊列等應用情境 redis的五種數據類型是什么&#xff1f; 分別是String、Hash、List、Set和Zset&#xff08;操作命…

大語言模型學習--本地部署DeepSeek

本地部署一個DeepSeek大語言模型 研究學習一下。 本地快速部署大模型的一個工具 先根據操作系統版本下載Ollama客戶端 1.Ollama安裝 ollama是一個開源的大型語言模型&#xff08;LLM&#xff09;本地化部署與管理工具&#xff0c;旨在簡化在本地計算機上運行和管理大語言模型…

【OpenCV C++】以時間命名存圖,自動檢查存儲目錄,若不存在自動創建, 按下空格、回車、Q、S自動存圖

文章目錄 // 保存圖像的函數 void saveImage(const cv::Mat& frame) {// 生成唯一文件名auto now = std::chrono::system_clock::

【JavaEE】線程安全

【JavaEE】線程安全 一、引出線程安全二、引發線程安全的原因三、解決線程安全問題3.1 synchronized關鍵字&#xff08;解決修改操作不是原子的&#xff09;3.1.1 synchronized的特性3.1.1 synchronized的使用事例 3.2 volatile 關鍵字&#xff08;解決內存可見性&#xff09; …

Vue核心知識:動態路由實現完整方案

在Vue中實現動態路由&#xff0c;并結合后端接口和數據庫表設計&#xff0c;是一個復雜的項目&#xff0c;需要多個技術棧和步驟的配合。以下將詳細描述整個實現過程&#xff0c;包括數據庫設計、后端接口設計、前端路由配置以及如何實現動態路由的功能。 目錄 一、需求分析二…

自媒體多賬號如何切換不同定位才能做得更好

一、選擇稀缺增長的賽道&#xff0c;避開內卷紅海 1.職場賽道 ● 細分方向&#xff1a;公務員/體制內經驗分享、自由職業指南、遠程辦公技巧。例如&#xff0c;通過采訪自由職業者或分享遠程工作體驗&#xff0c;快速積累精準粉絲。 ● 優勢&#xff1a;職場人群需求明確&…

基于SpringBoot的校園二手交易平臺(源碼+論文+部署教程)

運行環境 校園二手交易平臺運行環境如下&#xff1a; ? 前端&#xff1a;Vue ? 后端&#xff1a;Java ? IDE工具&#xff1a;IntelliJ IDEA&#xff08;可自行更換&#xff09; ? 技術棧&#xff1a;SpringBoot Vue MySQL 主要功能 校園二手交易平臺主要包含前臺和…

iPhone 鏡像 連接錯誤

重置連接 defaults delete com.apple.ScreenContinuity打開 iPhone 鏡像 參考 mac鏡像iPhone無法連接報錯個人經歷的 iPhone 鏡像 bug 與部分解決辦法

Qt基礎入門-詳解

前言 qt之路正式開啟 &#x1f493; 個人主頁&#xff1a;普通young man-CSDN博客 ? 文章專欄&#xff1a;C_普通young man的博客-CSDN博客 ? 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有問題 評論區見&#x1f4dd; &#x1f389;歡迎大家點贊&#x1f44…

Unity 優化封裝常用API和編輯器擴展工具包

資源名&#xff1a;WXTools 文章目錄 MeshRenderEditorSpriteGroupToolWXEditorUtilsComponentUtilsDataUtilsGameObjectUtilsRigidbodyUtilsStringUtilsTransformUtilsVectorUtilsWXTools 內容包括&#xff1a; MeshRenderEditor mesh擴展 SpriteGroupTool SpriteGroup操作…

python學習第三天

條件判斷 條件判斷使用if、elif和else關鍵字。它們用于根據條件執行不同的代碼塊。 # 條件判斷 age 18 if age < 18:print("你還是個孩子&#xff01;") elif age 18:print("永遠十八歲&#xff01;") else:print("你還年輕&#xff01;")…

ThinkPHP使用phpword讀取模板word文件并添加表格

1.安裝phpword包composer require phpoffice/phpword 2.模板文件結構 如上圖框住的是要替換的文本和要復制表格樣式 實現代碼 <?phpnamespace app\api\logic;use PhpOffice\PhpWord\Element\Table; use PhpOffice\PhpWord\SimpleType\TblWidth; use PhpOffice\PhpWord\…

(原創)用python語言基于paddleocr構建批量識別實現紙質和電子的增值稅專用發票程序

文章目錄 1. 說明2. 準備工作3. 代碼3.1 導入庫&#xff1a;3.2 遍歷發票指定處理方式3.3 發票識別相關函數3.4 發票字段定位函數3.6 識別記錄相關函數3.6 識別結果校驗3.7 文件預處理等其他函數3.8 main主函數 1. 說明 1.1 以paddle識別引擎為基礎的增值稅發票識別程序&#…