vue3學習教程第四十節(pinia的用法注意事項解構store)

pinia 主要包括以下五部分,經常用到的是 store、state、getters、actions

在這里插入圖片描述
以下使用說明,注意事項,僅限于 vue3 setup 語法糖中使用,若使用選項式 API 請直接查看官方文檔:

一、前言:

pinia 是為了探索 vuex 下一次迭代是要實現那些功能用途,pinia 已實現vuex5 的絕大部分功能;
并且與 Vuex 相比,Pinia 提供了一個更簡單的 API,具有更少的規范,提供了 Composition-API 風格的 API,最重要的是,在與 TypeScript 一起使用時具有可靠的類型推斷支持;

二、pinia 與vuex <= 4.x 的差異

1、****mutations 不再存在。他們經常被認為是 非常 冗長。他們最初帶來了 devtools 集成,但這不再是問題。
**2、**無需創建自定義復雜包裝器來支持 TypeScript,所有內容都是類型化的,并且 API 的設計方式盡可能利用 TS 類型推斷。
**3、**不再需要注入、導入函數、調用函數、享受自動完成功能
4、****無需動態添加 Store,默認情況下它們都是動態的,您甚至都不會注意到。請注意,您仍然可以隨時手動使用 Store 進行注冊,但因為它是自動的,您無需擔心。
**5、**不再有 modules 的嵌套結構。您仍然可以通過在另一個 Store 中導入和 使用 來隱式嵌套 Store,但 Pinia 通過設計提供平面結構,同時仍然支持 Store 之間的交叉組合方式。 您甚至可以擁有 Store 的循環依賴關系。
**6、**沒有 命名空間模塊。鑒于 Store 的扁平架構,“命名空間” Store 是其定義方式所固有的,您可以說所有 Store 都是命名空間的。

三、store:

store:它持有未綁定到您的組件樹的狀態和業務邏輯托管全局狀態
像一個始終存在并且每個人都可以讀取和寫入的組件;
主要有三個方法:state、getters、actions,類似于組件中數據、計算屬性、方法
用于存儲不同組件直接共享的數據實例方法,以及頁面之間需要保留的數據狀態;

// count.ts 文件
<script lang="ts">
import { defineStore } from 'pinia'
// defineStore 的第一個參數是 唯一標識ID 用于關聯 devtool 調試使用
// 第二個參數是 一個對象 包含 state、actions,gettes
// 聲明的 屬性useCount  建議以 use 開頭,保持書寫的統一性
export const useCount = defineStore('count', {state:() => {return{}},actions: {},gettes: {}
})
</script>

在組件中使用:
注意:若 解構使用 store 中的屬性 方法,需要使用 storeToRefs() 或者 toRefs() 讓其保持響應式

<script setup>import { toRefs } from 'vue'import { storeToRefs } from 'pinia'import { useCount } from '@/store'const count = useCount()// 這樣解構獲取 store 中屬性方法,會丟失響應式const { num } = count// 1、使用 pinia自帶的storeToRefs(), 將store中屬性轉換為 ref 數據以保持響應式const { doubleCountAdd } = storeToRefs(count)console.log('=doubleCountAdd==', doubleCountAdd)// 2、使用vue3 的 toRefs() 轉化為 ref 響應式數據const { doubleCount }  = toRefs(count)console.log('=doubleCount==', doubleCount)
</script>

四、state:

state: 類似組件中的 data(){return{}},但是在 pinia 中的state 建議書寫為:
使用箭頭函數,用于完整推斷類型

state: () => {return {name: 'Andy',num: 0}
}

組件中使用:

<script setup lang='ts'>import { useCount } from '@/store'const count = useCount()// 1、直接調用或者修改console.log(count.name)// 2、通過$patch({}) 同時修改多個屬性count.$patch({name: '刺客',num++})// 或者傳入一個回調函數count.$patch((state) => {state.count = '4'})
</script>

五、actions:
actions 類似組件中的methods,可以在組件中直接調用里面的方法

