一盞茶的時間,帶你輕松上手Pinia

🎬 岸邊的風:個人主頁

?🔥?個人專欄?:《 VUE 》?《 javaScript 》

???生活的理想,就是為了理想的生活?!

目錄

?📚 前言

📘 創建 Pinia

📘 Option Store

📘?Pinia 提供多種選項配置 Store:

🍍?state

🍍?getters

🍍?actions

🍍?persist

📘 使用 Store

🍍 讀取狀態

🍍調用 Actions

🍍 多個 Store

📘 Setup Store

📘 數據持久化

📘 Pinia 插件

📘 購物車示例

📘?Pinia 插件

📘 實現一個持久化插件

📚? 寫在最后


?📚 前言

?

Pinia,讓狀態管理再無難題!

作為Vue.js官方推薦的新星級管理庫,Pinia為開發者帶來前所未有的順滑體驗。你還在為復雜難懂的狀態管理代碼頭疼嗎?別急,用Pinia你可以告別一切煩惱!

本指南將為您還原Pinia的奧秘,您將掌握它獨特的簡潔API使用技巧,迅速成為狀態管理的專家級大師!無論您是新手還是老鳥,這里的專業指導將助您在項目中如虎添翼,以最輕松的姿態管理復雜應用狀態。

快來 Reshape Your State Management Skills吧!我們一起領略 Pinia的魅力!

📘 創建 Pinia

main.js 中導入 createPinia 并使用:

import?{?createApp?}?from?'vue'
import?{?createPinia?}?from?'pinia'const?pinia?=?createPinia()
const?app?=?createApp(App)app.use(pinia)

可以通過?app.config.globalProperties.$pinia?訪問 Pinia 實例。

📘 Option Store

