Vue3 知識點總結

Vue3 知識點總結

1. 核心概念

1.1 Composition API

1.1.1 setup 函數
  • setup是Vue3中的新的配置項,是組件內使用Composition API的入口
  • 在setup中定義的變量和方法需要return才能在模板中使用
  • setup執行時機在beforeCreate之前,this不可用
export default {setup() {const count = ref(0)const increment = () => count.value++return {count,increment}}
}
1.1.2 響應式API
ref
  • 用于基本類型的響應式
  • 在setup中需要.value訪問
  • 在模板中自動解包
const count = ref(0)
console.log(count.value) // 0
reactive
  • 用于對象類型的響應式
  • 返回對象的響應式副本
const state = reactive({count: 0,list: []
})
toRef 和 toRefs
  • toRef: 為源響應式對象上的屬性新建ref
  • toRefs: 將響應式對象轉換為普通對象,其中每個屬性都是ref
const state = reactive({foo: 1,bar: 2
})
const fooRef = toRef(state, 'foo')
const stateRefs = toRefs(state)

1.2 生命周期鉤子

  • setup(): 組件創建前執行
  • onBeforeMount(): 組件掛載前
  • onMounted(): 組件掛載后
  • onBeforeUpdate(): 組件更新前
  • onUpdated(): 組件更新后
  • onBeforeUnmount(): 組件卸載前
  • onUnmounted(): 組件卸載后
import { onMounted } from 'vue'export default {setup() {onMounted(() => {console.log('組件已掛載')})}
}

1.3 依賴注入

provide/inject
  • 跨層級組件通信
  • 可以傳遞響應式數據
// 父組件
provide('key', value)// 子組件
const value = inject('key')

2. 新特性

2.1 Teleport

  • 將組件內容渲染到指定DOM節點
  • 常用于模態框、彈出層等
<teleport to="body"><div class="modal"><!-- 模態框內容 --></div>
</teleport>

2.2 Fragments

  • 組件可以有多個根節點
  • 無需包裹額外的div
<template><header>...</header><main>...</main><footer>...</footer>
</template>

2.3 Suspense

  • 處理異步組件
  • 提供加載狀態
<suspense><template #default><async-component /></template><template #fallback><loading-component /></template>
</suspense>

3. 狀態管理

3.1 Pinia

  • Vue3推薦的狀態管理方案
  • 支持TypeScript
  • 輕量級、模塊化
// store/counter.js
import { defineStore } from 'pinia'export const useCounterStore = defineStore('counter', {state: () => ({count: 0}),actions: {increment() {this.count++}}
})

4. 性能優化

4.1 靜態提升

  • 靜態節點提升到渲染函數之外
  • 減少渲染開銷

4.2 Patch Flag

  • 動態節點標記
  • 優化diff算法

4.3 Tree Shaking

  • 更好的代碼分割
  • 減小打包體積

5. TypeScript支持

5.1 類型定義

interface User {id: numbername: string
}const user = ref<User>({ id: 1, name: 'Tom' })

5.2 組件Props類型

defineProps<{title: stringcount: number
}>()

6. 工程化實踐

6.1 Vite

  • 更快的開發服務器啟動
  • 更快的模塊熱更新
  • 優化的構建輸出

6.2 單文件組件

<script setup lang="ts">
import { ref } from 'vue'const count = ref(0)
</script><template><button @click="count++">{{ count }}</button>
</template>

6.3 組件設計原則

  • 單一職責
  • 可復用性
  • Props向下,Events向上
  • 組件通信規范

7. 最佳實踐

7.1 代碼組織

  • 使用組合式函數(Composables)
  • 邏輯復用和抽象
  • 目錄結構規范

7.2 性能考慮

  • 合理使用computed和watch
  • 避免不必要的組件渲染
  • 使用v-show代替v-if(頻繁切換)

7.3 錯誤處理

  • 統一的錯誤處理機制
  • 異步操作的錯誤捕獲
  • 全局錯誤處理

7.4 自定義指令

  • 生命周期鉤子
  • 傳遞參數和修飾符
// 自定義防抖指令
app.directive('debounce', {mounted(el, binding) {const delay = binding.value || 300let timer = nullel.addEventListener('click', () => {if (timer) clearTimeout(timer)timer = setTimeout(() => {binding.value()}, delay)})}
})

7.5 動畫與過渡

  • v-enter-from/v-leave-to
  • transition組件
  • transition-group列表過渡
