Vue3 Composition API 深度開發指南

Vue3 Composition API 深度開發指南

在這里插入圖片描述

響應式系統核心解析

1.1 響應式原理解構

Vue3 基于 Proxy 實現響應式追蹤,其核心流程為:

const reactiveHandler = {get(target, key, receiver) {track(target, key) // 依賴收集return Reflect.get(target, key, receiver)},set(target, key, value, receiver) {const result = Reflect.set(target, key, value, receiver)trigger(target, key) // 觸發更新return result}
}function reactive(obj) {return new Proxy(obj, reactiveHandler)
}

關鍵差異

  • ref 通過對象包裝實現基礎類型響應式
  • reactive 直接代理整個對象
  • shallowRef/shallowReactive 實現淺層響應

1.2 響應式工具進階

// 響應式轉換控制
const readonlyUser = readonly(reactive({ name: 'Alice' }))// 解構保持響應性
const { x, y } = toRefs(reactiveMousePosition)// Ref類型自動解包
const count = ref(0)
const double = computed(() => count.value * 2)

組件設計模式深度實踐

2.1 受控組件模式

// 通用表單控制邏輯
export function useFormControl<T>(initialValue: T) {const value = ref<T>(initialValue)const touched = ref(false)const setValue = (newValue: T) => {value.value = newValuetouched.value = true}return {value: readonly(value),isTouched: readonly(touched),setValue}
}// 組件實現
const emailControl = useFormControl<string>('')

2.2 依賴注入模式

// 上下文類型定義
interface EditorContext {content: Ref<string>formatters: Map<string, FormatterFn>
}// 提供者組件
const editorSymbol = Symbol() as InjectionKey<EditorContext>provide(editorSymbol, {content: ref(''),formatters: new Map([['bold', text => `**${text}**`]])
})// 消費者組件
const { formatters } = inject(editorSymbol)!

Composition API 高級模式

3.1 異步狀態機

type AsyncState<T> = {data: T | nullerror: Error | nullstatus: 'idle' | 'pending' | 'success' | 'error'
}export function useAsyncTask<T>(task: () => Promise<T>) {const state = reactive<AsyncState<T>>({data: null,error: null,status: 'idle'})const execute = async () => {state.status = 'pending'try {state.data = await task()state.status = 'success'} catch (err) {state.error = err as Errorstate.status = 'error'}}return { state, execute }
}// 使用示例
const { state, execute } = useAsyncTask(fetchUserList)

3.2 響應式存儲模式

class ReactiveStore<T extends object> {private state: Tprivate proxy: Tconstructor(initialState: T) {this.state = initialStatethis.proxy = reactive(initialState) as T}getState(): Readonly<T> {return readonly(this.proxy)}mutate(mutation: (state: T) => void) {mutation(this.proxy)}
}// 創建Store實例
const userStore = new ReactiveStore({id: 0,profile: { name: '' }
})// 組件中使用
const { id } = userStore.getState()

性能優化策略

4.1 計算屬性緩存策略

const heavyList = ref<Item[]>(/* 大數據集 */)// 帶緩存的篩選計算
const filteredList = computed(() => {return heavyList.value.filter(item => item.category === 'active' && item.value > 1000)
})// 計算屬性調試
const debugComputed = computed({get() { /* 原邏輯 */ },set() { /* 開發環境調試鉤子 */ }
})

4.2 虛擬滾動優化

// 虛擬滾動Composable
export function useVirtualScroll(options: {containerRef: Ref<HTMLElement | null>itemHeight: numbertotalItems: number
}) {const scrollTop = ref(0)const visibleCount = computed(() => Math.ceil(options.containerRef.value!.clientHeight / options.itemHeight))const startIndex = computed(() =>Math.floor(scrollTop.value / options.itemHeight))const endIndex = computed(() =>Math.min(startIndex.value + visibleCount.value + 2, options.totalItems))return { scrollTop, startIndex, endIndex }
}

類型系統深度集成

5.1 復雜類型推導

// 類型安全的provide/inject
const LOCALE_KEY = Symbol() as InjectionKey<{lang: Ref<string>setLang: (lang: string) => void
}>// Props類型增強
interface ModalProps {modelValue: booleantitle?: stringtransition?: 'fade' | 'slide'
}const props = defineProps<ModalProps>()// Emits類型約束
const emit = defineEmits<{(e: 'update:modelValue', value: boolean): void(e: 'confirm', payload: { timestamp: number }): void
}>()

5.2 泛型Composable

interface PaginationOptions<T> {initialPage: numberpageSize: numberfetcher: (page: number) => Promise<T[]>
}export function usePagination<T>(options: PaginationOptions<T>) {const currentPage = ref(options.initialPage)const list = ref<T[]>([]) as Ref<T[]>const loadPage = async () => {list.value = await options.fetcher(currentPage.value)}return {currentPage,list,loadPage}
}// 使用示例
const { list, loadPage } = usePagination<User>({initialPage: 1,pageSize: 20,fetcher: fetchUsers
})

工程化實踐

6.1 自定義指令開發

// 權限控制指令
const vPermission = {mounted(el: HTMLElement, binding: DirectiveBinding<string[]>) {const userPermissions = useAuthStore().permissionsif (!binding.value.some(perm => userPermissions.includes(perm))) {el.parentNode?.removeChild(el)}}
}// 使用方式
<button v-permission="['admin', 'editor']">刪除</button>

6.2 單元測試策略

// 測試Composable
import { useCounter } from './counter'
import { renderHook } from '@testing-library/vue'test('counter logic', async () => {const { result } = renderHook(() => useCounter(10))expect(result.current.count.value).toBe(10)await result.current.increment()expect(result.current.count.value).toBe(11)await result.current.reset()expect(result.current.count.value).toBe(10)
})

響應式調試技巧

7.1 依賴追蹤可視化

// 調試watch效果
const stop = watchEffect((onCleanup) => {console.log('依賴變化:', effectScope.activeEffect?.deps)onCleanup(() => {console.log('清理副作用')})
})// Chrome DevTools + Vue DevTools 組合調試

7.2 響應式樹分析

import { DebuggerEvent, debug } from 'vue'debug({onTrack(e: DebuggerEvent) {if (e.target === store) {console.log('Store被追蹤:', e)}},onTrigger(e: DebuggerEvent) {console.log('響應式觸發:', e)}
})

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

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

相關文章

基于自回歸模型的酒店評論生成

《DeepSeek大模型高性能核心技術與多模態融合開發&#xff08;人工智能技術叢書&#xff09;》(王曉華)【摘要 書評 試讀】- 京東圖書 我們使用新架構的模型完成情感分類&#xff0c;可以看到&#xff0c;使用注意力機制可以很好地對特征進行抽取從而完成二分類的情感分類任務…

關于轉置卷積

&#x1f9e0; 具體講解神經網絡中的轉置卷積&#xff08;Transposed Convolution&#xff09; &#x1f9ed; 1. 轉置卷積的動機&#xff1a;為什么我們需要它&#xff1f; 標準卷積通常會降低特征圖的空間尺寸&#xff08;比如從 64x64 → 32x32&#xff09;&#xff0c;這對…

JavaScript 模塊化詳解( CommonJS、AMD、CMD、ES6模塊化)

一.CommonJS 1.概念 CommonJS 規范概述了同步聲明依賴的模塊定義。這個規范主要用于在服務器端實現模塊化代碼組 織&#xff0c;但也可用于定義在瀏覽器中使用的模塊依賴。CommonJS 模塊語法不能在瀏覽器中直接運行&#xff1b;在瀏覽器端&#xff0c;模塊需要提前編譯打包處理…

TCP BBR 的優化

前段時間&#xff0c;老板發了篇資料&#xff0c;下面是我學習的相關記錄整理。 https://aws.amazon.com/cn/blogs/china/talking-about-network-optimization-from-the-flow-control-algorithm/ PS&#xff1a;ubuntu24默認使用的tcp控制算法。還是 cubic sysctl net.ipv4.tc…

什么是異步?

什么是異步&#xff1f; 異步是一個術語&#xff0c;用于描述不需要同時行動或協調就能獨立運行的流程。這一概念在技術和計算領域尤為重要&#xff0c;它允許系統的不同部分按自己的節奏運行&#xff0c;而無需等待同步信號或事件。在區塊鏈技術中&#xff0c;異步是指網絡中…

SSM婚紗攝影網的設計

&#x1f345;點贊收藏關注 → 添加文檔最下方聯系方式咨詢本源代碼、數據庫&#x1f345; 本人在Java畢業設計領域有多年的經驗&#xff0c;陸續會更新更多優質的Java實戰項目希望你能有所收獲&#xff0c;少走一些彎路。&#x1f345;關注我不迷路&#x1f345; 項目視頻 SS…

石頭剪刀布游戲

自己寫的一個石頭剪刀布游戲&#xff0c;如果有需要更改的地方請指出 #define _CRT_SECURE_NO_WARNINGS // scanf_s編寫起來太過于麻煩&#xff0c;直接把這個警告關掉&#xff0c;便于編寫。 #include <stdio.h> #include <stdlib.h> #include <time.h> //…

大數據系列之:Kerberos

大數據系列之&#xff1a;Kerberos 基本概念工作流程安全特性應用場景總結加密原理Kerberos認證流程更改您的密碼授予賬戶訪問權限票證管理Kerberos 票據屬性使用 kinit 獲取票據使用 klist 查看票據使用 kdestroy 銷毀票據.k5identity 文件描述 Kerberos 是一種網絡認證協議&a…

WPF 免費UI 控件HandyControl

示例效果和代碼 直接可以用 Button 按鈕 | HandyOrg 1.安裝 , 輸入 HandyControl 2.<!--配置HandyControl--> <!--配置HandyControl--> <ResourceDictionary Source"pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml"/> …

windows部署docker

1.下載docker 打開瀏覽器&#xff0c;訪問 Docker Desktop 下載頁面。 2.安裝 Docker Desktop 運行安裝程序&#xff1a; 雙擊下載的 Docker Desktop 安裝包&#xff0c;啟動安裝程序。 選擇安裝選項&#xff1a; 按照屏幕上的指示進行操作。建議選擇默認選項&#xff0c;包…

【Linux】遠程登錄時,使用圖形界面報錯:MoTTY X11 proxy: Unsupported authorisation protocol

1、問題描述 使用 MobaXterm 遠程登錄Ubuntu后,使用sudo權限運行圖形界面程序報錯: MoTTY X11 proxy: Unsupported authorisation protocol (gpartedbin:10518): Gtk-WARNING **: 22:01:34.377: cannot open display: localhost:10.02、查看SSH配置 修改 SSH 服務端配置,…

解決 Hugging Face SentenceTransformer 下載失敗的完整指南:ProxyError、SSLError與手動下載方案

問題背景 在使用 Hugging Face 的 SentenceTransformer 加載預訓練模型 all-MiniLM-L6-v2 時&#xff0c;遇到了以下錯誤&#xff1a; 代理連接失敗&#xff08;ProxyError / SSLError: KRB5_S_TKT_NYV&#xff09;大文件下載中斷&#xff08;unexpected EOF while reading&a…

MySQL——DQL的單表查詢

1、查詢表中所有的字段&#xff08;列&#xff09; 語法&#xff1a;select * from 表名; * 是通配符&#xff0c;用來表示所有的字段&#xff08;列&#xff09;。 select 表示查詢哪些列。 from 表示從哪張表中查詢。 2、查詢表中指定的字段 語法&#xff1a;select 列…

開源RuoYi AI助手平臺的未來趨勢

近年來&#xff0c;人工智能技術的迅猛發展已經深刻地改變了我們的生活和工作方式。 無論是海外的GPT、Claude等國際知名AI助手&#xff0c;還是國內的DeepSeek、Kimi、Qwen等本土化解決方案&#xff0c;都為用戶提供了前所未有的便利。然而&#xff0c;對于那些希望構建屬于自…

[WUSTCTF2020]CV Maker1

進來是個華麗的界面&#xff0c;我們先跟隨這個網頁創造一個用戶 發現了一個上傳端口&#xff0c;嘗試上傳一個php文件并抓包 直接上傳進不去&#xff0c;加個GIF89A uploads/d41d8cd98f00b204e9800998ecf8427e.php 傳入 并且報告了 上傳路徑&#xff0c;然后使用蟻劍連接

Spring 中的 IOC

&#x1f331; 一、什么是 IOC&#xff1f; &#x1f4d6; 定義&#xff08;通俗理解&#xff09;&#xff1a; IOC&#xff08;Inversion of Control&#xff0c;控制反轉&#xff09; 是一種設計思想&#xff1a;對象不再由你自己創建和管理&#xff0c;而是交給 Spring 容器…

Vue2-實現elementUI的select全選功能

文章目錄 使用 Element UI 的全選功能自定義選項來模擬全選 在使用 Element UI 的 el-select組件時&#xff0c;實現“全選”功能&#xff0c;通常有兩種方式&#xff1a;一種是使用內置的全選功能&#xff0c;另一種是通過自定義選項來模擬全選。 使用 Element UI 的全選功能…

小菜Go:Ubuntu下Go語言開發環境搭建

前置要求Ubuntu環境搭建 文章推薦 此處推薦一個比較好的文章&#xff0c;基本按部就班就歐克~ 安裝虛擬機&#xff08;VMware&#xff09;保姆級教程&#xff08;附安裝包&#xff09;_vmware虛擬機-CSDN博客 安裝可能遇到的問題 虛擬機安裝遇到的問題如&#xff1a;Exception…

安卓中app_process運行報錯Aborted,怎么查看具體的報錯日志

我在pc端生成了一個jar包&#xff0c;可以正常執行&#xff0c;但是導入到安卓的/data/local/tmp下面執行就會報錯 執行命令如下&#xff1a; adb shell cd /data/local/tmp app_process -Djava.class.path/data/local/tmp/demo.jar /data/local/tmp com.example.demo.Hello然…

Python 面向對象 - 依賴倒置原則 (DIP)

1. 核心概念 依賴倒置原則(Dependency Inversion Principle, DIP) 是SOLID原則中的"D"&#xff0c;包含兩個關鍵點&#xff1a; 高層模塊不應依賴低層模塊&#xff0c;二者都應依賴抽象抽象不應依賴細節&#xff0c;細節應依賴抽象 2. 使用場景 典型應用場景 系…