// count.ts 文件
<script lang="ts">
export const useCount = defineStore('count', {state: () => {return{name: 'Andy',num: 0}},actions: {add() {// 直接通過 this 調用 state 中的屬性,也可以調用其他 store 中屬性,只需引入即可this.num++},},
})
</script>

組件中可以直接通過 調用 add() 方法來修改 num

<script setup>import { useCount } from '@/store'const count = useCount()count.add() 
</script>

六、gettes:

相當于組件中的 computed 計算屬性:

// count.ts 文件
<script lang='ts'>
import { defineStore } from 'pinia'
export const useCount = defineStore('count', {state: () => {return{name: 'Andy',num: 0}},getters: {// 相當于組件中的 計算屬性doubleCount(state): number {return  state.num * 2},doubleCountAdd():number {// 可以在其他 getter 中直接調用另一個getterreturn this.doubleCount + 1},// 接收額外參數時,需要返回一個函數處理doubleCountAdd2:(state) => {return (num:number):number => state.num * num} }
})
</script>

在組件中可以直接使用

<script setup>
import { useCount } from '@/store'
const count = useCount()
console.log(count.doubleCountAdd)
count.$patch({name: '刺客',num: 3
})const doubleCountAdd2 = count.doubleCountAdd2(8)// 上面state.num 值為 3, 傳入 額外參數 為8,故最后為  3* 8 = 24
</script>

完整代碼如下:

// count.ts 文件
import { defineStore } from 'pinia'
// 通過 defineStore 定義的 store 第一個參數 count 是唯一的id,用于鏈接devtool
// 定義 一個id 為count的 store export const useCount = defineStore('count', {state: () => {return{name: 'Andy',num: 0}},actions: {add() {this.num++},},// getter 只會依賴狀態getters: {// 相當于組件中的 計算屬性doubleCount(state): number {return  state.num * 2},doubleCountAdd():number {// 可以在其他 getter 中直接調用另一個getterreturn this.doubleCount + 1},// 接收額外參數,返回一個函數處理doubleCountAdd2:(state) => {return (num:number):number => state.num * num} },// 若不需要額外配置,// persist: true,// 額外配置persist: {// key: 'piniaStore', //存儲名稱// storage: sessionStorage, // 存儲方式 默認存儲在localStorage// paths: ['name'], //指定 state 中哪些數據需要被持久化。[] 表示不持久化任何狀態,undefined 或 null 表示持久化整個 state}
})

請添加圖片描述

// main.ts 文件
import { createApp } from 'vue'
import { createPinia } from 'pinia'
const app = createApp(App)
const pinia = createPinia()
//導入pinia 持久化 插件
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
pinia.use(piniaPluginPersistedstate)
app.use(pinia)
app.mount('#app')

// 單文件組件 myPinia/index.vue 文件中使用

<template><div class="myPinia">This is a text demo of the pinia.<hr><div>count.num: {{ count.num }}</div><div>count.doubleCount: {{ count.doubleCount }}</div><div>count.doubleCountAdd: {{ count.doubleCountAdd }}</div><div>num: {{ num }}</div><div>doubleCountAdd: {{ doubleCountAdd }}</div><div>doubleCount: {{ doubleCount }}</div><div>doubleCountAdd2: <span>{{ doubleCountAdd2 }}</span></div><button @click="count.add()">add</button></div>
</template><script setup>
import { toRefs } from 'vue'
import { storeToRefs } from 'pinia'
import { useCount } from '@/store'
const count = useCount()
console.log('==count==', count)
// 解構獲取 store 中屬性方法,不是響應式
const { num } = count
// 1、使用 pinia自帶的storeToRefs(), 將store中屬性轉換為 ref 數據以保持響應式
const { doubleCountAdd } = storeToRefs(count)
console.log('=doubleCountAdd==', doubleCountAdd)
// 2、使用vue3 的 toRefs() 轉化為 ref 響應式數據
const { doubleCount }  = toRefs(count)
console.log('=doubleCount==', doubleCount)
// 通過 $patch 修改state 中多個屬性
count.$patch({name: '刺客',num: 3})// 傳入額外參數const doubleCountAdd2 = count.doubleCountAdd2(8) // 上面state.num 值為 3, 傳入 額外參數 為8,故最后為  3* 8 = 24
</script><style lang="scss" scoped>div{font-size: 18px;color: #333;span {color: red;}
}
</style>

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

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

相關文章

03_意向鎖

意向鎖&#xff08;Intention Lock&#xff09; 文章目錄 意向鎖&#xff08;Intention Lock&#xff09;簡介類型原理意向鎖加鎖流程鎖兼容矩陣使用場景示例總結擴展&#xff1a;意向鎖和共享鎖排他鎖的加鎖流程假設的場景和前提已加鎖的情況新的加鎖請求加鎖流程鎖的兼容性矩…

力扣算法-9.回文數

9.回文數 個人思考 首先從示例2可以看出符號也算在整數這個整體內&#xff0c;可以先判斷整數若為負數則返回false其次很容易就會想到遍歷兩次&#xff0c;從頭以及從尾&#xff0c;遍歷得到的結果相比較&#xff0c;相同則為回文數 public class Alee9 {public static void …

OpenResty的安裝及高級使用

OpenResty的安裝及高級使用 1. OpenResty的安裝1.1. 二進制版本安裝1.2. 源碼方式安裝2. 日志打印header和body3. 替換body體字符串1. OpenResty的安裝 OpenResty的中文站點:https://openresty.org/cn/ ?? OpenResty的英文站點:https://openresty.org/en/ 1.1. 二進制版本…

【linux基礎】后臺執行命令,防止中斷nohup

前臺運行與后臺運行&#xff1a;前臺運行&#xff0c;就是運行過程一直在屏幕輸出。 目的&#xff1a;1. 提交至后臺 & 2.防止中斷 nohup 1.終端上不要有大量的log出現&#xff0c;后臺運行 (1) & 程序后臺運行 #腳本、修改權限 vi test.sh chmod 777 test.sh#后…

ArcGIS Pro SDK (三)Addin控件 3 事件功能類

22 ArcGIS Pro 放置處理程序 目錄 22 ArcGIS Pro 放置處理程序22.1 添加控件22.2 Code 23 ArcGIS Pro 構造工具23.1 添加控件23.2 Code 24 ArcGIS Pro 表構造工具24.1 添加控件24.2 Code 22.1 添加控件 22.2 Code 放置處理程序可以實現文件拖動放置、TreeVIew、ListBox等控件拖…

極速安裝的藝術:使用 Mamba 革新你的 Conda 環境管理

標題&#xff1a;極速安裝的藝術&#xff1a;使用 Mamba 革新你的 Conda 環境管理 引言 在數據科學和機器學習領域&#xff0c;Conda 是一個廣受歡迎的包管理器和環境管理器。然而&#xff0c;隨著項目規模的增長&#xff0c;Conda 在處理大量依賴時可能會顯得緩慢。Mamba&am…

水下機器人ArduSub 固件常用參數

目前最新版的ArduSub 固件是4.1.2&#xff0c;本文的參數是基于這個版本的固件 SURFACE_DEPTH&#xff1a;水表深度讀數 當水下機器人在水面時&#xff0c;水壓傳感器將讀取的深度數據&#xff08;以厘米為單位&#xff09;&#xff0c;這個相當于抵消零偏 單位&#xff1a;…

ArcGIS批量設置多圖層的三調地類符號

?? 點擊下方全系列課程學習 點擊學習—>ArcGIS全系列實戰視頻教程——9個單一課程組合系列直播回放 01需求說明 這次我們要實現的是將多個地類圖層批量符號化。比如將多個三調地類圖斑批量符號化。 ? 有什么好方法呢 &#xff1f; 我們可以將一個圖層利用三調符號庫進行…

android 從應用中打開第三方應用

打開第三方應用之前需要先判斷該應用是否存在&#xff0c;代碼如下&#xff1a; public boolean isAppInstalled(Context context, String packageName) {PackageManager packageManager context.getPackageManager();try {packageManager.getPackageInfo(packageName, Packa…

Stable Diffusion 3 正式開源,超強文生圖模型 SD3-M 上線,趕緊來試試吧!

前言 我們都知道 Stable Diffusion 3 是一款強大的文生圖模型&#xff0c;擁有20億參數&#xff0c;因其高效的推理速度和卓越的生成效果而備受矚目。 近日&#xff0c;Stability AI在推特上宣布正式開源了 Stable Diffusion 3 Medium&#xff08;SD3-M&#xff09; 權重&…

Dooprime外匯:如何高效規劃家庭理財?從哪里開始?

摘要&#xff1a; 家庭理財是每個家庭都必須面對的重要課題。合理的理財規劃不僅能提高家庭的生活質量&#xff0c;還能為未來的生活提供保障。然而&#xff0c;許多人在面對復雜的理財選項和信息時感到無從下手。本文將從不同角度詳細分析如何進行高效的家庭理財規劃&#xf…

【Playwright+Python】手把手帶你寫一個自動化測試腳本

如何使用代理方式打開網頁 在 playwright.chromium.launch() 中傳入 proxy 參數即可&#xff0c;示例代碼如下&#xff1a; 1、同步寫法&#xff1a; from playwright.sync_api import sync_playwrightproxy {server: http:/127.0.0.1:8080}def run():with sync_playwright(…

Kafka精要

Apach Kafka 是一款分布式流處理框架&#xff0c;用于實時構建流處理應用。它有一個核心 的功能廣為人知&#xff0c;即 作為企業級的消息引擎被廣泛使用 kafka設計 Kafka 將消息以 topic 為單位進行歸納 將向 Kafka topic 發布消息的程序成為 producers. 將預訂 topics 并消…

Linux內核開發-編寫一個proc文件

0.前言 上一章&#xff08;點擊返回上一章&#xff09;完成了一個內核模塊的編寫&#xff0c;實現了在內核運行時的動態加載和卸載。 在模塊的開發調測過程中或者模塊運行過程中&#xff0c;可能需要打印內核模塊的變量的值或者想要動態開關模塊的運行日志打印&#xff0c;那么…

小盒子跑大模型!基于算能BM1684X+FPGA平臺實現大模型私有化部署

當前&#xff0c;在人工智能領域&#xff0c;大模型在豐富人工智能應用場景中扮演著重要的角色&#xff0c;經過不斷的探索&#xff0c;大模型進入到落地的階段。而大模型在落地過程中面臨兩大關鍵難題&#xff1a;對龐大計算資源的需求和對數據隱私與安全的考量。為應對這些挑…

springcloud-gateway include-expression 配置說明

在開發過程中遇到的一些配置問題&#xff0c;記錄下來以供參考 spring-gateway版本是2.2.9-release,使用的spring cloud dependence 是 Hoxton.SR12 在依賴eureka 服務發現并自動將發現服務器加入到router中的時候&#xff0c;需要指定對應的服務進行添加&#xff0c;根據文檔…

postman國內外競爭者及使用詳解分析

一、postman簡介 Postman 是一款廣泛使用的 API 開發和測試工具&#xff0c;適用于開發人員和測試人員。它提供了一個直觀的界面&#xff0c;用于發送 HTTP 請求、查看響應、創建和管理 API 測試用例&#xff0c;以及自動化 API 測試工作流程。以下是 Postman 的主要功能和特點…

linux的CP指令

實現 CP 指令 src 源文件 des 目標文件 執行流程&#xff1a; 打開源文件&#xff08; src &#xff09; open 打開目標文件&#xff08; des &#xff09; open 寫入目標文件 write 讀取 src 文件到緩存數組 read 關閉目標文件和源文件 close ./a.out src.c de…

開源網安參與編制的《代碼大模型安全風險防范能力要求及評估方法》正式發布

?代碼大模型在代碼生成、代碼翻譯、代碼補全、錯誤定位與修復、自動化測試等方面為研發人員帶來了極大便利的同時&#xff0c;也帶來了對安全風險防范能力的挑戰。基于此&#xff0c;中國信通院依托中國人工智能產業發展聯盟&#xff08;AIIA&#xff09;&#xff0c;聯合開源…

chmod,chown命令

一.chmod命令 1.chmod命令的作用 我們使用chmod命令來修改文件和文件夾的權限信息&#xff08;只有文件和文件夾的所屬用戶和root用戶可以修改該文件或文件夾的權限信息&#xff09; 2.chmod命令的語法 chmod [-R] 我們將要賦予用戶/用戶組/其他用戶的權限 要修改的文件/文件…