<template><transition name="fade"><div v-if="show">Content</div></transition>
</template><style>
.fade-enter-active,
.fade-leave-active {transition: opacity 0.5s;
}
.fade-enter-from,
.fade-leave-to {opacity: 0;
}
</style>

7.6 組合式函數(Composables)

  • 邏輯復用
  • 狀態共享
  • 生命周期集成
// useCounter.js
import { ref, onMounted } from 'vue'export function useCounter(initialValue = 0) {const count = ref(initialValue)const increment = () => count.value++const decrement = () => count.value--onMounted(() => {console.log('Counter mounted')})return {count,increment,decrement}
}// 使用組合式函數
const { count, increment } = useCounter()

7.7 與其他技術棧集成

7.7.1 Vue3 + TypeScript
// 組件Props類型定義
interface Props {message: stringcount?: number
}defineProps<Props>()// 組合式函數類型定義
interface UseUserReturn {user: Ref<User | null>loading: Ref<boolean>error: Ref<Error | null>fetchUser: (id: number) => Promise<void>
}function useUser(): UseUserReturn {// 實現...
}
7.7.2 Vue3 + Vite + TailwindCSS
// vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import tailwindcss from 'tailwindcss'export default defineConfig({plugins: [vue()],css: {postcss: {plugins: [tailwindcss]}}
})
7.7.3 Vue3 + Jest
// counter.spec.js
import { mount } from '@vue/test-utils'
import Counter from './Counter.vue'test('increments value on click', async () => {const wrapper = mount(Counter)await wrapper.find('button').trigger('click')expect(wrapper.text()).toContain('1')
})

8. 高級組件模式

8.1 動態組件

<template><component :is="currentComponent" v-bind="props" />
</template><script setup>
import { shallowRef } from 'vue'const currentComponent = shallowRef(null)
const props = ref({})// 異步加載組件
async function loadComponent(name) {const component = await import(`./components/${name}.vue`)currentComponent.value = component.default
}
</script>

8.2 遞歸組件

<!-- TreeNode.vue -->
<template><div class="tree-node"><div @click="toggle">{{ node.label }}</div><div v-if="isExpanded && node.children" class="children"><tree-nodev-for="child in node.children":key="child.id":node="child"/></div></div>
</template><script setup>
const props = defineProps(['node'])
const isExpanded = ref(false)
const toggle = () => isExpanded.value = !isExpanded.value
</script>

8.3 高階組件(HOC)

// withLoading.ts
import { h, defineComponent } from 'vue'export function withLoading(WrappedComponent) {return defineComponent({props: ['loading', ...WrappedComponent.props],setup(props, { attrs, slots }) {return () => props.loading? h('div', 'Loading...'): h(WrappedComponent, { ...attrs }, slots)}})
}

9. 性能優化最佳實踐

9.1 大列表優化

<script setup>
import { useVirtualList } from '@vueuse/core'const list = ref(Array.from({ length: 10000 }, (_, i) => ({ id: i, text: `Item ${i}` })))
const { list: virtualList, containerProps, wrapperProps } = useVirtualList(list, {itemHeight: 40,overscan: 10
})
</script><template><div v-bind="containerProps" class="container"><div v-bind="wrapperProps"><div v-for="item in virtualList" :key="item.id" class="item">{{ item.text }}</div></div></div>
</template>

9.2 組件懶加載

// 路由懶加載
const routes = [{path: '/dashboard',component: () => import('./views/Dashboard.vue')}
]// 組件懶加載
const MyComponent = defineAsyncComponent(() =>import('./components/MyComponent.vue')
)

9.3 計算屬性緩存

