vue3使用Pinia的store的組件化開發(fā)模式詳解
一、安裝與初始化
安裝Pinia
npm install pinia # 或 yarn add pinia
目的:引入Pinia核心庫,為狀態(tài)管理提供基礎(chǔ)支持。
掛載Pinia實(shí)例
在main.js中初始化并注入Vue應(yīng)用:
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
const app = createApp(App)
const pinia = createPinia()
app.use(pinia) // 關(guān)鍵!全局啟用Pinia
app.mount('#app')作用:創(chuàng)建Pinia實(shí)例并與Vue3應(yīng)用集成,使所有組件可訪問Store。
二、創(chuàng)建Store(函數(shù)式寫法)
使用Composition API風(fēng)格定義Store(推薦):
// stores/counter.js
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
export const useCounterStore = defineStore('counter', () => {
// 1. 定義狀態(tài)(相當(dāng)于data)
const count = ref(0)
// 2. 定義計(jì)算屬性(相當(dāng)于getters)
const doubleCount = computed(() => count.value * 2)
// 3. 定義操作方法(相當(dāng)于actions)
function increment() {
count.value++
}
// 暴露狀態(tài)與方法
return { count, doubleCount, increment }
})核心要點(diǎn):
defineStore第一個(gè)參數(shù)為Store唯一ID(需全局唯一)- 使用
ref/computed等響應(yīng)式API管理狀態(tài) - 通過函數(shù)返回值暴露需共享的狀態(tài)與方法
- 注意這個(gè)的id和實(shí)際沒什么關(guān)系,你最后還是使用useCounterStore 來獲取對(duì)象
三、在組件中使用Store
引入Store實(shí)例
在組件<script setup>中調(diào)用Store:
<script setup>
import { useCounterStore } from '@/stores/counter'
const counterStore = useCounterStore() // 實(shí)例化Store
</script>特性:Store按需實(shí)例化,支持多組件復(fù)用且狀態(tài)自動(dòng)同步。
模板中訪問狀態(tài)與方法
<template>
<div>
<p>當(dāng)前計(jì)數(shù):{{ counterStore.count }}</p>
<p>雙倍計(jì)數(shù):{{ counterStore.doubleCount }}</p>
<button @click="counterStore.increment()">+1</button>
</div>
</template>響應(yīng)式原理:直接訪問Store的屬性會(huì)觸發(fā)Vue的響應(yīng)式更新。
四、高級(jí)功能擴(kuò)展
狀態(tài)持久化(示例)
安裝插件并配置:
npm install pinia-plugin-persistedstate
// main.js import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' pinia.use(piniaPluginPersistedstate)
在Store中啟用:
defineStore('counter', () => { /* ... */ }, {
persist: {
enabled: true, // 開啟持久化
storage: sessionStorage, // 可選存儲(chǔ)方式(默認(rèn)localStorage)
paths: ['count'] // 指定需持久化的字段
}
})作用:瀏覽器刷新后自動(dòng)恢復(fù)指定狀態(tài)。
模塊化開發(fā)
- 創(chuàng)建多個(gè)Store文件(如
userStore.js、cartStore.js) - 組件按需引入不同Store,實(shí)現(xiàn)邏輯解耦
五、調(diào)試技巧
Vue Devtools集成
安裝瀏覽器插件后,可查看Store狀態(tài)變化歷史與時(shí)間旅行調(diào)試。
自定義插件
可開發(fā)日志插件跟蹤狀態(tài)變更(示例見網(wǎng)頁4的日志監(jiān)控代碼)。
總結(jié)
通過以上步驟可實(shí)現(xiàn):
- ? 響應(yīng)式狀態(tài)管理:基于Composition API的Store聲明
- ? 跨組件共享:多組件間高效同步復(fù)雜狀態(tài)
- ? 可維護(hù)性:模塊化Store設(shè)計(jì)與類型安全(天然支持TS)
- ? 擴(kuò)展性:通過插件實(shí)現(xiàn)持久化、日志等高級(jí)功能
對(duì)比Vuex,Pinia的函數(shù)式Store語法更簡(jiǎn)潔,且與Vue3的Composition API深度契合,推薦作為Vue3項(xiàng)目的首選狀態(tài)管理方案。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue中使用vue-cli接入融云實(shí)現(xiàn)即時(shí)通信
這篇文章主要介紹了vue中使用vue-cli接入融云實(shí)現(xiàn)即時(shí)通信的相關(guān)資料,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
解決vue2中使用elementUi打包報(bào)錯(cuò)的問題
這篇文章主要介紹了解決vue2中使用elementUi打包報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
vue父子組件傳值不能實(shí)時(shí)更新的解決方法
Vue是一個(gè)以數(shù)據(jù)驅(qū)動(dòng)、組件化的前端框架,其中組件化是Vue中較為重要的概念之一,組件之間的通信則成為Vue中較為普遍的需求,下面這篇文章主要給大家介紹了關(guān)于vue父子組件傳值不能實(shí)時(shí)更新的解決方法,需要的朋友可以參考下2023-05-05
Vue3組件中g(shù)etCurrentInstance()獲取App實(shí)例,但是返回null的解決方案
這篇文章主要介紹了Vue3組件中g(shù)etCurrentInstance()獲取App實(shí)例,但是返回null的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
Vue2路由動(dòng)畫效果的實(shí)現(xiàn)代碼
本篇文章主要介紹了Vue2路由動(dòng)畫效果的實(shí)現(xiàn)代碼,可以根據(jù)不同的路徑去改變動(dòng)畫的效果,有興趣的可以了解一下2017-07-07
vue3+vite+antd如何實(shí)現(xiàn)自定義主題
這篇文章主要介紹了vue3+vite+antd如何實(shí)現(xiàn)自定義主題問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
關(guān)于vue中根據(jù)用戶權(quán)限動(dòng)態(tài)添加路由的問題
每次路由發(fā)生變化時(shí)都需要調(diào)用一次路由守衛(wèi),并且store中的數(shù)據(jù)會(huì)在每次刷新的時(shí)候清空,因此需要判斷store中是否有添加的動(dòng)態(tài)路由,本文給大家分享vue中根據(jù)用戶權(quán)限動(dòng)態(tài)添加路由的問題,感興趣的朋友一起看看吧2021-11-11

