vue中狀態(tài)管理器Pinia的用法詳解
一、pinia介紹
Pinia 是 Vue.js 的輕量級(jí)狀態(tài)管理庫(kù),最近很受歡迎。它使用 Vue 3 中的新反應(yīng)系統(tǒng)來(lái)構(gòu)建一個(gè)直觀且完全類(lèi)型化的狀態(tài)管理庫(kù)。
Pinia的成功可以歸功于其管理存儲(chǔ)數(shù)據(jù)的獨(dú)特功能(可擴(kuò)展性、存儲(chǔ)模塊組織、狀態(tài)變化分組、多存儲(chǔ)創(chuàng)建等)。
pinia優(yōu)點(diǎn):
- 符合直覺(jué),易于學(xué)習(xí)
- 極輕, 僅有 1 KB
- 模塊化設(shè)計(jì),便于拆分狀態(tài)
- Pinia 沒(méi)有 mutations,統(tǒng)一在 actions 中操作 state,通過(guò)this.xx 訪問(wèn)相應(yīng)狀態(tài)雖然可以直接操作 Store,但還是推薦在 actions 中操作,保證狀態(tài)不被意外改變
- store 的 action 被調(diào)度為常規(guī)的函數(shù)調(diào)用,而不是使用 dispatch 方法或 MapAction 輔助函數(shù),這在 Vuex 中很常見(jiàn)
- 支持多個(gè)Store
- 支持 Vue devtools、SSR 和 webpack 代碼拆分
pinia缺點(diǎn):
不支持時(shí)間旅行和編輯等調(diào)試功能
二、安裝使用Pinia
在項(xiàng)目根目錄中打開(kāi)終端,輸入以下命令
yarn add pinia@next # or with npm npm install pinia@next // 該版本與Vue 3兼容,如果你正在尋找與Vue 2.x兼容的版本,請(qǐng)查看v1分支。
直接在main.js中使用
import { createApp } from "vue"; import App from "./App.vue"; import { setupStore } from "./store/index"; //引入pinia 緩存實(shí)例 const app = createApp(App); setupStore(app); //把創(chuàng)建出來(lái)的vue實(shí)例app 傳入setupStore函數(shù) 進(jìn)行掛載 app.mount("#app");
創(chuàng)建store文件夾,一般的項(xiàng)目我們可以不區(qū)分模塊,但是按照習(xí)慣,個(gè)人覺(jué)得區(qū)分模塊會(huì)讓代碼閱讀起來(lái)更加清晰
如:
store/index.js
import { createPinia } from "pinia"; const store = createPinia(); export function setupStore(app) { app.use(store); } export { store };
創(chuàng)建模塊app.js代碼:
import { defineStore } from "pinia"; export const useAppStore = defineStore({ // id is required so that Pinia can connect the store to the devtools id: "app", state: () => ({ clientWidth: "", clientHeight: "" }), getters: { getClientWidth() { return this.clientWidth; }, getClientHeight() { return this.clientHeight; } }, actions: { setClientWidth(payload) { try { setTimeout(() => { this.clientWidth = payload; }, 2000); } catch (error) {} }, setClientHeight(payload) { try { setTimeout(() => { this.clientHeight = payload; }, 2000); } catch (error) {} } } });
使用其實(shí)很簡(jiǎn)單,只要在對(duì)應(yīng)組件引入對(duì)應(yīng)的模塊
如:
<template> {{ width }} </template> <script> import { ref, reactive, onMounted,computed } from "vue"; import { useAppStore } from "@/store/modules/app"; export default { name: "App", setup() { const appStore = useAppStore(); const width = computed(() => { return appStore.clientWidth; }); onMounted(() => { appStore.setClientWidth(200); }); return { width, }; }, }; </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>
pinia還可以在當(dāng)前模塊很直觀的使用其他模塊的方法
如:
import { defineStore } from "pinia"; import { useOtherStore } from "@/store/modules/other.js"; export const useAppStore = defineStore({ // id is required so that Pinia can connect the store to the devtools id: "app", //state必須是一個(gè)返回對(duì)象的函數(shù) state: () => ({ clientWidth: "", clientHeight: "" }), getters: { getClientWidth() { return this.clientWidth; }, getClientHeight() { return this.clientHeight; }, // 使用其它 Store otherStoreCount(state) { // 這里是其他的 Store,調(diào)用獲取 Store,就和在 setup 中一樣 const otherStore = useOtherStore(); return otherStore.count; }, }, actions: { setClientWidth(payload) { try { setTimeout(() => { this.clientWidth = payload; }, 2000); } catch (error) {} }, setClientHeight(payload) { try { setTimeout(() => { this.clientHeight = payload; }, 2000); } catch (error) {} }, // 使用其它模塊的action setOtherStoreCount(state) { // 這里是其他的 Store,調(diào)用獲取 Store,就和在 setup 中一樣 const otherStore = useOtherStore(); otherStore.setMethod() }, } });
三、Pinia 中Actions改變state的幾種方法
我們?cè)诮M件中,引入對(duì)應(yīng)模塊后如:
<template> {{ width }} </template> <script> import { ref, reactive, onMounted,computed } from "vue"; import { useAppStore } from "@/store/modules/app"; export default { name: "App", setup() { const appStore = useAppStore(); const width = computed(() => { return appStore.clientWidth; }); onMounted(() => { appStore.setClientWidth(200); }); //演示三種方法修改state const changeAppstoreStateClick = () => { // 方式一:直接修改 -> 'direct' appStore.clientWidth += 400; // 方式二:patch對(duì)象方式 -> 'patch object',調(diào)用$patch 傳入要修改的鍵和val appStore.$patch({ clientWidth: appStore.clientWidth + 400, }); // 方式三:patch函數(shù)方式 -> 'patch function',可鍵入語(yǔ)句,執(zhí)行復(fù)雜邏輯 appStore.$patch((state) => { state.clientWidth += 400; }); }; return { width, changeAppstoreStateClick }; }, }; </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>
以上就是vue中狀態(tài)管理器Pinia的用法詳解的詳細(xì)內(nèi)容,更多關(guān)于vue狀態(tài)管理器Pinia的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
在vue中使用axios實(shí)現(xiàn)post方式獲取二進(jìn)制流下載文件(實(shí)例代碼)
這篇文章主要介紹了在vue中使用axios實(shí)現(xiàn)post方式獲取二進(jìn)制流下載文件的相關(guān)資料,需要的朋友可以參考下2019-12-12vue?當(dāng)中組件之間共享數(shù)據(jù)的實(shí)現(xiàn)方式
這篇文章主要介紹了vue?當(dāng)中組件之間共享數(shù)據(jù)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10vue源碼學(xué)習(xí)之Object.defineProperty 對(duì)數(shù)組監(jiān)聽(tīng)
這篇文章主要介紹了vue源碼學(xué)習(xí)之Object.defineProperty 對(duì)數(shù)組監(jiān)聽(tīng),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05