<script setup> 語法糖

下面,我們來系統的梳理關于 Vue 3 <script setup> 語法糖 的基本知識點:


一、<script setup> 核心概念

1.1 什么是 <script setup>

<script setup> 是 Vue 3 中 Composition API 的編譯時語法糖,它通過簡化組件聲明方式,顯著減少樣板代碼,提供更符合直覺的開發體驗。

1.2 設計目標與優勢

目標實現方式優勢
減少樣板代碼自動暴露頂層綁定代碼更簡潔
提升開發體驗更自然的響應式寫法開發更高效
更好的類型支持原生 TypeScript 集成類型安全
編譯時優化編譯階段處理運行時更高效
邏輯組織組合式 API 原生支持關注點分離

1.3 與傳統語法對比

<!-- 選項式 API -->
<script>
export default {props: ['message'],data() {return { count: 0 }},methods: {increment() {this.count++}}
}
</script><!-- Composition API 標準 -->
<script>
import { ref } from 'vue'export default {props: ['message'],setup(props) {const count = ref(0)function increment() {count.value++}return { count, increment }}
}
</script><!-- <script setup> 語法糖 -->
<script setup>
import { ref } from 'vue'const props = defineProps(['message'])
const count = ref(0)function increment() {count.value++
}
</script>

二、核心語法與特性

2.1 基本結構

<script setup>
// 所有頂層綁定都自動暴露給模板
import { ref } from 'vue'// 響應式狀態
const count = ref(0)// 函數
function increment() {count.value++
}// 表達式
const double = computed(() => count.value * 2)
</script><template><button @click="increment">{{ count }} ({{ double }})</button>
</template>

2.2 編譯器轉換原理

輸入:

<script setup>
const msg = 'Hello!'
</script>

輸出:

<script>
export default {setup() {const msg = 'Hello!'return { msg } // 自動暴露所有頂層綁定}
}
</script>

2.3 自動暴露規則

  • 所有 import 導入
  • 頂層變量聲明 (const, let, var)
  • 頂層函數聲明
  • 頂層 classinterface (TypeScript)

三、組件與指令使用

3.1 組件使用

<script setup>
// 1. 導入組件
import MyComponent from './MyComponent.vue'// 2. 自動注冊,無需components選項
</script><template><!-- 3. 直接在模板中使用 --><MyComponent />
</template>

3.2 動態組件

<script setup>
import { shallowRef } from 'vue'
import Home from './Home.vue'
import About from './About.vue'const currentComponent = shallowRef(Home)
</script><template><component :is="currentComponent" />
</template>

3.3 自定義指令

<script setup>
// 命名規范:vNameOfDirective
const vFocus = {mounted: el => el.focus()
}
</script><template><input v-focus />
</template>

四、Props與Emit處理

4.1 聲明Props

<script setup>
// 選項式聲明
const props = defineProps({title: String,count: {type: Number,required: true}
})// TypeScript接口聲明
interface Props {title?: stringcount: number
}const props = defineProps<Props>()
</script>

4.2 聲明Emit事件

<script setup>
// 數組形式
const emit = defineEmits(['update', 'delete'])// 對象形式(帶驗證)
const emit = defineEmits({update: (payload: { id: number }) => {return !!payload.id // 返回布爾值表示驗證結果}
})// TypeScript類型聲明
const emit = defineEmits<{(e: 'update', payload: { id: number }): void(e: 'delete', id: number): void
}>()

4.3 使用示例

<script setup>
const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])function handleInput(e) {emit('update:modelValue', e.target.value)
}
</script><template><input :value="modelValue"@input="handleInput"/>
</template>

五、響應式與生命周期

5.1 響應式狀態管理

<script setup>
import { ref, reactive, computed } from 'vue'// 基本類型
const count = ref(0)// 對象類型
const state = reactive({items: [],loading: false
})// 計算屬性
const total = computed(() => state.items.length)// 偵聽器
watch(count, (newVal, oldVal) => {console.log(`Count changed: ${oldVal} → ${newVal}`)
})
</script>

5.2 生命周期鉤子

<script setup>
import { onMounted, onUnmounted } from 'vue'onMounted(() => {console.log('Component mounted')fetchData()
})onUnmounted(() => {console.log('Component unmounted')cleanup()
})
</script>