Vue 的選項式 API 類似,我們也可以傳入一個帶有?stateactions?與?getters?屬性的 Option 對象(廢棄了Mutations

使用?defineStore?API 定義 Store:

import?{?defineStore?}?from?'pinia'export?const?useMainStore?=?defineStore('main',?{//?statestate:?()?=>?{return?{counter:?0}},//?gettersgetters:?{doubleCount(state)?{return?state.counter?*?2}},//?actionsactions:?{increment()?{this.counter++?}}
})
  • 接收唯一 ID 作為第一個參數

  • state、getters、actions 定義方式與 Vue 組件類似

  • 可以直接通過?this?訪問狀態

📘?Pinia 提供多種選項配置 Store:

🍍?state

📟 定義響應式狀態:

state:?()?=>?{return?{count:?0}
}?

必須是一個返回狀態對象的函數。

🍍?getters

📟 定義 getter 計算屬性:

getters:?{double(state)?{return?state.count?*?2}
}

📟?getter 可以接收參數:

getters:?{getMessage(state)?{return?(name?=?'Vue')?=>?`Hello?${name}`?}
}

🍍?actions

📟 定義方法修改狀態:

actions:?{increment(amount?=?1)?{this.count?+=?amount}
}

📟?actions 支持同步和異步操作。

🍍?persist

📟 配置數據持久化,需要使用插件:

persist:?{enabled:?true,strategies:?[{key:?'my_store',storage:?localStorage,},]
}?

📘 使用 Store

📟 通過?useXxxStore()?獲取 Store 實例:

import?{?useMainStore?}?from?'@/stores/main'export?default?{setup()?{const?main?=?useMainStore()main.increment()}?
}

📟 讀取狀態、調用 actionsVue 組件。

🍍 讀取狀態

//?直接讀取
const?count?=?main.count//?通過計算屬性
const?double?=?computed(()?=>?main.doubleCount)//?通過?storeToRefs
const?{?count?}?=?storeToRefs(main)

🍍調用 Actions

main.increment()const?message?=?main.getMessage('Vue')

🍍 多個 Store

📟 可以拆分多個 Store 管理不同模塊狀態:

stores
|- user.js
|- product.js

📟 單獨導出每個 Store 并在組件中使用:

import?{?useUserStore?}?from?'@/stores/user'
import?{?useProductStore?}?from?'@/stores/product'?export?default?{setup()?{//?...}
}

📟?Store 可以互相引用:

//?userStore.js
import?{?useProductStore?}?from?'./product'export?const?useUserStore?=?defineStore({//?可以直接使用?productStore
})

📘 Setup Store

🍍 個人比較傾向這種語法

也存在另一種定義 store 的可用語法。與 Vue 組合式 API 的?setup 函數?相似,我們可以傳入一個函數,該函數定義了一些響應式屬性和方法,并且返回一個帶有我們想暴露出去的屬性和方法的對象。

export?const?useCounterStore?=?defineStore('counter',?()?=>?{const?count?=?ref(0)function?increment()?{count.value++}return?{?count,?increment?}
})

🍍 在?Setup Store?中:

  • ref()?就是?state?屬性

  • computed()?就是?getters

  • function()?就是?actions

Setup store 比?Option Store?帶來了更多的靈活性,因為你可以在一個 store 內創建偵聽器,并自由地使用任何組合式函數。不過,請記住,使用組合式函數會讓?SSR?變得更加復雜。

📘 數據持久化

📟?Pinia 默認狀態不持久化,可以通過插件實現持久化:

npm?install?pinia-plugin-persistedstate
import?persistedState?from?'pinia-plugin-persistedstate'const?pinia?=?createPinia()
pinia.use(persistedState)?

📟 在 Store 中配置?persist:

export?const?useUserStore?=?defineStore({persist:?{enabled:?true}?
})?

📟 配置?storage?指定存儲位置:

persist:?{storage:?sessionStorage
}

📘 Pinia 插件

Pinia 生態已有許多插件,可以擴展更多功能:

  • pinia-plugin-persistedstate:數據持久化

  • pinia-plugin-debounce:防抖修改狀態

  • pinia-plugin-pinia-observable:轉換成 Observable

📟?使用插件:

import?piniaPluginPersist?from?'pinia-plugin-persist'pinia.use(piniaPluginPersist)

📟?Devtools

Pinia支持Vue devtools

📘 購物車示例

📟 我們來通過一個購物車的例子看看 Pinia 的用法:

//?store.js
import?{?defineStore?}?from?'pinia'export?const?useCartStore?=?defineStore('cart',?{state:?()?=>?{return?{items:?[]??}},getters:?{total(state)?{return?state.items.reduce((total,?item)?=>?{return?total?+?item.price??},?0)}},actions:?{addItem(item)?{this.items.push(item)},removeItem(id)?{this.items?=?this.items.filter(i?=>?i.id?!==?id)}}
})

📟 在組件中使用:

//?Cart.vueimport?{?useCartStore?}?from?'@/stores/cart'setup()?{const?cart?=?useCartStore()return?{items:?cart.items,total:?cart.total}
}

可以看出代碼非常簡潔直觀。

📘?Pinia 插件

Pinia 插件是一個函數,可以選擇性地返回要添加到 store 的屬性。它接收一個可選參數,即?context

export?function?myPiniaPlugin(context)?{context.pinia?//?用?`createPinia()`?創建的?pinia。?context.app?//?用?`createApp()`?創建的當前應用(僅?Vue?3)。context.store?//?該插件想擴展的?storecontext.options?//?定義傳給?`defineStore()`?的?store?的可選對象。//?...
}

然后用?pinia.use()?將這個函數傳給?pinia

pinia.use(myPiniaPlugin)

插件只會應用于「在?pinia?傳遞給應用后」創建的 store,否則它們不會生效。

📘 實現一個持久化插件

  • getStorage?函數:根據提供的?key?從本地存儲中讀取數據。如果數據無法解析或不存在,則返回?null

  • setStorage?函數:將提供的值轉換為 JSON 格式,并以指定的?key?保存到本地存儲中。

  • DEFAULT_KEY?常量:表示默認的本地存儲鍵名前綴。如果在選項中未提供自定義鍵名,將使用該默認鍵名。

  • Options?類型:定義了插件選項對象的類型,包含?key(本地存儲鍵名前綴)和?needKeepIds(需要進行持久化的 Pinia 存儲的 ID 數組)兩個可選屬性。

  • piniaPlugin` 函數:這是主要的插件函數,它接收一個選項對象,并返回一個用于處理 Pinia 存儲的函數。

import?{?PiniaPluginContext?}?from?"pinia";
import?{?toRaw?}?from?"vue";//?Get?data?from?local?storage?by?key
export?function?getStorage(key)?{const?data?=?localStorage.getItem(key);try?{return?JSON.parse(data);}?catch?(error)?{return?null;}
}//?Set?data?to?local?storage?with?a?key
export?function?setStorage(key,?value)?{const?data?=?JSON.stringify(value);localStorage.setItem(key,?data);
}const?DEFAULT_KEY?=?"pinia";type?Options?=?{key?:?string;needKeepIds?:?string[];
};const?piniaPlugin?=?({?key?=?DEFAULT_KEY,?needKeepIds?=?[]?}:?Options)?=>?{return?(context:?PiniaPluginContext)?=>?{const?{?store?}?=?context;const?data?=?getStorage(`${key}-${store.$id}`);const?subscribeToStore?=?()?=>?{if?(needKeepIds.length?===?0?||?needKeepIds.includes(store.$id))?{setStorage(`${key}-${store.$id}`,?toRaw(store.$state));}};store.$subscribe(subscribeToStore);return?{...data,};};
};export?default?piniaPlugin;

📚? 寫在最后

PiniaVue.js的新一代狀態管理解決方案,由Vue核心團隊開發,其設計理念簡潔直觀,易于上手使用。相較于Vuex,Pinia解決了其過于復雜的問題,提供了更符合Vue理念的狀態管理方式

Pinia通過組合式Store結構,實現了狀態、獲取器、操作行為的邏輯分離。開發者可以輕松地創建Store模塊,在Vue組件內直接使用$store語法訪問狀態,無需導入映射函數,語法非常簡潔。同時Pinia還提供了完整的TypeScript支持,可以為State、Getters、Actions添加類型檢測。

除此之外,Pinia還有模塊熱更新,無需重載頁面即可看到狀態變更,開發調試體驗更佳。同時支持Vue DevTools進行調試,也提供插件機制等拓展功能。總的來說,Pinia是一個非常輕量、易于理解和使用的狀態管理方案,可以極大地提升Vue項目的開發效率。它是Vue生態中簡潔高效管理狀態的首選解決方案。

?

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

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

相關文章

k8s pod啟動報錯: no route to host

k8s pod kuboard啟動報錯 查看pod命令 kubectl get pods -A kubectl get pods --all-namespaces查看報錯pod日志 命令: kubectl logs -f -n namespace nametime"2023-08-09T13:40:3608:00" levelerror msg"不能獲取 AgentEndpointsGet \"http:/…

在 Linux 中使用 systemd 注冊服務

Systemd 是一種現代的 Linux 系統初始化系統和服務管理器。它旨在管理系統服務的初始化、配置和控制。Systemd 的一個關鍵特性是它可以管理服務,這些服務是為系統提供特定功能的后臺進程。在本指南中,我們將探討如何使用 systemd 在 Linux 中注冊服務。 …

【算法基礎20-單調棧】

算法原理: 用單調遞增棧,當該元素可以入棧的時候,棧頂元素就是它左側第一個比它小的元素。 以:3 4 2 7 5 為例,過程如下: 動態模擬過程 題目: 給定一個長度為 N 的整數數列,輸出每個數左邊第一…

Linux 基礎(九)軟件包管理

軟件包管理 概念軟件包管理工具Red Hat 系RPMrpm安裝rpm卸載 YUM(推薦)源倉庫管理常見國內 yum 源更換源(非必須,除非下載速度確實過慢) YUM管理軟件 Debian 系源倉庫管理常見國內 apt 源更換源(非必須&…

postman入門基礎 —— 接口測試流程

一、編寫接口測試計劃 接口測試計劃和功能測試計劃目標一致,都是為了確認需求、確定測試環境、確定測試方法,為設計測試用例做準備,初步制定接口測試進度方案。一般來說,接口測試計劃包括概述、測試資源、測試功能、測試重點、測試…

Flutter 報錯 Could not create task ‘xxx‘.this and base files have different roots

遇到此問題也是先去百度了,有的說改了Gradle版本、gradle-wrapper.properties版本和ext.kotlin_version版本之后解決的,我沒嘗試,我用蹩腳的英語大致讀了一下就不是這樣說的,況且我用有道翻譯了也不是這個意思啊,我不知…

抖音小程序實現less語言編譯樣式

1.在抖音開發工具中搜索擴展less 2. 然后點擊小齒輪選擇擴展設置 3. 然后在擴展設置中選擇在settings.json中編輯# 4. 在settings.json中加入以下這段代碼即可 // Easy LESS配置"less.compile": {"compress": false,//是否壓縮"sourceMap": fal…

前端性能優化:緩存

在快節奏的互聯網時代,網站的加載速度直接影響用戶體驗和業務成功。而緩存作為性能優化的重要手段,可以大幅提升網頁加載速度,減少服務器負擔。本文將為你詳解緩存的使用,幫助你優化前端性能,為用戶呈現更快速、流暢的…

EndNote 21 for Mac(文獻管理軟件) v21.0.1中文版

EndNoter mac是一款參考文獻管理軟件,旨在幫助學術研究者、學生和專業人士有效地管理和引用參考文獻。該軟件提供了許多功能,使用戶可以輕松地組織、搜索和引用各種類型的文獻。 EndNoter mac軟件特點和功能 1. 參考文獻管理:EndNoter允許用…

提高 After Effects 效率的 40 個最佳快捷鍵

After Effects 是運動圖形和視覺效果的強大工具,但它也可能讓人不知所措。擁有如此多的特性和功能,很容易讓人迷失在軟件中。但是,有一種方法可以簡化您的工作流程并提高工作效率 - 使用鍵盤快捷鍵。 After Effects素材文件巨大、占用電腦內…

探索自動化網頁交互的魔力:學習 Selenium 之旅【超詳細】

"在當今數字化的世界中,網頁自動化已經成為了不可或缺的技能。想象一下,您可以通過編寫代碼,讓瀏覽器自動執行各種操作,從點擊按鈕到填寫表單,從網頁抓取數據到進行自動化測試。學習 Selenium,這一功能…

Claude 2、ChatGPT、Google Bard優劣勢比較

?Claude 2: 優勢:Claude 2能夠一次性處理多達10萬個tokens(約7.5萬個單詞)。 tokens數量反映了模型可以處理的文本長度和上下文數量。tokens越多,模型理解語義的能力就越強)。它在法律、數學和編碼等多個…

一百五十二、Kettle——Kettle9.3.0本地連接Hive3.1.2(踩坑,親測有效)

一、目的 由于先前使用的kettle8.2版本在Linux上安裝后&#xff0c;創建共享資源庫點擊connect時頁面為空&#xff0c;后來采用如下方法&#xff0c;在/opt/install/data-integration/ui/menubar.xul文件里添加如下代碼 <menuitem id"file-openZiyuanku" label&…

layui的基本使用-日期控件的業務場景使用入門實戰案例一

效果鎮樓&#xff1b; 1 前端UI層面&#xff1b; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&…

TypeScript教程(五)條件語句,循環,函數

一、條件語句 條件語句基于不同的條件來執行不同的動作 1.if語句&#xff1a;只有當指定條件為true時&#xff0c;使用該語句來執行代碼 2.if...else語句&#xff1a;當條件為true時執行代碼&#xff0c;當條件為else時執行其他代碼 3.if...else if...else語句&#xff1a;…

Shell函數調用

定義一個函數&#xff0c;計算所有參數的和&#xff1a; #!/bin/bashfunction getsum(){local sum0for n in $do((sumn))donereturn $sum }getsum 10 20 55 15 #調用函數并傳遞參數 echo $?運行結果&#xff1a; 100

spss--數據分析Log-Binonial模型

在橫斷面研究中&#xff0c;Log-binomial 模型能夠獲得研究因素與結局變量的關聯強度指標患病率比&#xff08;PR&#xff09;&#xff0c;是一種研究二分類觀察結果與多因素之間關系的重要方法&#xff0c;在醫學研究等領域中得到了廣泛的應用。 采用log-binomial 模型可直接估…

elementUi表單恢復至初始狀態并不觸發表單驗證

elementUi表單恢復至初始狀態并不觸發表單驗證 1.場景再現2.解決方法 1.場景再現 左側是樹形列表&#xff0c;右側是顯示節點的詳情&#xff0c;點擊按鈕應該就是新增一個規則的意思&#xff0c;表單內容是沒有改變的&#xff0c;所以就把需要把表單恢復至初始狀態并不觸發表單…

大語言模型(LLM)與 Jupyter 連接起來了

現在&#xff0c;大語言模型&#xff08;LLM&#xff09;與 Jupyter 連接起來了&#xff01; 這主要歸功于一個名叫 Jupyter AI 的項目&#xff0c;它是官方支持的 Project Jupyter 子項目。目前該項目已經完全開源&#xff0c;其連接的模型主要來自 AI21、Anthropic、AWS、Co…

MSP432自主開發筆記6:定時器多通道捕獲多條編碼器線脈沖數

所用開發板&#xff1a;MSP432P401R 今日在此更新一下編碼器測速的定時器捕獲寫法&#xff0c;之前學習時竟然忘記更新了~~ 本文講如何用定時器的通道來 捕獲編碼器的脈沖信號數量&#xff0c;不提供速度路程的計算方式&#xff0c; 文章提供源碼&#xff0c;測試工程下載&a…