Vue3 Pinia

一、Pinia 核心概念

Pinia?是 Vue3 官方推薦的狀態管理庫,相比 Vuex 4,具有以下優勢:

  • 更簡潔的 API(移除?mutations

  • 完整的 TypeScript 支持

  • 支持組合式 API

  • 自動代碼分割

  • 輕量級(僅 1KB)


二、核心概念對比(Pinia vs Vuex)

特性PiniaVuex
狀態存儲defineStore()new Vuex.Store()
狀態定義state()?函數state?對象
數據修改直接修改或?$patch必須通過?mutations
異步操作直接在?actions?處理通過?actions?調用?mutations
模塊系統天然模塊化需要手動分模塊
TypeScript一流支持需要額外類型定義

三、基礎使用

1. 安裝與創建 Store
npm install pinia
// stores/counter.js
import { defineStore } from 'pinia'export const useCounterStore = defineStore('counter', {state: () => ({count: 0}),getters: {doubleCount: (state) => state.count * 2},actions: {increment() {this.count++},async fetchData() {const res = await fetch('/api/data')this.data = await res.json()}}
})
2. 掛載到 Vue 實例
// main.js
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'const app = createApp(App)
app.use(createPinia())
app.mount('#app')

四、組件中使用 Store

1. 基礎使用(Options API)
<script>
import { useCounterStore } from '@/stores/counter'export default {setup() {const counter = useCounterStore()return { counter }},computed: {quadrupleCount() {return this.counter.doubleCount * 2}}
}
</script><template><div>{{ counter.count }}</div><button @click="counter.increment()">+1</button>
</template>
2. 組合式 API(推薦)
<script setup>
import { useCounterStore } from '@/stores/counter'
import { storeToRefs } from 'pinia'const counter = useCounterStore()// 解構保持響應式
const { count, doubleCount } = storeToRefs(counter)// 直接調用 action
function handleClick() {counter.increment()
}
</script>

五、核心功能詳解

1. State 管理
// 定義
const useStore = defineStore('storeId', {state: () => ({user: null,items: []})
})// 使用
const store = useStore()// 直接訪問
console.log(store.user)// 批量修改
store.$patch({user: { name: 'Alice' },items: [...store.items, newItem]
})// 重置狀態
store.$reset()
2. Getters 計算屬性
const useStore = defineStore('storeId', {state: () => ({ count: 0 }),getters: {double: (state) => state.count * 2,// 使用其他 getterquadruple() {return this.double * 2}}
})
3. Actions 操作
const useStore = defineStore('storeId', {actions: {async login(userData) {try {this.user = await api.login(userData)} catch (error) {throw new Error(error)}}}
})// 調用
store.login({ user: 'admin' }).catch(handleError)

六、高級功能

1. 訂閱狀態變化
const unsubscribe = store.$subscribe((mutation, state) => {console.log('狀態變化:', mutation.type)console.log('新狀態:', state)
})// 取消訂閱
unsubscribe()
2. 插件開發
// 持久化插件示例
const persistPlugin = ({ store }) => {const key = `pinia-${store.$id}`const savedState = localStorage.getItem(key)if (savedState) {store.$patch(JSON.parse(savedState))}store.$subscribe((_, state) => {localStorage.setItem(key, JSON.stringify(state))})
}// 使用插件
const pinia = createPinia()
pinia.use(persistPlugin)
3. 服務端渲染 (SSR)
// 服務端
export default {async setup() {const pinia = createPinia()const app = createApp(App).use(pinia)const initialState = JSON.stringify(pinia.state.value)return { initialState }}
}// 客戶端
if (window.__INITIAL_STATE__) {pinia.state.value = JSON.parse(window.__INITIAL_STATE__)
}

七、TypeScript 集成

1. 類型化 Store
interface UserState {name: stringage: number
}export const useUserStore = defineStore('user', {state: (): UserState => ({name: 'Alice',age: 25}),getters: {isAdult: (state) => state.age >= 18}
})
2. 類型安全的插件
import { PiniaPluginContext } from 'pinia'declare module 'pinia' {export interface PiniaCustomProperties {$hello: (msg: string) => string}
}const helloPlugin = ({ store }: PiniaPluginContext) => {store.$hello = (msg: string) => `Hello ${msg}!`
}

八、最佳實踐

  1. Store 組織規范

src/
├── stores/
│   ├── modules/
│   │   ├── user.store.ts
│   │   └── cart.store.ts
│   └── index.ts # 統一導出
  1. 模塊化 Store

// stores/modules/user.store.ts
export const useUserStore = defineStore('user', { /* ... */ })// stores/index.ts
export * from './modules/user.store'
export * from './modules/cart.store'
  1. 組合 Store

// 組合多個 Store
const useCombinedStore = () => {const user = useUserStore()const cart = useCartStore()const totalPrice = computed(() => user.isVIP ? cart.total * 0.9 : cart.total)return { user, cart, totalPrice }
}
  1. 性能優化

// 避免重復訂閱
const store = useStore()
const doubleCount = computed(() => store.doubleCount)

九、常見問題解決方案

Q1: 如何調試?
安裝?Vue Devtools,支持直接查看和修改 Pinia 狀態

Q2: 如何與 Vuex 共存?

// 在 Vue3 項目中可以同時使用
import { createPinia } from 'pinia'
import { createStore } from 'vuex'const pinia = createPinia()
const vuexStore = createStore({ /* ... */ })app.use(pinia)
app.use(vuexStore)

Q3: 如何持久化存儲?
使用官方推薦插件?pinia-plugin-persistedstate

npm install pinia-plugin-persistedstate
import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)// Store 配置
defineStore('user', {persist: {key: 'my-custom-key',paths: ['userInfo']}
})

Q4: 如何重置單個狀態?

const store = useStore()// 方法一:直接賦值
store.user = null// 方法二:使用 $patch
store.$patch({ user: null })// 方法三:重置全部
store.$reset()

十、總結

Pinia 適用場景

  • 需要 TypeScript 深度支持的項目

  • 希望簡化狀態管理流程的新項目

  • 需要模塊化狀態管理的復雜應用

  • 需要與服務端渲染(SSR)集成的項目

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

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

相關文章

音視頻小白系統入門課-4

本系列筆記為博主學習李超老師課程的課堂筆記&#xff0c;僅供參閱 往期課程筆記傳送門&#xff1a; 音視頻小白系統入門筆記-0音視頻小白系統入門筆記-1音視頻小白系統入門筆記-2音視頻小白系統入門筆記-3 將mp4文件轉換為yuv文件 ffmpeg -i demo.mp4 # 輸入文件-an …

6.2 內容生成與營銷:個性化內容創作與營銷策略優化

隨著消費者對個性化體驗的需求日益增長&#xff0c;傳統的內容創作與營銷方式已難以滿足市場競爭的需要。基于大語言模型&#xff08;LLM&#xff09;與智能代理&#xff08;Agent&#xff09;的技術為企業提供了全新的解決方案&#xff0c;能夠實現高效、精準、規模化的內容生…

kafka課后總結

Kafka是由LinkedIn開發的分布式發布 - 訂閱消息系統&#xff0c;具備高吞吐量、低延遲、可擴展性、持久性、可靠性、容錯性和高并發等特性。其主要角色包括Broker、Topic、Partition、Producer、Consumer、Consumer Group、replica、leader、follower和controller。消息系統中存…

DataStreamAPI實踐原理——計算模型

引入 通過前面我們對于Flink的理解&#xff0c;我們知道它吸收了 Dataflow 的理念&#xff0c;以及此前已有的流處理系統&#xff08;如 S4、Storm、MillWheel&#xff09;的經驗&#xff0c;實現了批流一體化的高效數據處理&#xff0c;并且通過靈活的窗口機制、事件時間與水…

項目筆記1:通用 Service的常見方法

通用 Service 通常封裝了常見的業務邏輯操作&#xff0c;以提高代碼的復用性和可維護性。不同的框架和業務場景下&#xff0c;通用 Service 的方法會有所差異&#xff0c;但一般都會包含一些基本的增刪改查&#xff08;CRUD&#xff09;操作&#xff0c;以下為你詳細介紹&#…

阿里云99機器總是宕機,實測還是磁盤性能差

阿里云99計劃總是宕機&#xff0c;經過反復排查&#xff0c;最終確認還是磁盤性能差。 阿里云99機器使用的磁盤類型是Entry云盤40GiB (2120 IOPS) 按照官方的一些數據&#xff0c;這個磁盤最小iops是1800最大是6000,實際使用中發現&#xff0c;這個6000值很虛&#xff0c;這個…

Fedora 43 計劃移除所有 GNOME X11 相關軟件包

Fedora 43 計劃移除所有 GNOME X11 相關軟件包&#xff0c;這是 Fedora 項目團隊為全面擁抱 Wayland 所做的重要決策。以下是關于此計劃的詳細介紹&#xff1a; 提案內容&#xff1a;4 月 23 日&#xff0c;Neal Gompa 提交提案&#xff0c;建議從 Fedora 軟件倉庫中移除所有 G…

魔幻預言手游》:職業介紹!

在《魔幻預言》手游中&#xff0c;共有武玄、魔魅、劍仙三大核心職業&#xff0c;各具特色且定位鮮明&#xff0c;以下為具體介紹&#xff1a; 一、武玄&#xff08;戰士&#xff09; 核心定位&#xff1a;近戰物理輸出與團隊增益擔當&#xff0c;兼具控制與防御能力。 戰斗風…

精益數據分析(27/126):剖析用戶價值與商業模式拼圖

精益數據分析&#xff08;27/126&#xff09;&#xff1a;剖析用戶價值與商業模式拼圖 在創業和數據分析的領域中&#xff0c;每一次深入學習都是一次成長的契機。今天&#xff0c;我們繼續秉持共同進步的理念&#xff0c;深入研讀《精益數據分析》&#xff0c;剖析用戶價值的…

【SwitchyOmega安裝教程】

目錄 一、插件安裝 1. 下載安裝文件 2. 打開瀏覽器擴展安裝頁面 3. 安裝插件 二、界面詳情 三、配置信息 3.1 設置IP 1、查看IP地址信息 2、批量測試IP是否有效 3、點擊擴展程序&#xff0c;選擇 Proxy SwitchyOmega 4、 點擊選項進行配置 5、配置頁面 一、插件安裝 1…

矯平機終極指南:特殊材料處理、工藝鏈協同與全球供應鏈管理

一、特殊材料矯平&#xff1a;挑戰與創新解決方案 1. 高溫合金&#xff08;如Inconel 718&#xff09;處理 技術難點&#xff1a; 屈服強度高達1100 MPa&#xff0c;傳統矯平力不足 高溫下易氧化&#xff0c;需惰性氣體保護環境 解決方案&#xff1a; 采用雙伺服電機驅動&a…

反事實——AI與思維模型【82】

一、定義 反事實思維模型是一種心理認知模型,它指的是人們在頭腦中對已經發生的事件進行否定,然后構建出一種可能性假設的思維活動。簡單來說,就是思考“如果當時……,那么就會……”的情景。這種思維方式讓我們能夠超越現實的限制,設想不同的可能性和結果,從而對過去的…

Nginx:支持 HTTPS

文章目錄 Nginx 開啟 ssl 以支持 HTTPS1 生成本地證書2 開啟 ssl 以支持 HTTPS3 將 https 的請求轉發給 http 最終的 nginx.conf 如下 Nginx 開啟 ssl 以支持 HTTPS [!IMPORTANT] 在下文中&#xff0c;將采用如下定義。 HTTP端口&#xff1a; 80 HTTPS端口&#xff1a; 443 服務…

[計算機科學#2]:從繼電器到晶體管的電子計算機發展史(龐然大物的進化)

【核知坊】&#xff1a;釋放青春想象&#xff0c;碼動全新視野。 我們希望使用精簡的信息傳達知識的骨架&#xff0c;啟發創造者開啟創造之路&#xff01;&#xff01;&#xff01; 內容摘要&#xff1a;本文講述了20世紀初至1950年代計算機技術的發展歷程…

【ESP32S3】Cache 框圖和操作

ESP32-S3 采用雙核共享 ICache (指令緩存) 和 DCache &#xff08;數據緩存&#xff09; 結構&#xff0c;如下圖所示。以便當 CPU 的指令總線和數據總線同時發起請求時&#xff0c;也可以迅速響應&#xff1a; Cache 的存儲空間與內部存儲空間可以復用。具體為 Internal SRAM0…

wireshark從HEX轉儲導入使用方法

官方資料: https://www.wireshark.org/docs/wsug_html_chunked/ChIOImportSection.html 方法1&#xff1a; 文本文件&#xff0c;純內容導入: ff ff ff ff ff ff 00 00 00 00 5f 0f 08 06 00 01 08 00 06 04 00 01 00 00 00 00 5f 0f 64 01 60 10 00 00 00 00 00 00 64 01 01…

【Android】四大組件之Activity

目錄 一、什么是Activity 二、如何創建和配置Activity 三、Activity 跳轉與數據傳遞 四、數據保存與恢復 五、Activity 啟動模式 六、自定義返回行為 七、復雜界面布局 你可以把Activity想象成手機屏幕上的一個“頁面”。比如&#xff0c;當你打開一個App時&#xff0c;…

uml類關系(實現、繼承,聚合、組合,依賴、關聯)

drawio和EA是架構設計時經常使用的畫圖工具。 drawio學習門檻低&#xff0c;使用靈活&#xff0c;但是功能僅僅限于畫圖。 EA學習門檻高&#xff0c;但是功能更加的豐富&#xff1a; ①在畫圖方面&#xff0c;EA嚴格滿足UML標準&#xff0c;EA中的圖和類是關聯的&#xff0c…

C++如何設計線程池(thread pool)來提高線程的復用率,減少線程創建和銷毀的開銷

線程池的基本概念與多線程編程中的角色 線程池&#xff0c;顧名思義&#xff0c;是一種管理和復用線程的資源池。它的核心思想在于預先創建一定數量的線程&#xff0c;并將這些線程保持在空閑狀態&#xff0c;等待任務的分配。一旦有任務需要執行&#xff0c;線程池會從池中取出…

React.memo 和 useMemo

現象 React 中&#xff0c;通常父組件的某個state發生改變&#xff0c;會引起父組件的重新渲染&#xff08;和其他state的重新計算&#xff09;&#xff0c;從而會導致子組件的重新渲染&#xff08;和其他非相關屬性的重新計算&#xff09; 問題一&#xff1a;如何避免因為某個…