六、高級特性與模式

6.1 頂層await

<script setup>
const user = ref(null)
const posts = ref([])// 直接使用await - 自動編譯為async setup()
const userData = await fetchUser()
user.value = userData// 結合watchEffect
watchEffect(async () => {if (user.value) {posts.value = await fetchPosts(user.value.id)}
})
</script>

6.2 使用插槽與上下文

<script setup>
import { useSlots, useAttrs } from 'vue'const slots = useSlots()
const attrs = useAttrs()// 訪問默認插槽內容
const defaultSlotContent = slots.default?.()
</script>

6.3 暴露組件實例

<script setup>
import { ref } from 'vue'const inputRef = ref(null)// 暴露公共方法
function focusInput() {inputRef.value.focus()
}// 顯式暴露
defineExpose({focusInput
})
</script><template><input ref="inputRef">
</template>

七、TypeScript集成

7.1 類型安全Props

<script setup lang="ts">
interface Props {title: stringcount?: numberitems?: string[]
}const props = defineProps<Props>()
</script>

7.2 泛型組件

<script setup lang="ts" generic="T">
import { ref } from 'vue'const items = ref<T[]>([])
const selected = ref<T>()function addItem(item: T) {items.value.push(item)
}
</script>

7.3 類型標注Ref

<script setup lang="ts">
import { ref } from 'vue'interface User {id: numbername: string
}// 顯式類型標注
const user = ref<User | null>(null)// 初始化時推斷
const count = ref(0) // Ref<number>
</script>

八、最佳實踐與組織模式

8.1 代碼組織建議

<script setup>
// ----------------------------
// 1. 導入部分
// ----------------------------
import { ref, onMounted } from 'vue'
import MyComponent from './MyComponent.vue'// ----------------------------
// 2. 定義Props/Emits
// ----------------------------
const props = defineProps({ /* ... */ })
const emit = defineEmits({ /* ... */ })// ----------------------------
// 3. 響應式狀態
// ----------------------------
const count = ref(0)
const state = reactive({ /* ... */ })// ----------------------------
// 4. 計算屬性和偵聽器
// ----------------------------
const double = computed(() => count.value * 2)
watch(count, (val) => { /* ... */ })// ----------------------------
// 5. 函數聲明
// ----------------------------
function increment() { count.value++ }// ----------------------------
// 6. 生命周期鉤子
// ----------------------------
onMounted(() => { /* ... */ })// ----------------------------
// 7. 暴露API
// ----------------------------
defineExpose({ increment })
</script>

8.2 邏輯復用模式

<script setup>
// 使用自定義Hook
import { useCounter } from '@/composables/useCounter'const { count, increment } = useCounter(10)
</script>

8.3 性能優化

<script setup>
// 1. 使用shallowRef減少大型對象的響應式開銷
const bigData = shallowRef(largeDataset)// 2. 使用markRaw避免不必要的響應式轉換
const staticConfig = markRaw({ /* 大型配置對象 */ })// 3. 合理使用computed緩存計算結果
const filteredList = computed(() => bigData.value.filter(item => item.active)
)
</script>

九、常見問題與解決方案

9.1 響應式丟失問題

問題:解構Props導致響應式丟失

<script setup>
const { title } = defineProps(['title']) // 失去響應性
</script>

解決方案

<script setup>
const props = defineProps(['title'])
// 使用toRefs解構
const { title } = toRefs(props)
</script>

9.2 命名沖突問題

問題:導入組件與局部變量同名

<script setup>
import Button from './Button.vue'
const Button = ref(null) // 命名沖突
</script>

解決方案

<script setup>
import Button as BaseButton from './Button.vue'
const Button = ref(null) // 避免沖突
</script>

9.3 訪問上下文問題

問題:無法直接訪問 this

<script setup>
// 錯誤:this未定義
const router = this.$router
</script>

解決方案

<script setup>
import { useRouter } from 'vue-router'const router = useRouter() // 使用Composition API
</script>

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

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

相關文章

MYSQL-InnoDB邏輯存儲結構 詳解