const expensiveComputed = computed(() => {return list.value.filter(item => {// 復雜的計算邏輯return complexProcess(item)})
})// 帶有getter和setter的計算屬性
const fullName = computed({get() {return `${firstName.value} ${lastName.value}`},set(newValue) {[firstName.value, lastName.value] = newValue.split(' ')}
})

10. 與Vue2的主要區別

10.1 核心架構

  • 使用Proxy代替Object.defineProperty實現響應式
  • 重寫虛擬DOM實現,性能提升100%
  • 模板編譯優化,支持靜態提升
  • 更好的TypeScript支持,內置類型聲明

10.2 API差異

  • Composition API vs Options API
  • 新的生命周期鉤子
  • 移除filter和 o n 、 on、 onoff等API
  • setup函數替代beforeCreate和created

10.3 模板語法

  • v-model的使用變化(modelValue + update:modelValue)
  • 支持多個v-model綁定
  • Teleport、Suspense等新特性
  • 片段(Fragments)支持多根節點

10.4 響應式系統

  • ref和reactive的顯式聲明
  • 更好的響應式解構支持(toRefs)
  • 響應式數據的調試能力增強
  • 更細粒度的響應式控制

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

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

相關文章

python --face_recognition(人臉識別,檢測,特征提取,繪制鼻子,眼睛,嘴巴,眉毛)/活體檢測

dlib 安裝方法 之前博文 https://blog.csdn.net/weixin_44634704/article/details/141332644 環境: python3.8 opencv-python4.11.0.86 face_recognition1.3.0 dlib19.24.6人臉檢測 import cv2 import face_recognition# 讀取人臉圖片 img cv2.imread(r"C:\Users\123\…

【bug】[42000][1067] Invalid default value for ‘xxx_time‘

MySQL錯誤解決&#xff1a;Invalid default value for xxx_time’問題分析與修復方案 問題描述 在MySQL數據庫操作中&#xff0c;當嘗試創建或修改表結構時&#xff0c;可能會遇到以下錯誤信息&#xff1a; [bug] [42000][1067] Invalid default value for xxx_time這個錯誤…

Go環境相關理解

Linux上安裝的環境變量 ## set go env export GOPATH$HOME/go_workspace export GOPATH/usr/local/go export PATH$PATH:$GOPATH/bin go.mod 和go.sum的理解 go.mod文件 ?go.mod文件定義了模塊的路徑和依賴版本?。它遵循 語義化版本2.0.0規范&#xff0c;記錄了當前項目所依…

Next.js 深度解析:全棧React框架的架構哲學與實踐精髓

Next.js 作為 React 生態中最流行的全棧框架&#xff0c;已經超越了簡單的SSR工具&#xff0c;發展成為完整的Web開發解決方案。以下從八個維度進行深度剖析&#xff1a; 一、核心架構設計 雙引擎驅動模型 頁面路由系統&#xff1a;基于文件系統的約定式路由渲染引擎&#xff…

禾賽盈利了,但激光雷達沒有勝利

還遠沒有到激光雷達黨歡呼的時候。 3月&#xff0c;隨著禾賽科技公布2024年報&#xff0c;全世界第一家也是唯一一家實現全年盈利的激光雷達上市公司誕生&#xff0c;為了這個盈利目標&#xff0c;禾賽科技奮斗了十年。 但極大的出貨量和不高的盈利水平&#xff0c;讓禾賽科技…

心房顫動新機制:ATM/p53通路早期抑制

急性心肌梗死&#xff08;AMI&#xff09;是心血管疾病中的“大魔頭”&#xff0c;它悄無聲息地侵蝕著心臟的肌肉&#xff0c;導致心臟功能受損&#xff0c;嚴重時甚至危及生命。而心房顫動&#xff08;AF&#xff09;&#xff0c;這一常見的心律失常&#xff0c;往往在AMI后悄…

Linux 安裝 Redis

虛擬機安裝 linux https://www.bilibili.com/video/BVldD42177qg?p16 1、安裝 gcc,編譯環境 yum y install gcc-g 2、將 redis-7.2.4.tar.gz放到 linux。如&#xff0c;放到 opt 里 3、進入/opt 目錄下&#xff0c;解壓 tar -zxvf redis-7.2.4.tar.gz 4、進入 redis-7.2.4.tar…

六級備考 詞匯量積累(day11)

sculpture 雕像 allege 指責&#xff0c;聲稱 pledge 發誓 breach 違背&#xff0c;違反 defaulty 違約&#xff0c;違反 infringe 侵犯 infringing on small farmers interest blacmail 勒索 idle 無所事事的 deceive 欺騙 perceive 察覺 conceive 設想 conception 設想 verdi…

關于金碟K3,禁用和啟用需要流程審批后執行

真是難受,是設計師蠢呢自己問題比較多呢,現在都還沒有弄好 點擊禁用和啟用,通過流程來執行 到底是蠢呢還是設計問題,搞了半日沒有效果,搞那么復雜! 而且有樣板都沒有草鞋成功 BOS設計,表單屬性,操作列表: 1、啟用禁用流程

導入 Excel 規則批量修改或刪除 PDF 文檔內容

需要對 PDF 文檔內容進行修改的時候&#xff0c;通常我們會需要借助一些專業的工具來幫我們完成。那我們如果需要修改的 PDF 文檔較多的時候&#xff0c;有什么方法可以幫我們實現批量操作呢&#xff1f;今天這篇文章就給大家介紹一下當我們需要批量修改多個 PDF 文檔的時候&am…

msyql--基本操作之運維篇

檢查 root 用戶的權限 查看該用戶針對這個數據庫的權限 -- 如果在終端連接mysql時需要 mysql -u root -p -- 查看用戶權限 SELECT user, host FROM mysql.user WHERE user root;可以看的出來root有他的訪問權限&#xff0c;如過沒有localhost或者% 說明沒有訪問權限 添加…

Vue 3使用 Socket

在 Vue 3 中使用 Socket&#xff08;如 WebSocket 或基于 WebSocket 的庫比如 Socket.IO&#xff09;可以通過組合式 API&#xff08;Composition API&#xff09;來實現得更清晰、模塊化。下面我給你展示一個完整的例子&#xff0c;包括使用原生 WebSocket 和使用 Socket.IO 的…

云計算:探索現代科技的未來之云

文章目錄 云計算基本概念云計算是什么注意 云計算的價值云計算的部署模式云計算的服務模式主流的云計算技術AWS簡介AWS建立了廣闊的合作伙伴生態 VMware簡介VMware服務介紹 華為云簡介華為云Stack模式 云計算基本概念 云計算是什么 云計算是一種模型&#xff0c;它可以實現隨時…

光學像差的類型與消除方法

### **光學像差的類型、理解與消除方法** 光學像差是指實際光學系統成像時&#xff0c;由于透鏡或反射鏡的非理想特性導致的光線偏離理想路徑&#xff0c;從而影響成像質量的現象。像差可分為**單色像差**&#xff08;與波長無關&#xff09;和**色差**&#xff08;與波長相關…

什么是ecovadis驗廠?ecovadis驗廠的好處?ecovadis驗廠的重要意義

1. 什么是EcoVadis驗廠&#xff1f; EcoVadis驗廠&#xff08;又稱EcoVadis評估&#xff09;是國際權威的 企業社會責任&#xff08;CSR&#xff09;和可持續發展&#xff08;ESG&#xff09;在線評估&#xff0c;通過審核企業在 環境、勞工與人權、商業道德、可持續采購 四大…

STM32蜂鳴器播放音樂

STM32蜂鳴器播放音樂 STM32蜂鳴器播放音樂 Do, Re, Mi, Fa, 1. 功能概述 本系統基于STM32F7系列微控制器&#xff0c;實現了以下功能&#xff1a; 通過7個按鍵控制蜂鳴器發聲&#xff0c;按鍵對應不同的音符。每個按鍵對應一個音符&#xff08;Do, Re, Mi, Fa, Sol, La, Si&a…

基于 OCO - 2 氧氣 A 帶輻射數據與地面臺站氣壓觀測數據構建近地面氣壓監測算法方案

基于 OCO - 2 氧氣 A 帶輻射數據與地面臺站氣壓觀測數據構建近地面氣壓監測算法方案 一、數據獲取與準備 (一)OCO - 2 氧氣 A 帶輻射數據 數據下載:從 OCO - 2 官方數據發布平臺(如 NASA 的相關數據存儲庫),按照研究所需的時間范圍(例如,近 5 年的數據以獲取足夠的樣本…

程序員英語口語練習筆記

我是一個程序員&#xff0c;專注于Java, Linux和k8s. I’m a programmer specializing in Java, Linux, and Kubernetes. 這個不是我的bug。 I don’t think this bug is caused by my work. 你能幫我看一下這個代碼嗎&#xff1f; Can you take a look at this code for me?…

網絡地址轉換技術(2)

NAT的配置方法&#xff1a; &#xff08;一&#xff09;靜態NAT的配置方法 進入接口視圖配置NAT轉換規則 Nat static global 公網地址 inside 私網地址 內網終端PC2&#xff08;192.168.20.2/24&#xff09;與公網路由器AR1的G0/0/1&#xff08;11.22.33.1/24&#xff09;做…

從零開始理解基于深度學習的語義分割模型:RCA與RCM模塊的實現

從零開始理解基于深度學習的語義分割模型:RCA與RCM模塊的實現 隨著深度學習技術的發展,圖像分割任務取得了長足的進步。本文將從一個具體的PyTorch代碼實例出發,帶大家了解一種 novel 的語義分割網絡架構——RCA(Rectangular Self-Calibration Attention)和 RCM(Rectang…