InnoDB邏輯存儲結構 段—區—頁—行 表空間&#xff1a; 默認情況下InnoDB有一個共享表空間ibdata1&#xff0c;所有數據放入這個表空間&#xff0c;如果開啟了innodb_file_per_table&#xff08;默認ON&#xff09;&#xff0c;每張表都可以放到一個單獨的表空間&#xff0…

[特殊字符] Python 批量合并 Word 表格中重復單元格教程(收貨記錄案例實戰)

在日常辦公中&#xff0c;Word 表格中常出現重復的“供應商名稱”或“物料編碼”&#xff0c;會導致表格冗余且視覺混亂。這時候&#xff0c;用 Python 自動合并重復單元格可以大幅提升表格專業度和可讀性。本篇給大家演示如何用 python-docx 實現該功能。 ? 功能概覽 自動讀取…

從零構建Node.js服務托管前端項目

下面是一個完整的指南&#xff0c;教你如何從零開始構建一個Node.js服務來托管前端項目&#xff0c;并代理API請求到其他服務器。 1. 項目初始化 # 創建項目目錄 mkdir node-proxy-server cd node-proxy-server# 初始化npm項目 npm init -y# 安裝必要依賴 npm install expres…

Lynx vs React Native vs Flutter 全面對比:三大跨端框架實測分析

一文看懂三大熱門跨端技術的歷史淵源、架構機制、開發體驗、包體積對比與性能評估。 我陪你用實測數據帶你理性選型&#xff0c;不踩坑&#xff0c;不盲信。 1. 框架簡介&#xff1a;它們是誰&#xff1f;來自哪里&#xff1f;干嘛用&#xff1f; 框架名稱所屬公司發布時間初衷…

CKESC的ROCK 180A-H 無人機電調:100V 高壓冗余設計與安全保護解析

一、核心技術參數與性能指標 電壓范圍&#xff1a;支持 12~26S 鋰電&#xff08;適配 110V 高壓系統&#xff09;電流特性&#xff1a; 持續工作電流&#xff1a;90A&#xff08;特定散熱條件&#xff09;瞬時耐流&#xff08;1 秒&#xff09;&#xff1a;220A&#xff0c;3 …

優化 ArcPy 腳本性能

使用并行處理 如果硬件條件允許&#xff0c;可以使用 Python 的并行處理模塊&#xff08;如 multiprocessing&#xff09;來同時處理多個小任務。這樣可以充分利用多核處理器的優勢&#xff0c;提高腳本的執行效率。 import multiprocessing def process_raster(raster):arcpy…

Windows下CMake通過鴻蒙SDK交叉編譯三方庫

前言 華為鴻蒙官方的文章CMake構建工程配置HarmonyOS編譯工具鏈 中介紹了在Linux平臺下如何使用CMake來配置鴻蒙的交叉編譯環境&#xff0c;編譯輸出在Harmony中使用的第三方so庫以及測試demo。 本文主要是在Windows下實現同樣的操作。由于平臺差異的原因&#xff0c;有些細節…

從C學C++(6)——構造函數和析構函數

從C學C(6)——構造函數和析構函數 若無特殊說明&#xff0c;本博客所執行的C標準均為C11. 構造函數與析構函數 構造函數定義 構造函數是特殊的成員函數&#xff0c;當創建類類型的新對象&#xff0c;系統自動會調用構造函數構造函數是為了保證對象的每個數據成員都被正確初…

清理 Windows C 盤該注意什么

C 盤空間不足會嚴重影響系統性能。 清理 C 盤文件時&#xff0c;首要原則是安全。錯誤地刪除系統文件會導致 Windows 無法啟動。下面我將按照 從最安全、最推薦到需要謹慎操作的順序&#xff0c;為你詳細列出可以清理的文件和文件夾&#xff0c;并提供操作方法。 第一梯隊&…

Python Selenium 滾動到特定元素

文章目錄 Python Selenium 滾動到特定元素?? **1. 使用 scrollIntoView() 方法&#xff08;最推薦&#xff09;**&#x1f5b1;? **2. 結合 ActionChains 移動鼠標&#xff08;模擬用戶行為&#xff09;**&#x1f9e9; **3. 使用坐標計算滾動&#xff08;精確控制像素&…

你寫的 Express 接口 404,可能是被“動態路由”吃掉了

本文首發在我的個人博客&#xff1a;你寫的 Express 接口 404&#xff0c;可能是被“動態路由”吃掉了 前情提要 最近參與公司的一個項目前端 React&#xff0c;后端用的 Express。目前我就做一些功能的新增或者修改。 對于 Express &#xff0c;本人沒有公司項目實戰經驗&…

【Java面試】你是怎么控制緩存的更新?

&#x1f504; 一、數據實時同步失效&#xff08;強一致性&#xff09; 原理&#xff1a;數據庫變更后立即失效或更新緩存&#xff0c;保證數據強一致。 實現方式&#xff1a; Cache Aside&#xff08;旁路緩存&#xff09;&#xff1a; 讀流程&#xff1a;讀緩存 → 未命中則…

react-嵌套路由 二級路由

什么是嵌套路由&#xff1f; 在一級路由中又內嵌了其他路由&#xff0c;這種關系就叫做嵌套路由&#xff0c;嵌套至一級路由內的路由又稱作二級路由 嵌套路由配置 實現步驟 配置二級路由 children嵌套 import Login from "../page/Login/index"; import Home from …

【CMake基礎入門教程】第八課:構建并導出可復用的 CMake 庫(支持 find_package() 查找)

很好&#xff01;我們進入 第八課&#xff1a;構建并導出可復用的 CMake 庫&#xff08;支持 find_package() 查找&#xff09;。 &#x1f3af; 本課目標 你將掌握&#xff1a; 如何構建一個庫并通過 install() 導出其配置&#xff1b; 如何讓別人在項目中使用 find_package…

Jenkins與Kubernetes深度整合實踐

采用的非jenkins-slave方式 jenkins配置&#xff1a; Jenkins添加k8s master節點的服務器信息 在Jenkins容器內部與k8s master節點設置免費登錄 # docker過濾查詢出運行的Jenkins服務 $ docker ps | grep jenkins# 進入Jenkins容器內部 $ docker exec -it jenkins-server /bi…

GraphQL API-1

簡介 判斷GraphQL方式 判斷一個網站是否使用了GraphQL API&#xff0c;可以通過以下幾種方法&#xff1a; 1. 檢查網絡請求 查看請求端點 GraphQL 通常使用單一端點&#xff0c;常見路徑如&#xff1a; /graphql/api/graphql/gql/query 觀察請求特征 POST 請求為主&…

推薦C++題目練習網站

LeetCode LeetCode是一個全球知名的編程練習平臺&#xff0c;提供大量C題目&#xff0c;涵蓋數據結構、算法、系統設計等。題目難度從簡單到困難&#xff0c;適合不同水平的學習者。平臺支持在線編寫代碼并即時運行測試&#xff0c;提供詳細的題目討論區和官方解答。 Codeforc…

Spring Cloud 微服務(服務注冊與發現原理深度解析)

&#x1f4cc; 摘要 在微服務架構中&#xff0c;服務注冊與發現是整個系統運行的基礎核心模塊。它決定了服務如何被定位、調用和管理。 本文將深入講解 Spring Cloud 中 Eureka 的服務注冊與發現機制&#xff0c;從底層原理到源碼分析&#xff0c;再到實際開發中的最佳實踐&a…

【Linux 設備模型框架 kobject 和 kset】

Linux 設備模型框架 kobject 和 kset 一、Linux 設備模型概述二、kobject 與 kset 的核心概念1. kobject2. kset3. 關鍵數據結構 三、kobject 與 kset 的實現源碼四、源碼解析與使用說明1. kset 的創建與初始化2. kobject 的創建與屬性3. sysfs 屬性操作4. 用戶空間訪問示例 五…

一起學前端之HTML------(1)HTML 介紹

HTML 介紹 HTML 即超文本標記語言&#xff08;HyperText Markup Language&#xff09;&#xff0c;它是構成網頁的基礎技術之一。HTML 借助各種標簽&#xff08;Tag&#xff09;對網頁的結構與內容加以描述。下面為你介紹其核心要點&#xff1a; 關鍵特性 標簽結構&#xff…